STM32串口死机问题笔记(仅供学习用)

当STM32与上位机通讯数据量非常大时,往往容易导致死机,于是我们在网上查找添加以下代码:

void USART1(void) { if (USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET) { USART_ReceiveData(USART1); USART_ClearFlag(USART1, USART_FLAG_PE); } if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) { USART_ReceiveData(USART1); USART_ClearFlag(USART1, USART_FLAG_ORE); } if (USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET) { USART_ReceiveData(USART1); USART_ClearFlag(USART1, USART_FLAG_FE); } if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearFlag(USART1, USART_FLAG_RXNE); USART_ClearITPendingBit(USART1, USART_IT_RXNE); Data = USART_ReceiveData(USART1); } }

但还是会偶尔会死机,我原先的做法是加上独立看门狗,这样死机后立即复位。但是复位的声音,使用者不了解就会认为是异常,而且系统的稳定性大打折扣。

但经过的不断研究,采用寄存器的方式,每接收一个字节就跳出中断,只要在中断开头加上

void USART1(void) {

UART1->SR = 0xf5;这里可以查SR寄存器就可以啦 Rcvuart1_Buf[Rcv_uart1_Index++] = USART_ReceiveData(USART1); }

这种方式验证了很长时间~

再加上看门狗就能有效解决 ~~

-------------------------------------------------------------------------------

经验分享 程序员 微信小程序 职场和发展