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 = https://www.it610.com/article/USART_ReceiveData(USART1);
}
}
但还是会偶尔会死机,我原先的做法是加上独立看门狗,这样死机后立即复位。但是复位的声音,使用者不了解就会认为是异常,而且系统的稳定性大打折扣。
但经过的不断研究,采用寄存器的方式,每接收一个字节就跳出中断,只要在中断开头加上
【STM32串口死机问题笔记(仅供学习用)】
void USART1(void)
{
UART1->SR = 0xf5;
这里可以查SR寄存器就可以啦
Rcvuart1_Buf[Rcv_uart1_Index++] = USART_ReceiveData(USART1);
}
这种方式验证了很长时间~
再加上看门狗就能有效解决 ~~
-------------------------------------------------------------------------------
推荐阅读
- 基于stm32智能风扇|基于stm32智能风扇_一款基于STM32的智能灭火机器人设计
- stm32|基于STM32和freeRTOS智能门锁设计方案
- STM32F4|STM32F4 TIM6 TIM7 基本定时器
- LUA|单片机脚本语言移植lua到stm32MDK
- 驱动调试小结
- USB转串口|USB转四串口芯片CH9344
- STM32 CUbeIDE 定时器中断使用
- STM32F1系列ADC电压采集
- Android通过JNI操作串口
- Java|Java串口通信(RXTX)