在STM32F103等Cortex-m3/m4內核的單片機上可以通過設置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;該寄存器的值來實現中斷向量表的重定義。關於Cortex M3/M4中斷向量表重映射問題會單獨一篇文章詳細介紹,此篇主要講解關於M0的,要問為什么要做中斷向量表重映射也會單獨一篇文章詳細介紹。與M3/M4不同的是在STM32F0xx系列以Cortex-m0為內核的單片機中卻怎么也找不到這個設置中斷向量表的寄存器,可是在ST提供的固件庫里,我卻沒有發現類似於stm32f10x固件庫中的voidNVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)接口,瀏覽了一下Cortex-M0的Programmingmanual,原來M0並沒有SCB->VTOR這個寄存器,難怪ST的庫里沒有提供NVIC_SetVectorTable這個接口。
通過查閱 Reference manual文檔(RM0360)中找到以下說明:
可以通過以下方法來實現中斷向量表重定義。
基本思想:
1、將中斷向量表放入到RAM的起始地址(只需要在應用程序中保留RAM起始地址的0x100大小不使用即可)。
2、在Bootloader中將應用程序的中斷向量表從Flash中拷貝到RAM中。
3、設置STM32F0xx中斷向量表位於RAM中,主要用到的寄存器如下:
具體實現代碼如下:
/* * Function: void JumpToApp(void) * Parameter: none * Return: none */ static void JumpToApp(void) { ApplicationAddress = APP_FLASHADDR; if (((*(uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) { /* Jump to user application */ m_JumpAddress = *(uint32_t*) (ApplicationAddress + 4); /*最開頭4個字節存放MSP的初始值,從這之后的4個字節存放ResetHandler中斷向量*/ JumpToApplication = (FunVoidType) m_JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(uint32_t*) ApplicationAddress); JumpToApplication(); } } /* * Function: void clock_init(void) * Parameter: none * Return: none */ int main(void) { memcpy((void*)0x20000000, (void*)APP_FLASHADDR, 0x100); SYSCFG->CFGR1 |= 0x03; JumpToApp(); while (1); }
微信公眾號:嵌入式大玩家
更多精彩文章我將第一時間在微信公眾號里面分享,如果不想錯過,可以關注我的微信公眾號。
本着免費分享的原則,方便大家手機學習知識,定期在微信平台分享技術知識。如果覺得文章的內容對你有用,又想了解更多相關的文章,請用微信搜索“嵌入式大玩家” 或者掃描下面二維碼、關注,將有更多精彩內容等着你。