当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);
}
这种方式验证了很长时间~
再加上看门狗就能有效解决 ~~
当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);
}
这种方式验证了很长时间~
再加上看门狗就能有效解决 ~~
举报