最近用上了新唐的MCU,向量页重新映射的问题一直无法解决。
#define APPLICATION_START_ADDR (0x6000)
__asm INT32U spChange(INT32U _sp)
{
MSR MSP, r0
BX lr
}
void application_run(void)
{
typedef void(*app_entry)(void);
INT32U *vectorTable = (INT32U *)(APPLICATION_START_ADDR);
static INT32U _sp = 0;
static INT32U _pc = 0;
static app_entry app = 0;
_sp = vectorTable[0];
_pc = vectorTable[1];
SYS_UnlockReg();//解除寄存器写保护
FMC_ENABLE_ISP();//使能ISP
app = (app_entry)_pc;
FMC_SetVectorPageAddr(APPLICATION_START_ADDR); //重置中断向量表
spChange(_sp);
app();
while(1);
}
将断点设置在app()这个地方的时候,可以看到ISPSTA的VECMAP是0x60(如下图一),应该就是APPLICATION_START_ADDR,看起来是正确的。另外看到sp指针也正常,如图二
图一:
图二:
图三是flash的0x6000的数据
当执行app()后,也能跳转到相应的app,app的代码能正常执行,但中断进入不了。
因为我在app中设置了每隔10ms响应一次SysTick_Handler。
app的代码应该是没问题的,因为我将app的rom起始地址改成从0x00开始,编译后烧录到主板上是正常运行的。
现在将起始地址改成APPLICATION_START_ADDR(即0x6000),反而不行。
所以我怀疑中断向量表没有映射成功。
不知道这里有没有高手指导一下,是不是向量表重新映射是不是还有寄存器需要配置的?
另:现在本人使用的mcu是新唐的NUC029LAN
谢谢!
|