STM32串口异常导致重启

时间:2024-04-06 11:24:34

问题是这样的

我在调试两个使用stm32的设备,一个f103一个f429,它们会通过串口1进行通信,但是在我意外地把f103那一块板的TXD与GND接到一块的时候,f429重启了
首先怀疑是硬件问题,但是用万用表量了半天没发现有任何异常。
接下来怀疑代码,f429程序中并未发现跟通信相关的导致重启的逻辑。
在一位大佬的帮助下发现问的原因:

当TXD、GND相连后USART_SR NF位(噪声检测)置一,触发中断

NF置一本身不会产生中断,需要在多缓冲区通信模式(DMA)下且CR3中的ELE(错误检测使能)位也置一才会产生中断

STM32串口异常导致重启
DMA模式(多缓冲器通信模式) 非DMA模式(单缓冲器通信模式)
我刚好用来DMA模式

那ELE是在哪里被置位的呢?
HAL库函数HAL_UART_Receive_IT调用了

__HAL_UART_ENABLE_IT(huart, UART_IT_ERR);

HAL_UART_Receive_IT() 又在初始化串口时被调用

因此TXD、GND相连后USART_SR的NF位置一,触发中断
而串口中断中并未进行处理导致死循环
看门狗3秒超时重启f429
在串口中断服务函数中读一次SR再读一次DR可以解决问题