串口的DMA接收+空闲中断
STM32串口空闲中断的一个坑
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寄存器来自动清除。
踩了个坑~