串口的DMA接收+空闲中断

STM32串口空闲中断的一个坑

 
 
原文连接 :https://www.ruitz.cn/?p=202
 
作者: rtz 分类: 笔记 发布时间: 2018-08-28 21:13

rtz在一次程序中使用了串口的DMA接收+空闲中断,
在空闲中断的中断服务函数中,胸有成竹地写下了:

1
2
3
4
5
6
7
8
void USART3_IRQHandler(void)
{
  if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)
  {
    USART_ClearFlag(USART3,USART_IT_IDLE);
    //xxxxxx
  }
}

结果空闲中断无限触发。
rtz花费了半个小时,终于在参考手册中发现如下一句话:

由软件序列清除该位(先读USART_SR,然后读USART_DR)

也就是说,IDLE标志位并不能通过USART_ClearFlag()函数清除,
而是通过先读SR寄存器,再读DR寄存器来自动清除。
踩了个坑~

posted @ 2021-05-25 20:02  hubertboy  阅读(362)  评论(0编辑  收藏  举报