eagle0754 发表于 2015-3-24 21:21:10

STM32F0串口中断接收的奇怪问题

本帖最后由 eagle0754 于 2015-3-24 21:22 编辑

现在用STM32F0芯片,做串口接收实验。初始化中只是开了接收中断。接收中断如下所示:
volatile uint8_t Usart1RxTerm = 0;
uint32_t Usart1RxCount = 0;
uint8_t Usart1RxBuffer;

void USART1_IRQHandler(void)
{
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
    USART_ReceiveData(USART1);//(1)
}

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
    if (0 == Usart1RxTerm)
    {
      Usart1RxBuffer =   SART_ReceiveData(USART1);
    }      

    if(Usart1RxCount==256)
    {
   Usart1RxCount = 0;    //(2)   
   Usart1RxTerm = 1;
    }
}
}

程序运行后,在中断服务程序的(1)和(2)位置设置断点后全速运行。电脑使用串口助手首次发送256个字节到STM32F0可以正常运行到断点(2)。
然后电脑上串口助手再次发送256字节后,就停在断点(1)了。这是为什么?
网上说中断服务中判断到ORE时,读一次接收缓冲就行了。但是没作用啊
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
   {
   USART_ReceiveData(USART1);
}

zfz0122 发表于 2015-3-24 21:50:00

不懂帮顶

zhangdaijin 发表于 2015-3-24 22:04:58

路过帮顶!!!

alvin_ 发表于 2015-3-25 08:44:11

第二次停在了断点1……是不是就说你ORE置位了?

数码小叶 发表于 2015-3-25 08:47:23

咋感觉是这个的问题volatile ,不太懂:lol:lol:lol

stary666 发表于 2015-3-25 10:03:54

帮顶吧,顺便学习学习

发表于 2015-3-25 10:16:47

先读取数据,然后再清除溢出标志位。

eagle0754 发表于 2015-3-25 21:22:42

安 发表于 2015-3-25 10:16
先读取数据,然后再清除溢出标志位。

谢谢版主,这个中断没有问题。是外部清接收完标志时出错

发表于 2015-3-26 10:40:39

if (0 == Usart1RxTerm)

    {

      Usart1RxBuffer =   SART_ReceiveData(USART1);

    }      

这里注意,你把Usart1RxTerm = 1;数据不在接收,这里可以改为,
c=SART_ReceiveData(USART1);
if (0 == Usart1RxTerm)

    {

      Usart1RxBuffer =   c;
    }   

这样就可以了.

jack2016 发表于 2017-6-6 20:05:30

支持
页: [1] 2
查看完整版本: STM32F0串口中断接收的奇怪问题