#申请开发板#@21小跑堂
一、背景
最近遇到使用APM32F072增加擦写内部flash功能后出现死机现象,板子按键各种操作都不会响应。以下对此案例整个分析流程进行说明,以便后续遇到类似问题避免踩坑。
二、分析流程
(1)之前其他部分代码逻辑都是正常运行,只是增加擦写内部flash功能后出现异常,第一反应就是flash擦写代码有问题,以下为擦写flash部分的代码,分为读/写两部分,肉眼观察法未发现明显逻辑错误。
(2)单独摘取flash读写代码进行测试,代码逻辑也是相当简单,通过timer14设置500ms中断,500ms进行一次flash读写操作,并且闪灯和输出“system is running”信息,预期程序死机灯不再闪烁和调试信息不再输出,结果令人失望,挂机一个早上并未复现。
(3)事情并未想的那么简单,开始整理思路,实际应用场景中主控板会持续通过串口通信进行交互,尝试关闭串口通信,似乎就不再出现死机现象。真相大白,看似擦写flash部分代码背大锅,实则和串口通信也有着密不可分的关系;
(4)测试代码开始增加串口通信,上位机每隔50ms发送一次数据,mcu接收后将原数据返回,果不其然运行几次后就出现死机,调试发现频繁触发串口接收中断导致主函数无法被执行;
(5)通过查看寄存器状态,发现OVREFLG被置位没有清除,导致串口中断服务函数频繁触发。
(6)增加清除串口溢出错误标志位异常处理代码后,再次挂机测试功能正常。
三、总结
擦写内部flash一般会进行关闭中断的操作,此时串口中断不再被响应,而UART通信接口又在不断接收数据,导致触发串口溢出错误,而如果溢出错误未被及时清除,进而导致擦写完flash打开中断之后,串口中断不断被响应影响主函数功能。
|