001.關於Cortex M0系列MCU中斷向量表重映射問題


        在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)中找到以下說明:

sp170318_234358

可以通過以下方法來實現中斷向量表重定義。

基本思想:

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);
}

微信公眾號:嵌入式大玩家

 
         

 

 
         

更多精彩文章我將第一時間在微信公眾號里面分享,如果不想錯過,可以關注我的微信公眾號。

 
         

 

 
         

本着免費分享的原則,方便大家手機學習知識,定期在微信平台分享技術知識。如果覺得文章的內容對你有用,又想了解更多相關的文章,請用微信搜索“嵌入式大玩家” 或者掃描下面二維碼、關注,將有更多精彩內容等着你。

 
         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM