<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32學(xué)習記錄12 中斷向量表

STM32學(xué)習記錄12 中斷向量表

作者: 時(shí)間:2016-11-13 來(lái)源:網(wǎng)絡(luò ) 收藏
從stm32f10x.s可以看到,已經(jīng)定義好了一大堆的中斷響應函數,這就是中斷向量表,標號__Vectors,表示中斷向量表入口地址,例如:

AREA RESET, DATA, READONLY ;定義只讀數據段,實(shí)際上是在CODE區(假設STM32從FLASH啟動(dòng),則此中斷向量表起始地址即為0x8000000)
EXPORT __Vectors
IMPORT OS_CPU_SysTickHandler
IMPORT OS_CPU_PendSVHandler

本文引用地址:http://dyxdggzs.com/article/201611/316188.htm

__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

這個(gè)向量表的編寫(xiě)是有講究的,跟硬件一一對應不能亂寫(xiě)的,CPU找入口地址就靠它了,bin文件開(kāi)頭就是他們的地址,參考手冊RM0008的10.1.2節可以看到排列。

我們再結合CORTEX-M3的特性,他上電后根據boot引腳來(lái)決定PC位置,比如boot設置為flash啟動(dòng),則啟動(dòng)后PC跳到0x08000000。此時(shí)CPU會(huì )先取2個(gè)地址,第一個(gè)是棧頂地址,第二個(gè)是復位異常地址,故有了上面的寫(xiě)法,這樣就跳到reset_handler。

那么這個(gè)reset_handler的實(shí)際地址是多少.?下面的一堆例如Nmi_handler地址又是多少呢?發(fā)生中斷是怎么跑到這個(gè)地址的呢?下面挨個(gè)講解。

1、我們可以通過(guò)反向來(lái)得知這些入口地址,查看工程下的map文件就可以看到了,這個(gè)地址跟keil里面設置的target->flash起始地址息息相關(guān),實(shí)際上我們不太需要關(guān)心,讓編譯器分配,中斷向量表放的就是他們的地址。

2、對比ARM7/ARM9內核,Cortex-M3內核則是固定了中斷向量表的位置而起始地址是可變化的。

3、進(jìn)到C語(yǔ)言后會(huì )先配置NVIC,NVIC_SetVectorTable()里面可以配置中斷向量表的起始地址和偏移,主要是告訴CPU該向量表是位于Flash還是Ram,偏移是多少。例如設置為位于Flash內,偏移就是燒入的程序地址,可在Keil target中設置。這樣CPU就知道入口地址了。

4、發(fā)生中斷后,CPU找到中斷向量表地址,然后根據偏移(對號入座)再找到中斷地址,這樣就跳過(guò)去了。

我們截一個(gè)圖說(shuō)明一下,map文件:

對應的bin文件,看是不是放的上面地址:

顯然,200039c0就是棧頂地址,而08006F21就是reset_handler地址!

如何定位?以放到0x20000000為例

1、keil設置ram起始為0x20000100,我們在0x20000000~0x20000100放中斷向量表,其他給程序用

2、設置NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);

3、跳到C時(shí)把中斷向量表拷貝到0x20000000



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>