|
参照ST的IAP例程,整个程序分为IAP和APP两部分,前者从0x8000000开始存放、程序二进制文件小于4K字节,后者从0x8004000开始存放、程序二进制文件接近63K字节。先通过JTAG将APP程序下载到0x8004000开始的地址,再将IAP程序下载到0x8000000开始的地址并在下载后reset,从IAP跳转到APP正常,但是进入APP后在一个依赖systick实现的延时函数中死循环,经查为systick中断处理程序未能进入,导致延时计数器不能递减为0。将APP程序单独下载到0x8000000开始的地址运行,中断响应一切都正常。推测systick中断不能响应要么是中断被屏蔽,要么是中断向量表设置不当,具体原因现在不详,谁遇到过类似问题?
>> IAP程序的关键代码:
#define ApplicationAddress 0x8004000
......
//跳转至用户代码
JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
Jump_To_Application = (pFunction) JumpAddress;
//初始化用户程序的堆栈指针
__set_MSP(*(__IO uint32_t*) ApplicationAddress);
Jump_To_Application();
......
>> APP程序的关键代码:
......
// MCU初始化
SystemInit();
//设置中断向量表的位置在 0x4000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
......
|