天天看點

Cotex-M3之複位

複位序列

在離開複位狀态後,CM3 做的第一件事就是讀取下列兩個32 位整數的值:

 從位址 0x0000,0000 處取出MSP 的初始值。

 從位址 0x0000,0004 處取出PC 的初始值——這個值是複位向量,LSB 必須是1。然

後從這個值所對應的位址處取指。

Cotex-M3之複位

圖3.17 複位序列

請注意,這與傳統的ARM 架構不同——其實也和絕大多數的其它單片機不同。傳統的

ARM 架構總是從0 位址開始執行第一條指令。它們的0 位址處總是一條跳轉指令。在CM3

中,0 位址處提供MSP 的初始值,然後就是向量表(向量表在以後還可以被移至其它位置)。

向量表中的數值是32 位的位址,而不是跳轉指令。向量表的第一個條目指向複位後應執行

的第一條指令。

Cotex-M3之複位

圖3.18 初始MSP 及PC 初始化的一個範例

因為CM3 使用的是向下生長的滿棧,是以MSP 的初始值必須是堆棧記憶體的末位址加1。

舉例來說,如果你的堆棧區域在0x20007C00‐0x20007FFF 之間,那麼MSP 的初始值就必須是

0x20008000。

向量表跟随在MSP 的初始值之後——也就是第2 個表目。要注意因為CM3 是在Thumb

态下執行,是以向量表中的每個數值都必須把LSB 置1(也就是奇數)。正是因為這個原因,

圖3.18 中使用0x101 來表達位址0x100。當0x100 處的指令得到執行後,就正式開始了程式

的執行。在此之前初始化MSP 是必需的,因為可能第1 條指令還沒執行就會被NMI 或是其

它fault 打斷。MSP 初始化好後就已經為它們的服務例程準備好了堆棧。

對于不同的開發工具,需要使用不同的格式來設定MSP 初值和複位向量——有些則由

開發工具自行計算。如果想要獲知細節,最快的辦法就是參考開發工具提供的一個示例工程。

本書的第10 章和第20 章介紹ARM 提供的開發工具,第19 章則介紹GCC 工具鍊。

複位信号

基于CM3的單片機對複位電路有特定的要求,具體内容在《Cortex‐M3 Technical

Reference Manual(Ref1)》中給出,它列出了若幹個可以使用的複位信号。不過,實作成單片

機後,往往隻用到了1至2個。至餘其它的,晶片廠商會在晶片中布設複位信号發生器,由它

在内部産生剩餘的複位信号。細節需要參考制造商提供的資料手冊,以擷取如何正确複位其

晶片的資訊。在CM3處理器的水準上,複位信号由表6.3列出。

Cotex-M3之複位
Cotex-M3之複位

圖6.5 典型的Cortex-M3晶片内部複位信号和其作用範圍示意圖

Cortex-M3 複位方式

通過處理器設計中出現的複位信号,使用者可以單獨對設計中的不同元件進行複位。表

6-4 列出了這些複位信号和他們的組合形式,以及可能的應用。

Cotex-M3之複位
Cotex-M3之複位

繼續閱讀