STM32F0系列UART错误中断问题
STM32F0系列重写的UART相关代码。
在新的UART里,容易发出的错误是FE错误和ORE错误。
FE的解释如下:
FE: 帧错误
当一个不同步现象、 强噪声或一个断开符号被检测到的时候, 这个位有硬件置 1。
由软件向 USART_ICR 寄存器的 FECF 位写 1, 可以清除这个标志。 在智能卡模式
中发送数据时, 当重发尝试的次数达到上限, 由没有收到成功的回应(卡一直响应
NACK) 的时候, 这个位也会被硬件置 1。
如果 USART_CR1 寄存器中的 EIE 位是 1, 会产生中断请求。
0: 没有检测到帧错误
1: 有检测到帧错误或者有收到断开字符
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)函数中,是这样处理的:
/* UART frame error interrupt occurred --------------------------------------*/
if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
huart->ErrorCode |= HAL_UART_ERROR_FE;
}
建议:
然后偶尔的情况下,由于其他原因CR3中的EIE被关闭了,但是FE还没来得及清的情况下
HAL_UART_IRQHandler就会一直不触发,造成CPU卡死现象。
建议解决方法:
if ((isrflags & USART_ISR_FE) != 0U)
{
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
huart->ErrorCode |= HAL_UART_ERROR_FE;
}
将检查FE错误的情况独立出来,只要有FE错误中断就清楚。
其他几个ORE中断等,建议也用类似方法解决
【STM32F0系列UART错误中断问题】反正出了这些错误,把那帧丢掉就行,总比CPU卡死强。
推荐阅读
- 【欢喜是你·三宅系列①】⑶
- 你不可不知的真相系列之科学
- 人脸识别|【人脸识别系列】| 实现自动化妆
- 2018-06-13金句系列7(金句结构-改编古现代诗词)
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- Unity和Android通信系列文章2——扩展UnityPlayerActivity
- 乡野村趣系列之烧仙草
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- 【年终激励系列】之五(年终奖如何与考核紧密相连)