STM32向量表详细分析
預(yù)備知識:
DCD指令:用于分配一片連續(xù)的字存儲單元(32bit),并將表達(dá)式的值初始化給該字存儲單元,類似于C中定義數(shù)組并初始化。比如: DCD 0 的意思是:分配一個字存儲單元,并將該單元初始化為0。
分析:
在STM32的啟動文件中可以看到有如下代碼:
????EXPORT __Vectors
__Vectors
????DCD __initial_sp ; Top of Stack
????DCD Reset_Handler
????DCD NMIException
????DCD HardFaultException
????DCD MemManageException
????DCD BusFaultException
????DCD UsageFaultException
????DCD 0 ; Reserved
????DCD 0 ; Reserved
????DCD 0 ; Reserved
????DCD 0 ; Reserved
????DCD SVCHandler
????DCD DebugMonitor
????DCD 0 ; Reserved
????DCD OSPendSV
……
這一段是分配STM32的中斷向量表。從DCD后面表達(dá)式的名稱可以看出第一個字存儲單元分配給了棧頂,其值為__initial_sp。第二個字分配給了復(fù)位地址,其值為Reset_Handler,后面接著分配給其他異常或中斷。
這里的Reset_Handler,NMIException等,其實(shí)是一個地址值,也就是中斷處理函數(shù)的入口地址。在函數(shù)實(shí)現(xiàn)時,由編譯器分配一個地址值。
那么這里就有兩個問題。
第一個是為什么是這樣的分配順序?
第二個是DCD后面表達(dá)式的值,即各個中斷函數(shù)的地址值如Reset_Handler,NMIException是如何分配的?
第一個問題的答案好找,我們參考《STM32參考手冊》:
可以看到,啟動文件中的向量表的分配的順序是按照固定的規(guī)則來的。
第二個問題。隨意打開一份編譯過的工程,工程配置如下:
我們可以看到.map文件有這樣一段:
同時使用J-Link打開.hex文件可以看到
?
從hex檔,我們可以看到Flash的起始區(qū)域0x8000000的內(nèi)容為
0x20000660
0x0800027D
0x08000281
0x08000283
……
剛好可以和map文件對應(yīng),也剛好可以和啟動文件的向量表對應(yīng)。
按照Cortex-M3權(quán)威指南,在復(fù)位后,有如下動作:
?
?
? ? 我這里是選擇從flash啟動,根據(jù)寄存器映射,Address從0x00000000映射到0x08000000。所以hex檔的內(nèi)容剛好滿足復(fù)位序列的設(shè)定。
由此從啟動文件到.map文件再到.hex文檔,再到CM3復(fù)位啟動的脈絡(luò)就理清了。
總結(jié)
以上是生活随笔為你收集整理的STM32向量表详细分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信跳一跳 终结者
- 下一篇: SecureCRT中Python脚本编写