STM8单片机接工控屏,有接收中断和发送中断,带步进电机,每个脉冲产生一个中断,以及各种外部中断,内部定时器中断。
设计基本完成。在步进电机运转时,遇到一个无规律的重启(看门狗溢出复位)。关闭看门狗,故障为无规律的类似代码跑飞或死机现象。
先检查代码,没发现问题,怪自己还too young,指责客户的供电,安装,电磁干扰等原因造成,让客户仔细排查,又让客户搭一个小型测试模型,已去干扰。
然后,在模型中测试,依然无规律复位重启!
确定不是单片机受干扰引起了。然后回到代码上分析。
预估为反复进入某中断。因为程序的中断太多,不宜设置断点分析,只好定义一个256字节数组,记录最近256次进入了那些中断。每进一个中断,记录一下。
结果定位在串口接收中断,反复进入,阻塞了其它中断和代码运行。
根据串口状态,查出过载错误置位,这个也会进入接收中断。
教训:在接收中断里面,不但要清除接收到数据标志位,还要清除其它引起这个中断的其它标志位!
大家使用STM8和STM32的串口的,引以为鉴。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
最好的做法
if(Rx_Flg)
{
Rx_Flg = 0;
do something...
}
else if(TxC_Flg)
{
TxC_Flg = 0;
do something...
}
else
{
SR_Reg = 0;
}
如下
if (UART2_GetITStatus(UART2_IT_OR))//over run
{
ayumi = UART2_ReceiveData8();
}
一周热门 更多>