调试串口数据接收的时候,发现一个很奇怪的现象,接收速率9600,在进入中断后,如果处理的时间过长,就会出现卡死现象,表现为:串口数据可以正常接收,但是持续进入中断,主循环无法执行。
部分中断函数如下:
在中断函数中加延时,比如,处理后延时2ms,可以正常跳出中断,但是这样会造成接收数据丢失。只有删减部分处理函数,让在中断中的时间尽可能少,才可能正常运转,但是这样无法实现函数功能。
后面无意中,把->指针指向改为 . 直接引用成员,竟然正常工作了!!!
- void USART1_IRQHandler(void)
- {
- uint32_t in_char;
- COM_DATA *ptrComData = NULL;
- ptrComData = &MODULE_COM_DATA;
- // read UART status
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
- USART_ClearFlag(USART1, USART_FLAG_RXNE);
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- in_char = USART1->DR;
- UartTime = 0;
- if(ptrComData->uc_flag == COM_COMPLETE_RECE)
- {
- return;
- }
- if(ptrComData->uc_flag == COM_REQUIRE_SEND)
- {
- return;
- }
- ……
程序一模一样,只是把指针改为引用成员,莫非这样比较节省时间?
- void USART1_IRQHandler(void)
- {
- uint32_t in_char;
- // read UART status
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
- USART_ClearFlag(USART1, USART_FLAG_RXNE);
- USART_ClearITPendingBit(USART1, USART_IT_RXNE);
- in_char = USART1->DR;
- UartTime = 0;
- if(MODULE_COM_DATA.uc_flag == COM_COMPLETE_RECE)
- {
- return;
- }
- if(MODULE_COM_DATA.uc_flag == COM_REQUIRE_SEND)
- {
- return;
- }
stm32串口接收中断有多个标志位都需要软件清0,否则会一直执行中断函数,卡住主函数
stm32里面的 串口接收中断有多个标志位会引发该中断,而且都需要进行软件清0,否则会一直执行中断函数卡住主函数。