先说结论:无论是APP还是IAP,无论运行在哪个扇区,都要重新设置中断向量偏移SCB->VTOR。 环境:STM32H723,有两个程序APP1和APP3,分别在扇区0和扇区7,如下:
0x08000000 | 扇区0 | APP1 | 0x08020000 | 扇区1 | | 0x08040000 | 扇区2 | APP2 (和APP1相同,中断向量偏移不同) | 0x08060000 | 扇区3 |
| 0x08080000 | 扇区4 |
| 0x080A0000 | 扇区5 |
| 0x080C0000 | 扇区6 |
| 0x080E0000 | 扇区7 | APP3 |
目的:从APP1跳转到APP3,再从APP3跳转到APP1。 现象:当从APP1跳转到APP3程序一切正常,但从APP3跳回APP1程序异常。 排查过程: 首先把BootAddr0改为扇区7,上电从APP3跳转到APP1,发现也不行,RT-Thread初始化完成后进入main()函数马上异常。 然后我把APP1重新烧录到扇区2(程序中已经修了中断向量偏移),然后从APP3跳转过去发现能正常运行。 我又把BootAddr0改回扇区0(默认就是扇区0),上电直接运行APP1,一切正常。 一般boot0默认上电运行的就是扇区0的程序,我错误的以为APP1在扇区0不需要修改SCB->VTOR(如果没有跳转的操作确实不需要修改)。 当我的程序从APP3跳转到APP1,我以为SCB->VTOR会在APP1中自己改回来,实际情况是不开启USER_VECT_TAB_ADDRESS宏,程序是不会修改SCB->VTOR的,而 APP1是没开启这个宏的。 APP3已经把断向量表偏移SCB->VTOR修改了,跳转到APP1后没有更回来,导致异常: 最终在APP1中开启宏定义USER_VECT_TAB_ADDRESS,修改中断向量偏移VECT_TAB_OFFSET为0解决。 #define USER_VECT_TAB_ADDRESS #define VECT_TAB_OFFSET 0U 没开启这个宏上电能运行是因为系统上电后中断向量偏移默认是BOOT_ADD0映射的地址,在扇区0,而我的APP1也在扇区0,不需要偏移,所以程序能正常运行。
|