单片机Cortex-M0内核系列程序跑死的问题(中断向量的影响)

本文目的声明:针对日常工作中,所遇到的bug问题,做一下记录,方便以后自己寻找定位问题,也可以给其他人一些调试的建议和帮助。

目标环境:MCU型号NXP  LPC824M201JHI33

单片机出现的bug现象:燃气表在静置运行状态下,不会出现单片机跑死的现象,只要一跑气,程序就会卡死,表具成为死表现象,重新短接单片机复位引脚,单片机才会复位,其他的外部中断都对表具没有影响。(表具掉电不关阀,按键屏幕不显示)

解决方法:

1、由于该表具的程序不是本人编写的,阅读程序发现代码中,没有执行喂狗的程序,因此,单片机跑死了,也不会执行复位。

2、根据现象,首先读取出有问题的死表程序和正常烧写表具的程序,对比二进制bin文件,发现二进制bin文件,有以下不同的地方。

单片机Cortex-M0内核系列程序跑死的问题(中断向量的影响)_第1张图片

3、根据bin文件的比较不同,发现正式烧录的程序和出现死表的程序不一致,因此,怀疑烧写程序不一致的问题。于是寻找这3个不同地方,分别所代表的东西。打开正常烧录程序,工程项目中的.s启动文件,可以看到中断向量表如下:

单片机Cortex-M0内核系列程序跑死的问题(中断向量的影响)_第2张图片

单片机Cortex-M0内核系列程序跑死的问题(中断向量的影响)_第3张图片 

根据向量表可知,第一个__initial_sp,是代表堆栈指针,它是代表芯片MCU堆栈的初始化地址(即存在于MCU的堆栈里面)。从后面的Reset_Handler开始都是存储在MCU的内部FLASH当中。由于M0内核的MCU芯片,都是32位,小端模式存储,因此以4个字节为一组,根据bin文件查看,可知__initial_sp,所对应的地址即为0x10000A40。Reset_Handler的对应地址即0x0000019D。

4、打开正常烧录程序的.map文件,确定bin文件三处地方,分别是什么东西改变了。

单片机Cortex-M0内核系列程序跑死的问题(中断向量的影响)_第4张图片

 经过bin文件依次规律比较,第一处不同的地方,对应上面的中断向量表,从堆栈初始化指针,第8个中断向量(DCD 0),发现没有用到中断,于是,继续向下分析,发现第二处不同的地方,刚好是第27个中断向量,根据中断向量表,第27个中断向量是FLASH_IRQHandler,接着分析第3处地方,刚好对应第37个中断向量,PIN_INT0_IRQHandler中断向量,PIN_INT0_IRQHandler中断向量刚好是气表传感器计数的中断向量,因此,发现只要一跑气,就会死表,因为,触发了传感器计数中断,由于中断向量的地址改变,造成了中断向量找不到,一直进入不了中断,因此,其他外部中断触发也不会响应。

但是第一个改变的东西到底是什么东西呢?

根据售后的反馈,我们的程序是使用JFLASH烧写的,因此,发现只要使用JFLASH,打开的hex文件,只要改变了hex文件其中的任何一个地方,这个值就会出现,并且每次都是同一个值。

 单片机Cortex-M0内核系列程序跑死的问题(中断向量的影响)_第5张图片

红色的部分,56即为修改的文本,D1F0FFEF,即为第一处bin文件不同的东西,它是hex文件的校验和,如果hex文件里面的值修改了,则这个地方会被默认修改成该值。

总结:最终经过向售后确认,他们确实是烧写文件时,不小心修改了hex文件中的内容,导致了中断向量的修改。 

你可能感兴趣的:(STM32)