求助,关于hal 串口中断接收接收中断

查看: 28135|回复: 71
我崩溃了,STM32 UCOS 串口接收中断,死机,临出货前求救!
之前没有应用串口通讯功能的设备完全没有问题,但添加了串口接收后,程序会跑到HardFaultException(),整机死机,屏蔽掉NVIC_Configuration(),死机时间会延长到几个小时甚至十几个小时,如果不屏蔽,快的话几分钟就死了。
补充一点,如果不开UCOS,同样的中断处理是不会死的。
小弟拜谢了,被这个问题折腾好久了,没招了,求救
void NVIC_Configuration(void)
& & //NVIC_InitTypeDef NVIC_InitS
&&#ifdef&&VECT_TAB_RAM&&
& & /* Set the Vector Table base location at 0x */
& & NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
&&#else&&/* VECT_TAB_FLASH&&*/
& & /* Set the Vector Table base location at 0x */
& & NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);& &
& & /* Configure the Priority Group to 2 bits */
& & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);&&
以下是用到的两个中断的配置,一个是定时器中断,一个是串口接收中断:
&&NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQC
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& & NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQC
& & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
& & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
中断向量表:
const intvec_elem __vector_table[] =
&&{ .__ptr = __sfe( &CSTACK& ) },
&&__iar_program_start,
&&NMIException,
&&HardFaultException,
&&MemManageException,
&&BusFaultException,
&&UsageFaultException,
&&0, 0, 0, 0,& && && && &/* Reserved */
&&SVCHandler,
&&DebugMonitor,
&&0,& && && && && && && & /* Reserved */
//&&PendSVC,
&&OS_CPU_PendSVHandler,
//&&SysTickHandler,
&&OS_CPU_SysTickHandler,
&&WWDG_IRQHandler,
&&PVD_IRQHandler,
&&TAMPER_IRQHandler,
&&RTC_IRQHandler,
&&FLASH_IRQHandler,
&&RCC_IRQHandler,
&&EXTI0_IRQHandler,
&&EXTI1_IRQHandler,
&&EXTI2_IRQHandler,
&&EXTI3_IRQHandler,
&&EXTI4_IRQHandler,
&&DMA1_Channel1_IRQHandler,
&&DMA1_Channel2_IRQHandler,
&&DMA1_Channel3_IRQHandler,
&&DMA1_Channel4_IRQHandler,
&&DMA1_Channel5_IRQHandler,
&&DMA1_Channel6_IRQHandler,
&&DMA1_Channel7_IRQHandler,
&&ADC1_2_IRQHandler,
&&USB_HP_CAN_TX_IRQHandler,
&&USB_LP_CAN_RX0_IRQHandler,
&&CAN_RX1_IRQHandler,
&&CAN_SCE_IRQHandler,
&&EXTI9_5_IRQHandler,
&&TIM1_BRK_IRQHandler,
&&TIM1_UP_IRQHandler,
&&TIM1_TRG_COM_IRQHandler,
&&TIM1_CC_IRQHandler,
&&TIM2_IRQHandler,
&&TIM3_IRQHandler,
&&TIM4_IRQHandler,
&&I2C1_EV_IRQHandler,
&&I2C1_ER_IRQHandler,
&&I2C2_EV_IRQHandler,
&&I2C2_ER_IRQHandler,
&&SPI1_IRQHandler,
&&SPI2_IRQHandler,
&&USART1_IRQHandler,
&&USART2_IRQHandler,
&&USART3_IRQHandler,
&&EXTI15_10_IRQHandler,
&&RTCAlarm_IRQHandler,
&&USBWakeUp_IRQHandler,
&&TIM8_BRK_IRQHandler,
&&TIM8_UP_IRQHandler,
&&TIM8_TRG_COM_IRQHandler,
&&TIM8_CC_IRQHandler,
&&ADC3_IRQHandler,
&&FSMC_IRQHandler,
&&SDIO_IRQHandler,
&&TIM5_IRQHandler,
&&SPI3_IRQHandler,
&&UART4_IRQHandler,
&&UART5_IRQHandler,
&&TIM6_IRQHandler,
&&TIM7_IRQHandler,
&&DMA2_Channel1_IRQHandler,
&&DMA2_Channel2_IRQHandler,
&&DMA2_Channel3_IRQHandler,
&&DMA2_Channel4_5_IRQHandler,
串口中断接收程序:
void UART4_IRQHandler(void)
& & u8 irq_
& & OS_CPU_SR&&cpu_
& & OS_ENTER_CRITICAL();& && && && && && && && && && && && &&&
& & OSIntNesting++;
& & OS_EXIT_CRITICAL();
& & if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
& & {& && &&&
& && && & irq_data = USART_ReceiveData(UART4);&&
& && &&&USART_ClearITPendingBit(UART4, USART_IT_RXNE);
& & OSIntExit();
回复【楼主位】max0147
-----------------------------------------------------------------------
或许我能给你解决,呵呵呵
回复【1楼】shuangbang
-----------------------------------------------------------------------
肯定是你自己程序的问题
楼上的知道的话就别卖关子了,我能体会楼主的心情。
楼主好好检查下串口接收中断程序,看看是否有内存冲突。
顺便帮顶。
恩,我也怀疑过是程序问题,但是不跑UCOS就是正常的。请shuangbang朋友指教下
=======================================
不懂,帮顶一下
st的example有没有跑ucos的串口例子?可做一下对比测试。
听说串口4有问题
这里有一个相关帖子:
OPELC思蜕盟 & 技术讨论区 & 关于配置stm32其它两个串口(UART4、UART5),乱码呀
返回列表 发帖&&
qhdhaina 发短消息
qhdhaina 当前离线
UID3739 帖子15 精华0 积分43 基本分43 分 技术分0 分 阅读权限10 在线时间12 小时 注_册时间 最后登录&&
楼主位 跳转到 & 倒序看帖 打印 字体大小: tT&&发表于
10:20 | 只看该作者
关于配置stm32其它两个串口(UART4、UART5),乱码呀
求助:各位高手有没有用过UART4、UART5的,我的怎么可以接收,但发送乱码。
谢谢!请帮忙指点一下。
StmFans思蜕盟论坛松鼠3.0 万能索引贴! 松鼠3.0 快速资料目录!
收藏 分享&&
win2000_li 发短消息
win2000_li 当前离线
UID3522 帖子359 精华0 积分802 基本分802 分 技术分0 分 阅读权限30 在线时间122 小时 注_册时间 最后登录&&
2楼&&发表于
13:41 | 只看该作者
我也没有用过,帮您顶一个。。。。。。。。。。。。。。。。。。。。。
顺便学习一下。。。
思蜕盟淘宝销售处——迷你打铁铺 !豆皮、松鼠 开发板、仿真器、STM32全系芯片!欢迎光临!
qhdhaina 发短消息
qhdhaina 当前离线
UID3739 帖子15 精华0 积分43 基本分43 分 技术分0 分 阅读权限10 在线时间12 小时 注_册时间 最后登录&&
3楼&&发表于
14:21 | 只看该作者
谢谢楼上的!
怎么都没有用过吗?
zh5h 发短消息
zh5h 当前离线
UID919 帖子42 精华0 积分128 基本分128 分 技术分0 分 阅读权限20 在线时间16 小时 注_册时间 最后登录&&
4楼&&发表于
15:29 | 只看该作者
UART4、UART5使用没有问题
一定是你的软件或硬件那出了问题
你说详细一点
思蜕盟淘宝销售处——迷你打铁铺 !豆皮、松鼠 开发板、仿真器、STM32全系芯片!欢迎光临!
qhdhaina 发短消息
qhdhaina 当前离线
UID3739 帖子15 精华0 积分43 基本分43 分 技术分0 分 阅读权限10 在线时间12 小时 注_册时间 最后登录&&
5楼&&发表于
13:05 | 只看该作者
硬件应该没有问题,串口2、串口3都是用的同一个RS232。
只有bit7发送的是0,但电脑串口软件显示是1。
软件如下:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name& && && & : main.c
* Author& && && && & : MCD Application Team
* Version& && && && &: V2.0.1
* Date& && && && && &: 06/13/2008
* Description& && &&&: Main program body
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include &stm32f10x_lib.h&
#include &platform_config.h&
/* Private typedef -----------------------------------------------------------*/
typedef enum { FAILED = 0, PASSED = !FAILED} TestS
/* Private define ------------------------------------------------------------*/
#define TxBufferSize& &(countof(TxBuffer))
/* Private macro -------------------------------------------------------------*/
#define countof(a)& &(sizeof(a) / sizeof(*(a)))
/* Private variables ---------------------------------------------------------*/
USART_InitTypeDef USART_InitS
u8 TxBuffer[] = &Buffer Send from USART1 to USART2 using Flags&;
u8 RxBuffer[TxBufferSize];
u8 TxCounter = 0, RxCounter = 0;
vu8 TxCounter2;
u8 RxBuffer2[20];
u8 TxBuffer2[20];
u8 _rxd_int2;
vu16 ADC_InjectedConvertedValueTab[32];
TestStatus TransferStatus = FAILED;&&
ErrorStatus HSEStartUpS
/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength);
u8 index = 0;
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name&&: main
* Description& & : Main program
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
int main(void)
#ifdef DEBUG
&&debug();
&&/* System Clocks Configuration */
&&RCC_Configuration();
&&/* NVIC configuration */
&&NVIC_Configuration();
&&/* Configure the GPIO ports */
&&GPIO_Configuration();
/* USART1 and USART2 configuration ------------------------------------------------------*/
&&/* USART and USART2 configured as follow:
& && &&&- BaudRate = 115200 baud&&
& && &&&- Word Length = 8 Bits
& && &&&- One Stop Bit
& && &&&- Even parity
& && &&&- Hardware flow control disabled (RTS and CTS signals)
& && &&&- Receive and transmit enabled
&&USART_InitStructure.USART_BaudRate = 9600;
&&USART_InitStructure.USART_WordLength = USART_WordLength_8b;
&&USART_InitStructure.USART_StopBits = USART_StopBits_1;
&&USART_InitStructure.USART_Parity = USART_Parity_E
&&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
&&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
&&/* Configure USART5 */
&&USART_Init(UART5, &USART_InitStructure);
&&/* Enable the USART5 */
&&USART_Cmd(UART5, ENABLE);
&&USART_ITConfig(UART5, USART_IT_RXNE, DISABLE);
&&while(TxCounter & TxBufferSize) {& &
& & USART_SendData(UART5, TxBuffer[TxCounter++]);& & /* Send one byte from USART1 to USART2 */
& & while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET) {}& & /* Loop until the end of transmit */
&&while (1)
/*******************************************************************************
* Function Name&&: RCC_Configuration
* Description& & : Configures the different system clocks.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void RCC_Configuration(void)
&&/* RCC system reset(for debug purpose) */
&&RCC_DeInit();
&&/* Enable HSE */
&&RCC_HSEConfig(RCC_HSE_ON);
&&/* Wait till HSE is ready */
&&HSEStartUpStatus = RCC_WaitForHSEStartUp();
&&if(HSEStartUpStatus == SUCCESS)
& & /* Enable Prefetch Buffer */
& & FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
& & /* Flash 2 wait state */
& & FLASH_SetLatency(FLASH_Latency_2);
& & /* HCLK = SYSCLK */
& & RCC_HCLKConfig(RCC_SYSCLK_Div1);
& & /* PCLK2 = HCLK */
& & RCC_PCLK2Config(RCC_HCLK_Div1);
& & /* PCLK1 = HCLK/2 */
& & RCC_PCLK1Config(RCC_HCLK_Div2);
& & /* PLLCLK = 8MHz * 9 = 72 MHz */
& & RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
& & /* Enable PLL */
& & RCC_PLLCmd(ENABLE);
& & /* Wait till PLL is ready */
& & while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
& & /* Select PLL as system clock source */
& & RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
& & /* Wait till PLL is used as system clock source */
& & while(RCC_GetSYSCLKSource() != 0x08)
&&/* Enable USART1, GPIOA, GPIOD and AFIO clocks */
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
&&/* Enable USART5 clock */
&&RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
/*******************************************************************************
* Function Name&&: GPIO_Configuration
* Description& & : Configures the different GPIO ports.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void GPIO_Configuration(void)
&&GPIO_InitTypeDef GPIO_InitS
& & /* Configure USART1 Tx (PC.12) as alternate function push-pull */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
&&GPIO_Init(GPIOC, &GPIO_InitStructure);
& & /* Configure USART1 Rx (PD.2) as input floating */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
&&GPIO_Init(GPIOD, &GPIO_InitStructure);
/*******************************************************************************
* Function Name&&: NVIC_Configuration
* Description& & : Configures Vector Table base location.
* Input& && && & : None
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void NVIC_Configuration(void)
&&NVIC_InitTypeDef NVIC_InitS
#ifdef&&VECT_TAB_RAM&&
&&/* Set the Vector Table base location at 0x */
&&NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else&&/* VECT_TAB_FLASH&&*/
&&/* Set the Vector Table base location at 0x */
&&NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);& &
&&/* Configure the NVIC Preemption Priority Bits */&&
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
&&/* Enable the USART4 Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQC
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
&&/* Enable the USART5 Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQC
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
#ifdef&&DEBUG
/*******************************************************************************
* Function Name&&: assert_failed
* Description& & : Reports the name of the source file and the source line number
*& && && && && && &where the assert_param error has occurred.
* Input& && && & : - file: pointer to the source file name
*& && && && && && &- line: assert_param error line source number
* Output& && && &: None
* Return& && && &: None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
&&/* User can add his own implementation to report the file name and line number,
& &&&ex: printf(&Wrong parameters value: file %s on line %d\r\n&, file, line) */
&&/* Infinite loop */
&&while (1)
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
zh5h 发短消息
zh5h 当前离线
UID919 帖子42 精华0 积分128 基本分128 分 技术分0 分 阅读权限20 在线时间16 小时 注_册时间 最后登录&&
6楼&&发表于
13:24 | 只看该作者
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
复制代码把他改成USART_InitStructure.USART_WordLength = USART_WordLength_9b;
有校验位WordLength应该是9
思蜕盟淘宝销售处——迷你打铁铺 !豆皮、松鼠 开发板、仿真器、STM32全系芯片!欢迎光临!
qhdhaina 发短消息
qhdhaina 当前离线
UID3739 帖子15 精华0 积分43 基本分43 分 技术分0 分 阅读权限10 在线时间12 小时 注_册时间 最后登录&&
7楼&&发表于
13:31 | 只看该作者
谢谢楼上的!这样可以接收,但是为什么接收不到第一个字节呢?
qhdhaina 发短消息
qhdhaina 当前离线
UID3739 帖子15 精华0 积分43 基本分43 分 技术分0 分 阅读权限10 在线时间12 小时 注_册时间 最后登录&&
8楼&&发表于
13:43 | 只看该作者
问题已经解决,串口使能后,在发送前应该加
while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET) {}
就可以接收到第一个字节,但是串口1、2、3 时
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
串口5 改为 USART_InitStructure.USART_WordLength = USART_WordLength_9b;
这是为什么 呢?
win2000_li 发短消息
win2000_li 当前离线
UID3522 帖子359 精华0 积分802 基本分802 分 技术分0 分 阅读权限30 在线时间122 小时 注_册时间 最后登录&&
9楼&&发表于
14:08 | 只看该作者
学习。。。。。。。。。。。。。。。。。
zh5h 发短消息
zh5h 当前离线
UID919 帖子42 精华0 积分128 基本分128 分 技术分0 分 阅读权限20 在线时间16 小时 注_册时间 最后登录&&
10楼&&发表于
13:39 | 只看该作者
问题已经解决,串口使能后,在发送前应该加
while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET) {}
就可以接收到第一个字节,但是串口1、2、3 时
USART_InitStructure.USART_WordLength = USART_WordLengt ...
qhdhaina 发表于
关于问什么是9bit数据长度,你可以仔细看一下STM32关于串口部分的资料!
数据位8+1个校验位=9bit长度
如果设置成无校验位,那么就应该是8bit数据长度(只有8bit数据位)
binglin 发短消息
binglin (炳哥哥)当前离线
UID4 帖子6084 精华14 积分19469 基本分14129 分 技术分534 分 阅读权限200 在线时间2635 小时 注_册时间 最后登录&&
思蜕盟后勤
11楼&&发表于
11:42 | 只看该作者
顶!我还没有用过有5个串口的STM32呢。
henry_wu001 发短消息
henry_wu001 当前离线
UID4562 帖子6 精华0 积分49 基本分49 分 技术分0 分 阅读权限10 在线时间5 小时 注_册时间 最后登录&&
12楼&&发表于
11:16 | 只看该作者
怎么没有uart4,5的 pin脚设定呢?
思蜕盟淘宝销售处——迷你打铁铺 !豆皮、松鼠 开发板、仿真器、STM32全系芯片!欢迎光临!
binglin 发短消息
binglin (炳哥哥)当前离线
UID4 帖子6084 精华14 积分19469 基本分14129 分 技术分534 分 阅读权限200 在线时间2635 小时 注_册时间 最后登录&&
思蜕盟后勤
13楼&&发表于
11:38 | 只看该作者
原来楼主打开了“USART_Parity_Even”偶校验模式。
多谢楼上的转帖,但我认为跟串口参数设置相关性不大,因为不开UCOS,收发功能都是完全正常的。
这个情况应该是你的CSTACK设置小了,改大点,屏蔽掉NVIC_Configuration(),也就不配置成嵌套中断,对CSTACK的需求就会少,有可能不会覆盖掉有用的数据
回复【楼主位】max0147
-----------------------------------------------------------------------
我要分析你的代码,问题应该不出在你贴出来的那几段,加我qq,我也是运行ucos的,跑的是机器控制器,你代码给我我帮你找错。
多谢shuangbang ,已加QQ
回yugen ,我将堆,栈都增大了2倍,现在在测试,如下:
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile=&$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml& */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__& &= 0x ;
define symbol __ICFEDIT_region_ROM_end__& &&&= 0x0807FFFF;
define symbol __ICFEDIT_region_RAM_start__& &= 0x;
define symbol __ICFEDIT_region_RAM_end__& &&&= 0x2000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__& &= 0x800;
define symbol __ICFEDIT_size_heap__& &&&= 0x400;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region& &= mem:[from __ICFEDIT_region_ROM_start__& &to __ICFEDIT_region_ROM_end__];
define region RAM_region& &= mem:[from __ICFEDIT_region_RAM_start__& &to __ICFEDIT_region_RAM_end__];
define block CSTACK& & with alignment = 8, size = __ICFEDIT_size_cstack__& &{ };
define block HEAP& && &with alignment = 8, size = __ICFEDIT_size_heap__& &&&{ };
initialize by copy { readwrite };
do not initialize&&{ section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region& &{ readonly };
place in RAM_region& &{ readwrite,
& && && && && && && && &block CSTACK, block HEAP };
我也遇到过,不过不是用在USART上,这方面好像就是栈太小了!不过也不排除其它的原因!
回复【13楼】TigerRay&&
-----------------------------------------------------------------------
改过堆,栈后,现在7分钟,死了 & & & &&&
我所用到的两个中断,TIM2与UART4,
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQC
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& & NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQC
& & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
& & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
我发现设置成相同的抢占优先级,例如NVIC_IRQChannelPreemptionPriority 都= 0;NVIC_IRQChannelSubPriority 不同,死机的时间会延长;
抢占优先级不同的话,死机就很快。
你没列出UART4的所有相关初始化设置程序。补全吧!
我是这样设置的:用NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);即配置成没有子优先级。然后部分中断优先级相同,部分不同。
你这样检查下:即在复位程序开始时,将CSTACK全部设置成0xAA,死机时再检查下CSTACK,看看是否全部使用了。这样可判断栈是否过小问题。
回复【16楼】ypt1980&&
你没列出uart4的所有相关初始化设置程序。补全吧!
-----------------------------------------------------------------------
void UART4_Configuration(void)
& & USART_InitTypeDef USART_InitS
& & //Configure and enable USART4 interrupt
& & NVIC_InitTypeDef NVIC_InitS
& & NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQC
& & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
& & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
& & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & NVIC_Init(&NVIC_InitStructure);
& & USART_InitStructure.USART_BaudRate = 57600;
& & USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& & USART_InitStructure.USART_StopBits = USART_StopBits_1;
& & USART_InitStructure.USART_Parity = USART_Parity_No;
& & USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
& & USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
& & USART_InitStructure.USART_Clock = USART_Clock_D
& & USART_InitStructure.USART_CPOL = USART_CPOL_L
& & USART_InitStructure.USART_CPHA = USART_CPHA_2E
& & USART_InitStructure.USART_LastBit = USART_LastBit_D
& & USART_Init(UART4, &USART_InitStructure);
& & //USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
& & USART_Cmd(UART4, ENABLE);
void UART4_SendByte(u8 byte)
& & while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);& &
& & USART_SendData(UART4,byte);
回复【17楼】yugen&&
我是这样设置的:用nvic_prioritygroupconfig(nvic_prioritygroup_4);即配置成没有子优先级。然后部分中断优先级相同,部分不同。
你这样检查下:即在复位程序开始时,将cstack全部设置成0xaa,死机时再检查下cstack,看看是否全部使用了。这样可判断栈是否过小问题。
-----------------------------------------------------------------------
请问是这样设置吗?
(原文件名:cstack.jpg)
死机时情况
奇怪的是,怎么,CSTACK的起始地址不一样了,地址配置是在进MAIN以后才执行的?
(原文件名:cstack02.jpg)
(原文件名:cstack01.jpg)
IAR不会用。我用的是keil。不过看起来有点奇怪,cortex-M3栈是向下的,你的图却是显示向上的存储区域。直接看RAM区看看。
另外,如果优先级不重要的话,最好不使用,这样简单很多。
不要在中断程序里接收数据,这样时间长
发个消息 用个任务去接收看看
可能为时钟问题。前几天刚好也碰到串口接收死机问题。
前阵子我使用串口1,串口2(115200)和TIM1/TIM2,UCOS做简单使用(TIM定时指示灯闪烁),串口2接收时死机,表现为定时中断进不去,指示灯不再闪烁,UCOS任务中指示灯也不再闪烁。设置外部晶振8M,无使用PLL,定时器1毫秒,UCOS节拍10毫秒。使用STM3.2.0库。
问题1:UCOS时钟节拍不运行,
解决1-1:修改TIM1和TIM2定时时间为10毫秒。
解决1-2:使用PLL=24M以上,具体原因暂未知。
问题2:使用PLL,24M,串口发送乱码,
解决2库3.2.0中的时钟初始化函数SystemInit(),中PLL时钟设置行RCC-&CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL6); 有问题,原设计是HES/2*6,修改为RCC-&CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL3);HES*3=24M解决串口乱码问题。
问题3:串口2接收中断死机问题
解决3:使用PLL=24M以上解决。具体原因暂未知。
综上所述,STM32时钟必须仔细应用。
另外,网上有找到串口接收中断一个BUG,详见二姨论坛中的 [ST MCU] 主题:关于USART接收中断的BUG和注意事项,
http://bbs.21ic.com/viewthread.php?tid=160999&highlight=USART
即串口接收时溢出问题解决。
希望对楼主有帮助。
以上问题有解决的原因未知的,希望有高手能给个解释。
该时钟问题解决后,暂未长时间运行,不知是否真正解决,期待高手。
多谢lengqing1309的详细回复,
看21的帖子,的确有可能是串口数据溢出造成,我现在按其方法改来试试。
回复【26楼】max0147&&
-----------------------------------------------------------------------
唉,同样死..
公司有一个产品上用了STM32+U COS,一个串口,用于升级,一个485口,用于采集10个从设备的数据,一个CAN口,用于和上位机通信,FSMC方式驱动TFT屏,还有按键检测等功能,运行正常。
我感觉和堆栈设置的关系可能比较大,我以前就遇到过类似的问题,劝楼主多看看堆栈设置的问题
这种问题9成是buffer指针越界造成,
还有8成是任务栈空间不够
还有7成是中断处理问题, 标志未清除啦, 数据没取出啦,。。。。。。
还有6成。处理串口消息的高优先级任务一直运行。。。。。。。。。。。
有调试器的话,设置好断点和跟踪点,应该很容易发现问题
顶一下!学习中
将这里改为:
串口中断接收程序:
void UART4_IRQHandler(void)
& & u8 irq_&&
& & OS_CPU_SR&&cpu_
& & if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
& & {& && && &
& && && & irq_data = USART_ReceiveData(UART4);& &//读取数据并清RXNE中断标志
& && && & OS_ENTER_CRITICAL();& && && && && && && && && && && && && &
& && && & OSIntNesting++;
& && && & OS_EXIT_CRITICAL();
& && && & OSIntExit();
& & //如果你开了TXE 就需要下面代码 清TXE中断
& &&&if(USART_GetITStatus(USART4, USART_IT_TXE) != RESET)
& && &USART_ITConfig(USART4, USART_IT_TXE, DISABLE);//清中断标志 要不然一直执行此中断 OK
//补充一下 irq_data = USART_ReceiveData(UART4); 这里 右边是16位的 这句话只将低8位传给了IRQ_DATA
回复【31楼】yiyu
这种问题9成是buffer指针越界造成,
还有8成是任务栈空间不够
还有7成是中断处理问题, 标志未清除啦, 数据没取出啦,。。。。。。
还有6成。处理串口消息的高优先级任务一直运行。。。。。。。。。。。
有调试器的话,设置好断点和跟踪点,应该很容易发现问题
-----------------------------------------------------------------------
我也遇上了,改大后就成啦...移植以为是中断设置问题。
stm32的USART4 貌似有BUG
回复【33楼】wind2100
将这里改为:
串口中断接收程序:&&
void uart4_irqhandler(void)&&
& & u8 irq_& &
& & os_cpu_sr&&cpu_&&
& & if(usart_getitstatus(uart4, usart_it_rxne) != reset)&&
& & {& && && &
& && && & irq_data = usart_receivedata(uart4);& &//读取数据并清rxne中断标志
& && && & os_enter_critical();& && && && && && && && && && && && && &
& && && & osintnesting++;&&
& && && & os_exit_critical();&&
& && && & osin......
-----------------------------------------------------------------------
学习了,犯错误往往在细节上
MARK!!!!!!!!!!!
怎么不发一个工程上来呢,
是不是UCOS本身的问题那
u8 irq_data;
这个是局部变量?
那外部怎么访问?
有ucos,可以用邮箱来传递消息了,至少,也要用信号量对全局缓冲区进行保护呀。
hardfault,很多时候是访问了不该访问的内存。
楼主,看到你这个帖子 stm32 ucos 串口接收中断死机的问题, 我现在遇到了跟你几乎一样的问题,你最后怎么解决的。 谢谢
我QQ : & &忘指教一下,我都搞了好几天了,快搞死了。
堆搞大点,然后在中断过里面屏蔽所有中断测测。
楼主,看到你这个帖子 stm32 ucos 串口接收中断死机的问题, 我现在遇到了跟你几乎一样的问题,你最后怎么解决的。 谢谢
我QQ : & &忘指教一下,我都搞了好几天了,快搞死了。
解决问题&&ucos 串口
应该是内存越界
34楼的道理在哪里?
楼主,你难道不做接收缓冲区边界检查吗?你的接受BUF指针从来不判断是否超出BUF大小,你这样,不死机才怪,写程序这种风格,真怕了。
请问34楼的道理在哪里?
难道开发出来都不测试的
我也遇到过类似问题,我的主要是没有及时读走接收数据,而是直接清除标志位,不过我觉得这两种方法是等效的可为什么实际效果不一样,原因暂没有深究。官方资料说直接清除标志位是用在多缓存方式中,慎用。不是太明白。忘大虾门点拨。
我现在也在用STM32F107的串口3进行通信,我迷糊在中断的嵌套这里了,求楼上的大虾给我解决下,我在107上面跑了ucos+LwiP,在跑多任务时加上串口4的485通信程序就死机了,什么程序也没起来,我想问是不是我的网卡中断和串口4的485通信中断嵌套出了问题。这是我的网卡中断和串口4的中断代码。
void NVIC_Configuration(void)
&&NVIC_InitTypeDef& &NVIC_InitS
&&/* Set the Vector Table base location at 0x */
&&NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
&&/* 2 bit for pre-emption priority, 2 bits for subpriority */
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
&&/* Enable the Ethernet global Interrupt */
&&NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);& &
&&NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
这是我跑得任务中的一个485通信
static&&void&&AppTaskKbd (void *p_arg)
& &USART_ClearFlag(UART4,USART_FLAG_TC);
& &if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
& &&&dat=USART_ReceiveData(UART4);
& & & &&&if(dat == 'A')
& & & &&&{
& & & && &&&GPIO_SetBits(GPIOD,GPIO_Pin_14);
& & & & & & & & OSTimeDlyHMSM(0,0,0,500);
& & & & & & & & GPIO_ResetBits(GPIOD,GPIO_Pin_14);
& & & & & & & & OSTimeDlyHMSM(0,0,0,500);
& & & &&&}
& &USART_ITConfig(UART4, USART_IT_TXE, DISABLE);
串口配置:
void Init_Usart(void)
& & & & GPIO_InitTypeDef GPIO_InitS& & & & & & & & & & & & & & & & & & & & //定义一个GPIO结构体变量
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,ENABLE);& & & & //使能各个端口时钟,
& & & & RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; & & & & & & & & //配置串口接收端口挂接到12端口
&&& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;& & & && & & & & & //复用功能输出开漏
&&& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;& & & && & & & & & //配置端口速度为50M
&&& & & & GPIO_Init(GPIOC, &GPIO_InitStructure);& & & & & & & && && && && && &&&//根据参数初始化GPIOD寄存器& & & &
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
&&& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;& & & & //浮空输入(复位状态);& & & && & & & & & & & & & & & & & & & & &
&&& & & & GPIO_Init(GPIOD, &GPIO_InitStructure);& & & & & & & && && && && && & //根据参数初始化GPIOD寄存器
& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;& && && && && && && && && && && & //485方向控制位
&&& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;& & & & //浮空输入(复位状态);& & & && & & & & & & & & & & & & & & & & &
&&& & & & GPIO_Init(GPIOD, &GPIO_InitStructure);& & & & & & & & & & & & //根据参数初始化GPIOD寄存器
& & & & & & & &
& & & & Usart_Configuration(115200);
void Usart_Configuration(uint32_t BaudRate)
& & & & USART_InitTypeDef USART_InitS& & & & & & & & & & & & & & & & //定义一个串口结构体
& & & & USART_InitStructure.USART_BaudRate& && && && &=BaudR& & & && && & & & //波特率115200
& & & & USART_InitStructure.USART_WordLength& && && & = USART_WordLength_8b; & & & & //传输过程中使用8位数据
& & & & USART_InitStructure.USART_StopBits& && && && &= USART_StopBits_1;& & & &&&& & & & //在帧结尾传输1位停止位
& & & & USART_InitStructure.USART_Parity& && && && &&&= USART_Parity_N& & & &&&& & & & //奇偶失能
& & & & USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//硬件流失能
& & & & USART_InitStructure.USART_Mode& && && && && & = USART_Mode_Rx | USART_Mode_Tx; //接收和发送模式
& & & & USART_Init(UART4, &USART_InitStructure);& & & & & & & & & & & & & & & & //根据参数初始化串口寄存器
& & & & USART_Cmd(UART4, ENABLE);& &&&& & & & & & & & & & & & & & & & //使能串口外设
求解答.......................
同样碰到过类似的问题
mark!遇到同样问题,困惑中!
问题出现在ucos,uart4,uart5,tim2共用,其中uart5,tim2工作正常,uart4在连续运行时工作正常,可是在uart4中断一旦设置断点后,再运行任务无法切换,观察这时候tim2,systick中断都在正常运行,就是无法切换任务,uart4和uart5配置都是类似,死机时观察到反复进入uart4中断,但是我已经清了中断标志位,实在很困惑!
搞定了!只能说uart4有点蛋疼!
搞定了!只能说uart4有点蛋疼!
楼上不要卖关子啦,怎么解决的?
注意一下顺序就可以了! 所以说uart4有点蛋疼!
是啊,楼主怎么搞定的,我这串口中断也死机呢?
大可能指针越界,printf函数字对齐问题。
楼主最后解决了没有?
我很生气,楼上那几个解决问题的,为什么不说一下怎么解决的,,,
很有可能是是分配的栈太小了,上次也遇到过死机,不过不是串口,加大栈空间后好了
本帖最后由 redworlf007 于
19:34 编辑
如果是一开始初始化串口就打开串口发送中断的话,会自动进入串口发送中断一次,这个时候os还没有启动,然后OS的嵌套就增加了1,退出中断的时候重新调度了,所以PC指针就指向未知的地方了,所以就死机了。
如果是一开始初始化串口就打开串口发送中断的话,会自动进入串口发送中断一次,这个时候os还没有启动,然后 ...
楼主,结案了吗?说说处理结果,让大家学习
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com

我要回帖

更多关于 labview 串口中断接收 的文章

 

随机推荐