程序主逻辑无法执行,但是各个中断服务程序能够正常运行。
解决方法:
1)在中断程序中点灯或者打印,判断中断程序是否能够正常运行;
2)keil的debug模式在线调试运行,即可知道程序卡死位置。
3)在2)无法满足时,在程序主逻辑中打印或者点灯,多次编译烧录,判断卡死位置。
2、程序卡死在中断中,中断程序中没有清除中断标志位,或者中断服务程序的触发频率太高,中断没有执行完毕又触发了中断标志位,单片机在循环执行中断服务程序。
例如在高频率的中断服务程序中增加printf打印信息容易造成该现象。
现象:程序主逻辑无法执行,部分中断程序也无法执行。
解决方法:
1)在问题发生时,调整没有执行的中断程序的优先级为最高优先级,例如SysTick中断优先级、TIMER有限级等,在该对应中断服务程序中点灯或者低频定时打印,观察是否执行。
2)如果执行,则说明肯定卡死在中断中,仔细检查所有的中断程序。仍无法判断问题点,则逐步降低调整优先级的中断服务程序,直到其不被执行,确定问题程序优先级,缩小范围,再找问题。
3、程序进入HardFault,HardFault本身也是一个中断,只不过其中断优先级为-1,高于一切用户可设置中断。
产生原因(常见的均为地址类问题):
1)访问了单片机无法到达的地址;
2)访问地址不对齐,尤其是在(int ) (float )等多字节强制取值时容易出现,检测强制取值的地址是否为四字节对齐。
3)PC指针跑飞,该现象在我多年经验中只遇到过一次,是在强干扰情况下,芯片PC指针突然变为非常异常值,芯片直接进入HardFault。该情况实际很少遇到,通常情况下芯片不会无缘无故跑飞,多数都为自身程序问题。
解决办法(出现问题后只能断电重启,但可以找出造成问题的点):
1)代码中增加HardFault中断服务程序,在中断向量表中可以找函数名称。
2)服务程序中增加特殊的点灯提示即可。后期任何进入HardFault的问题都能一目了然。
3)HardFault中断服务程序中可以保存芯片信息到Flash中,以便重新上电时检查问题点,保存的信息主要是进入HardFault前的PC指针,通过在该PC指针在map文件中查找对应区间的函数,即可确认是什么函数造成了HardFault。该 *** 作的详细步骤自行百度。
4、芯片不停的高频重启(此处不讨论硬件造成的问题),不是所有的地址异常等都会进入HardFault,有些是造成芯片重启。
现象:
1)看上去芯片主程序、中断程序、HardFault 什么都不执行了。
解决方法:
1)在main()函数的最开始(注意要先配置外设),增加点灯和延时处理,或打印。观察上电后是否有输出。并且反复输出,或者灯闪烁。
2)逐步调整点灯位置,确认造成死机点。
3)在程序执行到main之前,是先执行芯片的RESET中断服务程序,这之间会初始化中断向量表,初始化堆栈等,在s文件中有相应的汇编代码。如果死在main之前,可尝试在RESET中断服务程序中直接 *** 作寄存器,配置时钟和GPIO外设,控制点灯,观察是否能够点亮,以确认问题。
1、仿真调试实时跟踪代码的运行,逐步执行代码,程序出现问题并能跟踪到问题所在。
2、设置调试断掉,使程序运行到指定位置停下。
3、能够观察全局变量的变化、寄存器的变化。
4、可以查询某个内存地址的存储的数据。
5、显示调用栈的内容,也就是函数指针和局部变量。
6、可以查询片内外设和片外外设的寄存器变化,对照芯片手册的相应寄存器的说明,便可以知道相应外设寄存器的值是否出错。
以上就是关于stm32切换屏幕卡死全部的内容,包括:stm32切换屏幕卡死、keil5stm32中断函数改变全局变量主程序没反应、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)