<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于STM32中斷向量表的位置 、重定向問題

          關(guān)于STM32中斷向量表的位置 、重定向問題

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

          從stm32f10x.s可以看到,已經(jīng)定義好了一大堆的中斷響應(yīng)函數(shù),這就是中斷向量表,標號__Vectors,表示中斷向量表入口地址,例如:
          AREA RESET, DATA, READONLY ; 定義只讀數(shù)據(jù)段,實際上是在CODE區(qū)(假設(shè)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

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

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

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

          1、我們可以通過反向來得知這些入口地址,查看工程下的map文件就可以看到了,這個地址跟keil里面設(shè)置的target->flash起始地址息息相關(guān),實際上我們不太需要關(guān)心,讓編譯器分配,中斷向量表放的就是他們的地址。
          2、對比ARM7/ARM9內(nèi)核,Cortex-M3內(nèi)核則是固定了中斷向量表的位置而起始地址是可變化的。
          3、進到C語言后會先配置NVIC,NVIC_SetVectorTable()里面可以配置中斷向量表的起始地址和偏移,主要是告訴CPU該向量表是位于Flash還是Ram,偏移是多少。例如設(shè)置為位于Flash內(nèi),偏移就是燒入的程序地址,可在Keil target中設(shè)置。這樣CPU就知道入口地址了。

          本文引用地址:http://www.ex-cimer.com/article/201611/316107.htm

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

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

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

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

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

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

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



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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();