STM32/ARM Cortex-M3復位序列
在離開復位狀態(tài)后,CM3做的第一件事就是讀取下列兩個32位整數(shù)的值:
1)從地址0x0000 0000 處取出MSP的初始值
2)從地址0x0000 0004 處取出PC的初始值——這個值是復位向量,LSB必須是1.然后從這個值所對應的地址處取指,如下圖1所示。
圖1
請注意,這與傳統(tǒng)的ARM架構(gòu)不同——其實也和其它大多數(shù)的單片機不同。傳統(tǒng)的ARM架構(gòu)總是從0地址開始執(zhí)行第一條指令,并且這是一條跳轉(zhuǎn)指令。在CM3中,在0地址提供的是MSP的初始值,然后緊跟著的是向量表(向量表在以后還可以轉(zhuǎn)移到其它位置)。向量表中的數(shù)值是32位的地址,而不是跳轉(zhuǎn)指令。向量表的第一個條目指向復位后應執(zhí)行的第一條指令。
因為CM3使用的是向下生長的滿棧,所以MSP得初始值必須是堆棧內(nèi)存的末地址加1.舉例來說:
如果堆棧區(qū)域在0x20007C00~0x20007FFF之間,那么MSP的初始值就必須是0x20008000.
向量表跟隨在MSP的初始值之后——也就是第2個表目。要注意因為CM3是在Thumb態(tài)下執(zhí)行,所以向量表中的每個數(shù)值必須把LSB置1(也就是奇數(shù))。正因為這個原因,圖2使用0x101來表達地址0x100.當0x100處的指令dedao執(zhí)行后,就正式開始了程序的執(zhí)行。在此之前初始化MSP是必須的,因為有可能第一條指令還沒來得及執(zhí)行,就發(fā)生了NMI或者其他fault。MSP初始化好后,就已經(jīng)為它們的服務例程準備好了堆棧。
圖2
對于不同的開發(fā)工具,需要使用不同的格式來設置MSP初值和復位向量——有些則由開發(fā)工具自行計算并生成。如果要獲知細節(jié),最快的辦法就是參考開發(fā)工具提供的一個示例工程。