改写IAP向量表的函数为:
//重新初始化STM8的中断向量表 把它重新定义到APP的中断向量中
void STM8_HanderIqr_Init(void)
{
uint8_t Index;
disableInterrupts(); //关闭中断
FLASH_Unlock(FLASH_MEMTYPE_PROG);
for(Index = 1; Index < 32;Index++)
{
FLASH_ProgramWord(0x8000+4*Index,0x82000000+APPLICATION_ADDRESS+Index*4);
}
FLASH_Lock(FLASH_MEMTYPE_PROG);
}
跳转到APP的函数为:
void JPMainProgram(void)
{
//跳转至APP
asm("LDW X, SP ");
asm("LD A, $FF");
asm("LD XL, A ");
asm("LDW SP, X ");
asm("JPF $9000"); //0x9000是APP的地址,根据自己的情况来改
}
最后:
stm8的Flash很小,建议使用寄存器操作,不要用库函数,否则不好控制代码大小。
IAR的SWIM仿真对于Memory的支持不是很好,当调用上面的函数改写Flash后,从Memory窗口上看可能并未改变,但实际上已经被改写了。
|