串口的DMA接收+空闲中断
STM32串口空闲中断的一个坑
原文连接 :https://www.ruitz.cn/?p=202 作者: rtz 分类: 笔记 发布时间: 2018-08-28 21:13rtz在一次程序中使用了串口的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寄存器来自动清除。
踩了个坑~