01、问题描述
有客户的ES32F0283电源板在看门狗复位后不工作,只能掉电和拉低MRSTN脚或者断电才可以恢复。
02、分析步骤
初步分析
出现电源板没有反应时,在Keil里不下载程序进入仿真。仿真发现systick中断只能进1次,程序没有按照正常的流程在执行,全速运行后芯片会复位,看门狗复位标志会置位,说明看门狗起作用了,但是看门狗复位后程序运行没有恢复正常。
进一步确认了看门狗溢出时间和系统时钟,都是对的。因此可以确定是来不及喂狗导致芯片复位。来不及喂狗的原因是因为systick中断异常。
进一步分析
客户的中断向量放在了SRAM开始的256个字节里,中断向量表只在boot里会读一次。
仔细核对死机时的中断向量表数据和正常时的中断向量表数据,发现PendSV中断的跳转地址数据不对。手动改正PendSV中断的跳转地址数据后主控板恢复正常。确认了就是因为SRAM里PendSV中断的跳转地址数据错误导致实时内核调度出现问题。

确定问题原因
ES32F0283芯片外部复位后会重新载入配置字,复位中断向量重映射,从boot开始运行,看门狗复位和内核复位后不会重新载入配置字仍然直接运行app。因此如果SRAM里的中断向量表有问题,程序运行就会有问题。
按照ES32F0283参考手册2.3.2.3节《中断和异常向量》可以看到PendSV中断的入口地址在14*4=0x38,从Memory窗口数据可以看到0x20000000+0x38地址的数据是0x0000016D,对应PendSV_Handler ()的地址0x0000016E。
手动把0x20000000+0x38的数据改成其他数据后,芯片会进入Hardfault。

解决方案
在app开头增加读取中断向量表的步骤,保证SRAM里的中断向量表有问题时,复位后可以重新读取恢复。
03、总结
在M0芯片中,中断服务程序(ISR)通常更适合存放在FLASH中,以确保程序的稳定性和可靠性,而中断向量表(IVT)则可以根据具体需求选择存放在FLASH或SRAM中。
在M0芯片中,中断向量表放在FLASH和SRAM中各有优缺点,具体区别如下:
存放在FLASH中:
FLASH:通常情况下,M0芯片的中断向量表默认存放在FLASH的起始地址。这是因为FLASH是非易失性存储器,即使在断电的情况下,存储在其中的数据也不会丢失,适合存放程序代码和一些需要长期保存的静态数据。
优点:简单直接,不需要额外的内存映射操作。在系统复位或上电时,CPU可以直接从FLASH的起始地址获取中断向量表。
缺点:如果需要动态修改中断向量表,则修改相对复杂,需要擦除和重新写入。此外,FLASH的读取速度相对较慢,且在CPU时钟频率较高时,可能需要插入等待周期。因此,从中断向量表中读取中断处理函数地址时,可能会引入较大的时间开销,影响中断响应速度。
存放在SRAM中:
优点:便于动态修改。在一些需要动态更新中断向量表的场景中,将中断向量表存放在SRAM中可以更灵活地进行修改。此外,SRAM的读取速度较快,可以减少中断响应时间。
缺点:需要额外的初始化操作,如将FLASH中的向量表拷贝到SRAM,并通过硬件寄存器进行地址映射。同时,SRAM是易失性存储器,系统断电后向量表会丢失,需要重新加载。
来源:东软载波微电子
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。