问题发现
将我的一个项目升级了UART DMA发送, 其中用到了 IDLE
中断, 但是下载程序后板子卡死. 后发现是 IDLE
中断无限触发.
- 在中断函数设置一处日志
- 日志无限输出
问题分析
猜测 IDLE
中断标志位未正确清除
- 阅读库函数
USART_ClearITPendingBit
注意到IDLE
中断标志位的正确清除方式是:- 读
UART
的SR
寄存器 - 读
UART
的DR
寄存器 IDLE
中断标志位自动清除
- 读
问题解决
- 读
SR
寄存器- 在标志位的if判断已经完成
- 读
DR
寄存器- 因为我是DMA接收数据, 所以需要刻意去读一下
USART1->DR; //这样即可
总结
人生苦短, 多留意官方文档.