在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 中斷向量表的位置 、重定向

            STM32 中斷向量表的位置 、重定向

            作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏
            我們也知道怎么跳到main函數(shù)了,那么,中斷發(fā)生后,又是怎么跑到中斷入口地址的呢?

            從stm32f10x.s可以看到,已經(jīng)定義好了一大堆的中斷響應(yīng)函數(shù),這就是中斷向量表,標(biāo)號(hào)__Vectors,表示中斷向量表入口地址,例如:

            本文引用地址:http://www.biyoush.com/article/201611/317112.htm

            AREA RESET, DATA, READONLY ;定義只讀數(shù)據(jù)段,實(shí)際上是在CODE區(qū)(假設(shè)STM32從FLASH啟動(dòng),則此中斷向量表起始地址即為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

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

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

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

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

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

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

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

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

            對(duì)應(yīng)的bin文件,看是不是放的上面地址:

            顯然,200039c0就是棧頂?shù)刂罚?8006F21就是reset_handler地址!

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

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

            2、設(shè)置NVIC_SetVectorTable(NVIC_VectTab_FLASH,0);

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



            關(guān)鍵詞: STM32中斷向量表重定

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉