STM32F0xx IAP实现之中断向量表重定义
扫描二维码
随时随地手机看文章
在STM32F103等cortex-m3/m4内核的单片机上可以通过设置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;该寄存器的值来实现中断向量表的重定义。但在STM32F0xx系列以cortex-m0为内核的单片机中却怎么也找不到这个设置中断向量表的寄存器,可以通过以下方法来实现中断向量表重定义。
基本思想:
1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM其实地址的0x100大小不使用即可)。
2、在bootload中将应用程序的中断向量表从Flash中拷贝到RAM中。
3、设置STM32F0xx中断向量表位于RAM中。
具体实现代码如下:
/*
*Function:voidJumpToApp(void)
*Parameter:none
*Return:none
*/
staticvoidJumpToApp(void)
{
ApplicationAddress=APP_FLASHADDR;
if(((*(uint32_t*)ApplicationAddress)&0x2FFE0000)==0x20000000)
{
/*Jumptouserapplication*/
/*最开头4个字节存放MSP的初始值,从这之后的4个字节存放ResetHandler中断向量*/
m_JumpAddress=*(uint32_t*)(ApplicationAddress+4);
JumpToApplication=(FunVoidType)m_JumpAddress;
/*Initializeuserapplication'sStackPointer*/
__set_MSP(*(uint32_t*)ApplicationAddress);
JumpToApplication();
}
}
/*
*Function:voidclock_init(void)
*Parameter:none
*Return:none
*/
intmain(void)
{
memcpy((void*)0x20000000,(void*)APP_FLASHADDR,0x100);
SYSCFG->CFGR1|=0x03;
JumpToApp();
while(1);
}