串口的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寄存器来自动清除。
踩了个坑~

相关