STM32 Usart接收中断仅工作一次

时间:2019-08-08 16:20:10

标签: interrupt stm32 keil usart

我试图让STM32F103通过USART接收4个字节并将它们存储在一个值中。

到目前为止,如果我重置微控制器,则第一次发送正常接收到的4个字节,并且微控制器将它们存储在USART_RX_BUF中,但是,如果我再发送4个字节,则USART_RX_BUF保持不变,此外, USART_RX_BUF似乎没有按照我的意愿复制到dato中

USART中断例程的代码为:

void USART1_IRQHandler(void
{
    u8 Res;
#if SYSTEM_SUPPORT_OS       
    OSIntEnter();    
#endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
    {
        Res =USART_ReceiveData(USART1);

        if((USART_RX_STA&0x8000)==0)
        {
            if(USART_RX_STA&0x4000)
            {
                if(Res!=0x0a)USART_RX_STA=0;
                else{
                    USART_RX_STA|=0x8000;   
                    dato[0]= USART_RX_BUF[0];
                    dato[1]= USART_RX_BUF[1];
                    dato[2]= USART_RX_BUF[2];
                    dato[3]= USART_RX_BUF[3];
                    //USART_RX_STA= 0;
                    //memset(USART_RX_BUF,0,5);
                } 


            }
            else //No se recibio 0x0d todavia
            {   
                if(Res==0x0d)USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;

                }        
            }
        }            
    } 

如上所述,此代码仅接收4个字节,并忽略我在这4个字节之后发送的任何内容(接收的数据缓冲区无法覆盖),并将缓冲区中的数据写入名为dato的数组中。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

最有可能,您只需在读取数据后清除USART_IT_RXNE标志

USART_ClearITPendingBit(USART1, USART_IT_RXNE);

答案 1 :(得分:0)

将代码从STM32G0移植到STM32F3时遇到了这个问题。显然,它已在G0 HAL库中修复,但在F3中未修复。搜寻了一个小时后,我没有找到任何简单的解决方案,因此我不得不提出自己的解决方案。尽管这更多是一种解决方法,然后是解决方案。 在处理接收到的数据后,我仅调用HAL_UART_Abort_IT(&huart)HAL_UART_Recieve_IT(&huart)。这可能不是最干净的方法,但是最简单。