日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

STM32向量表详细分析

發布時間:2025/4/5 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32向量表详细分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

預備知識:

DCD指令:用于分配一片連續的字存儲單元(32bit),并將表達式的值初始化給該字存儲單元,類似于C中定義數組并初始化。比如: 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后面表達式的名稱可以看出第一個字存儲單元分配給了棧頂,其值為__initial_sp。第二個字分配給了復位地址,其值為Reset_Handler,后面接著分配給其他異常或中斷。

這里的Reset_Handler,NMIException等,其實是一個地址值,也就是中斷處理函數的入口地址。在函數實現時,由編譯器分配一個地址值。

那么這里就有兩個問題。

第一個是為什么是這樣的分配順序?

第二個是DCD后面表達式的值,即各個中斷函數的地址值如Reset_Handler,NMIException是如何分配的?

第一個問題的答案好找,我們參考《STM32參考手冊》:

可以看到,啟動文件中的向量表的分配的順序是按照固定的規則來的。

第二個問題。隨意打開一份編譯過的工程,工程配置如下:

我們可以看到.map文件有這樣一段:

同時使用J-Link打開.hex文件可以看到

?

從hex檔,我們可以看到Flash的起始區域0x8000000的內容為

0x20000660

0x0800027D

0x08000281

0x08000283

……

剛好可以和map文件對應,也剛好可以和啟動文件的向量表對應。

按照Cortex-M3權威指南,在復位后,有如下動作:


?

?

? ? 我這里是選擇從flash啟動,根據寄存器映射,Address從0x00000000映射到0x08000000。所以hex檔的內容剛好滿足復位序列的設定。

由此從啟動文件到.map文件再到.hex文檔,再到CM3復位啟動的脈絡就理清了。

總結

以上是生活随笔為你收集整理的STM32向量表详细分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。