lanmanck原創】
我們也知道怎麼跳到main函式了,那麼,中斷發生後,又是怎麼跑到中斷入口位址的呢?
area reset, data, readonly ; 定義唯讀資料段,實際上是在code區(假設stm32從flash啟動,則此中斷向量表起始位址即為0x8000000)
export __vectors
import os_cpu_systickhandler
import os_cpu_pendsvhandler
__vectors dcd __initial_sp ; top of stack
dcd reset_handler ; reset handler
dcd nmi_handler ; nmi handler
dcd hardfault_handler ; hard fault handler
dcd memmanage_handler ; mpu fault handler
dcd busfault_handler ; bus fault handler
dcd usagefault_handler ; usage fault handler
我們再結合cortex-m3的特性,他上電後根據boot引腳來決定pc位置,比如boot設定為flash啟動,則啟動後pc跳到0x08000000。此時cpu會先取2個位址,第乙個是棧頂位址,第二個是復位異常位址,故有了上面的寫法,這樣就跳到reset_handler。
那麼這個reset_handler的實際位址是多少.?下面的一堆例如nmi_handler位址又是多少呢?發生中斷是怎麼跑到這個位址的呢?下面挨個講解。
1、我們可以通過反向來得知這些入口位址,檢視工程下的map檔案就可以看到了,這個位址跟keil裡面設定的target->flash起始位址息息相關,實際上我們不太需要關心,讓編譯器分配,中斷向量表放的就是他們的位址。
2、對比arm7/arm9核心,cortex-m3核心則是固定了中斷向量表的位置而起始位址是可變化的。
3、進到c語言後會先配置nvic,nvic_setvectortable()裡面可以配置中斷向量表的起始位址和偏移,主要是告訴cpu該向量表是位於flash還是ram,偏移是多少。例如設定為位於flash內,偏移就是燒入的程式位址,可在keil target中設定。這樣cpu就知道入口位址了。
4、發生中斷後,cpu找到中斷向量表位址,然後根據偏移(對號入座)再找到中斷位址,這樣就跳過去了。
我們截乙個圖說明一下,map檔案:
顯然,200039c0就是棧頂位址,而08006f21就是reset_handler位址!
如何定位?以放到0x20000000為例
1、keil設定ram起始為0x20000100,我們在0x20000000~0x20000100放中斷向量表,其他給程式用
2、設定nvic_setvectortable(nvic_vecttab_flash,0); 設定nvic_setvectortable(nvic_vecttab_ram,0);
3、跳到c時把中斷向量表拷貝到0x20000000
STM32 中斷向量表的位置 重定向
lanmanck原創 這篇文章已經說了stm32的啟動過程 我們也知道怎麼跳到main函式了,那麼,中斷發生後,又是怎麼跑到中斷入口位址的呢?從stm32f10x.s可以看到,已經定義好了一大堆的中斷響應函式,這就是中斷向量表,標號 vectors,表示中斷向量表入口位址,例如 area reset...
STM32中斷向量表偏移位址配置方法
以將中斷向量表偏移位址改到0x8005000為例 第一種方式 設定system stm32f1xx.c檔案 definevect tab offset 0x5000 在void systeminit void 函式中通過 scb vtor flash base vect tab offset 命令實...
STM32 中斷巢狀向量表以及中斷分組的介紹
stm32 cortex m3 中有兩個優先順序的概念 搶占式優先順序和響應優先順序,有人把響應優先順序稱作 亞優先順序 或 副優先順序 每個中斷源都需要被指定這兩種優先順序。具有高搶占式優先順序的中斷可以在具有低搶占式優先順序的中斷處理過程中被響應,即中斷巢狀,或者說高搶占式優先順序的中斷可以巢狀...