在使用ESP8266不断向TCP服务器请求数据过程中,stm32随机性的死机
问题描述:在使用ESP8266不断向TCP服务器请求数据过程中,发现程序会突然进入死机状态,且进入死机状态的时间具有很大的不确定性。
解决过程:经过不断地测试,终于找到了死机时程序运行的位置,并找到了解决方案。
首先找到了,程序进入死机是由于中断函数引起的。由于某些不明原因,程序进入中断服务程序的标志位一直处于有效状态,无法正常清除标志。故CPU一直进入中断服务函数工作,从而导致主程序死机。解决方法,只需要在中断函数中添加异常情况时清除中断标志的代码即可。
解决方案如下
原中断服务函数
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART2);
if(USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据
{
TIM_SetCounter(TIM4,0);//计数器清空
if(USART2_RX_STA==0)TIM4_Set(1); //使能定时器4的中断
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
}
改进后的中断服务函数
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //收的地方可能会遇到相同问题,同样需要清标志。
res =USART_ReceiveData(USART2);
if(USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据
{
TIM_SetCounter(TIM4,0);//计数器清空
if(USART2_RX_STA==0)TIM4_Set(1); //使能定时器4的中断
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //发的地方清标志
{
USART_ClearFlag(USART2,USART_FLAG_ORE);
USART_ReceiveData(USART2);
}
}