STM32F0xx IAP實現(xiàn)之中斷向量表重定義
在STM32F103等cortex-m3/m4內(nèi)核的單片機上可以通過設(shè)置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;該寄存器的值來實現(xiàn)中斷向量表的重定義。但在STM32F0xx系列以cortex-m0為內(nèi)核的單片機中卻怎么也找不到這個設(shè)置中斷向量表的寄存器,可以通過以下方法來實現(xiàn)中斷向量表重定義。
基本思想:
1、將中斷向量表放入到RAM的起始地址(只需要在應(yīng)用程序中保留RAM其實地址的0x100大小不使用即可)。
2、在bootload中將應(yīng)用程序的中斷向量表從Flash中拷貝到RAM中。
3、設(shè)置STM32F0xx中斷向量表位于RAM中。
具體實現(xiàn)代碼如下:
/*
*Function:voidJumpToApp(void)
*Parameter:none
*Return:none
*/
staticvoidJumpToApp(void)
{
ApplicationAddress=APP_FLASHADDR;
if(((*(uint32_t*)ApplicationAddress)&0x2FFE0000)==0x20000000)
{
/*Jumptouserapplication*/
/*最開頭4個字節(jié)存放MSP的初始值,從這之后的4個字節(jié)存放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);
}