股票

STM32串口数据接收问题

调试串口数据接收的时候,发现一个很奇怪的现象,接收速率9600,在进入中断后,如果处理的时间过长,就会出现卡死现象,表现为:串口数据可以正常接收,但是持续进入中断,主循环无法执行。

部分中断函数如下:

 

在中断函数中加延时,比如,处理后延时2ms,可以正常跳出中断,但是这样会造成接收数据丢失。只有删减部分处理函数,让在中断中的时间尽可能少,才可能正常运转,但是这样无法实现函数功能。

后面无意中,把->指针指向改为 . 直接引用成员,竟然正常工作了!!!

  1. void USART1_IRQHandler(void)  
  2. {  
  3.     uint32_t in_char;  
  4.         COM_DATA *ptrComData = NULL;  
  5.       
  6.     ptrComData = &MODULE_COM_DATA;  
  7.     // read UART status  
  8.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  9.     {  
  10.         USART_ClearFlag(USART1, USART_FLAG_RXNE);  
  11.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);  
  12.   
  13.         in_char = USART1->DR;  
  14.           
  15.           
  16.         UartTime = 0;  
  17.           
  18.         if(ptrComData->uc_flag == COM_COMPLETE_RECE)  
  19.         {  
  20.             return;  
  21.         }  
  22.         if(ptrComData->uc_flag == COM_REQUIRE_SEND)  
  23.         {  
  24.             return;  
  25.         }  
  26. ……  

程序一模一样,只是把指针改为引用成员,莫非这样比较节省时间?

  1. void USART1_IRQHandler(void)  
  2. {  
  3.     uint32_t in_char;  
  4.   
  5.     // read UART status  
  6.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
  7.     {  
  8.         USART_ClearFlag(USART1, USART_FLAG_RXNE);  
  9.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);  
  10.   
  11.         in_char = USART1->DR;  
  12.           
  13.           
  14.         UartTime = 0;  
  15.           
  16.         if(MODULE_COM_DATA.uc_flag == COM_COMPLETE_RECE)  
  17.         {  
  18.             return;  
  19.         }  
  20.         if(MODULE_COM_DATA.uc_flag == COM_REQUIRE_SEND)  
  21.         {  
  22.             return;  
  23.         }  
打赏
原文链接:,转发请注明来源!

持续进入中断的原因进行回复 点击这里取消回复。

  • 持续进入中断的原因

    stm32里面的 串口接收中断有多个标志位会引发该中断,而且都需要进行软件清0,否则会一直执行中断函数卡住主函数。

    回复
    • 2 Responses to “STM32串口数据接收问题”
      • 持续进入中断的原因

        stm32串口接收中断有多个标志位都需要软件清0,否则会一直执行中断函数,卡住主函数

        回复
      • 持续进入中断的原因

        stm32里面的 串口接收中断有多个标志位会引发该中断,而且都需要进行软件清0,否则会一直执行中断函数卡住主函数。

        回复