新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 關于STM32中斷向量表的位置 、重定向問題

        關于STM32中斷向量表的位置 、重定向問題

        作者: 時間:2016-11-13 來源:網絡 收藏
        首先我們需要跳到main函數,這個就不多說了。那么,中斷發生后,又是怎么跑到中斷入口地址的呢?

        從stm32f10x.s可以看到,已經定義好了一大堆的中斷響應函數,這就是中斷向量表,標號__Vectors,表示中斷向量表入口地址,例如:
        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

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

        我們再結合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就知道入口地址了。

        本文引用地址:http://www.104case.com/article/201611/316107.htm

        4、發生中斷后,CPU找到中斷向量表地址,然后根據偏移(對號入座)再找到中斷地址,這樣就跳過去了。
        我們截一個圖說明一下,map文件:

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

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

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

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

        2、設置NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜宾市| 金湖县| 凤阳县| 恩平市| 株洲市| 哈密市| 茌平县| 皋兰县| 望都县| 大洼县| 淅川县| 远安县| 韶山市| 黑河市| 莆田市| 兴城市| 慈溪市| 鹤岗市| 青龙| 天峨县| 日照市| 成安县| 安西县| 鄢陵县| 丰宁| 金沙县| 呼伦贝尔市| 礼泉县| 牙克石市| 措美县| 西盟| 临沂市| 治县。| 东乌珠穆沁旗| 福贡县| 阳原县| 潍坊市| 峡江县| 双牌县| 封丘县| 汉川市|