1. 程式人生 > >STM32中斷向量表偏移地址配置方法

STM32中斷向量表偏移地址配置方法

1-------------------------------------------------------------------------

from:   https://blog.csdn.net/gengyiping18/article/details/50735358

ST公司重定位向量表的庫函式:

void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset){ 

  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));

  assert_param(IS_NVIC_OFFSET(Offset));     

  SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);

}

其中NVIC_VectTab要麼是FLASH要麼是RAM的起始位置,Offset: Vector Table base offset field. This value must be a multiple of 0x200,這裡先是IS_NVIC_OFFSET(OFFSET)  ((OFFSET) < 0x000FFFFF)斷言機制,ST公司技術支援給我的回信是這麼說的“The max flash size is 1MB, that is 0x100000, so the vector table must be placed within this address range, so ((OFFSET) < 0x000FFFFF) is checked.”f10x 內建flash最大也就512K,SRAM內建是64k,並沒有看到官方人員說的1MB,我想這些斷言機制恐怕也是為了給很多晶片共同使用而寫的,也就是說實際還是要自己小心著用啊~

然後(Offset & (uint32_t)0x1FFFFF80)事實上就是取了Offset的[28:7]位。但是你還是需要人為讓其為0x200的倍數,至於為什麼,在ARM官方給出的Cortex-m3 technial reference manul中是這麼說的:

The Vector Table Offset Register positions the vector table in CODE or SRAM space. 

The default, on reset, is 0 (CODE space). When setting a position, the offset must be 

aligned based on the number of exceptions in the table. This means that the minimal 

alignment is 32 words that you can use for up to 16 interrupts. For more interrupts, you 

must adjust the alignment by rounding up to the next power of two. For example, if you 

require 21 interrupts, the alignment must be on a 64-word boundary because table size 

is 37 words, next power of two is 64.

所以由於人家規定要對齊向量表,由於stm32的中斷向量一共有68+16=84個,應該把這個數增加到下一個2的整數倍即128,然後換算成地址範圍128*4=512,就得到了0x200

 

2---------------------------------------------------------------------------------------------------------

from:https://blog.csdn.net/Tommy666666/article/details/80256174

以將中斷向量表偏移地址改到0x8005000為例

第一種方式, 暫存器法:

設定system_stm32f1xx.c檔案  #defineVECT_TAB_OFFSET  0x5000 

在void SystemInit (void)函式中通過“SCB->VTOR =FLASH_BASE | VECT_TAB_OFFSET”命令實現地址偏移

 

第二種方式 庫函式法:

運用庫函式時,可以在main()函式開頭,加上

  NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x5000);__ASM("CPSIE  I"); 命令實現地址偏移

NVIC_VectTab_FLASH 和 FLASH_BASE 都為 0x08000000

 

三  相對應的連結配置設定

 

要實現這個功能,還需要在MDK的option->target 配置IROM1為0x8005000,如圖