講解中斷偏移之前先看一下程式的啟動流程
的內部快閃儲存器(
flash
)位址起始於
0x08000000
,一般情況下,程式檔案就從此
位址開始寫入。此外
stm32f4
是基於
cortex-m4
核心的微控制器,其內部通過一張「中斷向
量表」來響應中斷,程式啟動後,將首先從「中斷向量表」取出復位中斷向量執行復位中斷程
序完成啟動,而這張「中斷向量表」的起始位址是
0x08000004
,當中斷來臨,
stm32f4
的內
部硬體機制亦會自動將
pc 指標定位到「中斷向量表」處,並根據中斷源取出對應的中斷向量
執行中斷服務程式。
在圖 55.1.1
中,stm32f4
在復位後,先從
0x08000004
位址取出復位中斷向量的位址,並
跳轉到復位中斷服務程式,如圖示號①所示;在復位中斷服務程式執行完之後,會跳轉到我們 的
main
函式,如圖示號②所示;而我們的
main
函式一般都是乙個死迴圈,在
main
函式執行過
程中,如果收到中斷請求(發生重中斷),此時
stm32f4
強制將
pc 指標指回中斷向量表處,
如圖示號③所示;然後,根據中斷源進入相應的中斷服務程式,如圖示號④所示;在執行完中
斷服務程式以後,程式再次返回
main
函式執行,如圖示號⑤所示。
① 直接操作暫存器
之前我們講解過,在系統啟動的時候,會首先呼叫
systeminit
函式初始化時鐘系統,同時systeminit
還完成了中斷向量表的設定,我們可以開啟
systeminit
函式,看看函式體的結尾處有
這樣幾行**:
scb->vtor = flash_base | 0x10000;
其中0x10000是偏移量。。也就是前面的iap程式所占用的空間大小,要是你的main函式中有systeminit();的話要在systeminit();之後新增。 其中
在庫檔案中有專門的乙個函式
其中/* vector table base----------------------------------*/
#define nvic_vecttab_ram ((u32)0x20000000)
#define nvic_vecttab_flash ((u32)0x08000000)
function name : nvic_setvectortable
* description : sets the vector table location andoffset.
* input : - nvic_vecttab: specifies if thevector table is in ram or
* flash memory.
void nvic_setvectortable (u32nvic_vecttab, u32 offset)
/* check the parameters */
assert_param(is_nvic_vecttab(nvic_vecttab));
assert_param(is_nvic_offset(offset));
scb->vtor = nvic_vecttab | (offset & (u32)0x1fffff80);
③修改庫檔案(不建議使用)
直接修改韌體庫裡面的數值。在void systeminit(void)下的
/* configure the vector table location add offsetaddress ------------------*/
#ifdefvect_tab_sram
scb->vtor = sram_base | vect_tab_offset;/* internal sram */
#else
scb->vtor = flash_base | vect_tab_offset;/* internal flash */
#endif
直接修改
#define vect_tab_offset 0x00 /*!< vector table base offset field.
this valuemust be a multiple of 0x200. */
為#define vect_tab_offset 0x10000 /*!< vector table base offsetfield.
this valuemust be a multiple of 0x200. */
stm32的flash都是從0x8000000開始的,結束位址看**的flash大小
stm32的sram都是從0x2000000開始的,結束位址看**的sram大小
iap程式基本預設就行,跟普通程式一樣
,不過也需要注意,保證偏移量為
0x200
的倍數(我們這裡為
0x1000
)。
STM32中斷向量表偏移位址配置方法
以將中斷向量表偏移位址改到0x8005000為例 第一種方式 設定system stm32f1xx.c檔案 definevect tab offset 0x5000 在void systeminit void 函式中通過 scb vtor flash base vect tab offset 命令實...
STM32 中斷向量表的位置 重定向
lanmanck原創 這篇文章已經說了stm32的啟動過程 我們也知道怎麼跳到main函式了,那麼,中斷發生後,又是怎麼跑到中斷入口位址的呢?從stm32f10x.s可以看到,已經定義好了一大堆的中斷響應函式,這就是中斷向量表,標號 vectors,表示中斷向量表入口位址,例如 area reset...
STM32中斷向量表的位置,重定向
lanmanck原創 我們也知道怎麼跳到main函式了,那麼,中斷發生後,又是怎麼跑到中斷入口位址的呢?area reset,data,readonly 定義唯讀資料段,實際上是在code區 假設stm32從flash啟動,則此中斷向量表起始位址即為0x8000000 export vectors ...