您好,登錄后才能下訂單哦!
一、啟動模式,決定向量表的位置
當CPU上電后,首先代碼區(Flash)應該從地址為0x00000000開始,而數據區(SRAM)應該從0x20000000開始,Cortex - M3 CPU總是通過代碼區獲得復位向量。STM32F10XXX微處理器中運用了特殊的機制使得STM32不僅可以通過Flash(主閃存和系統閃存)啟動,同時還可以從SRAM中啟動。
STM32 有下面3種啟動方式:
關于Main Flash/System Memory/SRAM 可以參見下面內存映射:
從上圖可以看出 0x00000000 - 0x08000000 之間這128M空間是預留的,該區稱為Boot Memory Space(Aliased to Flash or systen memory depending on BOOT pins)。
(1)從Main Flash 啟動:Boot Space 是Main Flash 的別名。以0x08000000 對應的內存為例,則該塊內存既可以通過0x00000000 操作也可以通過0x08000000 操作,且都是操作的同一塊內存
(2)從System Memory啟動:Boot Space 是System Memory的別名。以0x1FFFFFF0對應的內存為例,則該塊內存既可以通過0x00000000 操作也可以通過0x1FFFFFF0操作,且都是操作的同一塊內存
(3)從SRAM 啟動:SRAM 只能通過0x20000000進行操作,與上述兩者不同 。從SRAM 啟動時,需要在應用程序初始化代碼中重新設置向量表的位置。
eg:void SystemInit (void)
{
...... #ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH.*/ #endif
}
二、向量表解析
分析STM32的啟動文件startup_stm32f10x_hd.s(大容量)主要做了以下事情:
(1)設置初始堆棧指針(SP)
(2)設置初始程序計數器(PC)為復位向量,并在執行main函數前初始化系統時鐘
(3)設置向量表入口為異常事件的入口地址
(4)復位之后處理器為線程模式,優先級為特權級,堆棧設置為MSP主堆棧
三、開機實際運行過程
通過仿真器仿真,發現開機后程序就直接跳轉到Reset_Handler,從.map文件看Reset_Handler的地址是0x080003a5并不是0x08000000(因為此時是從Flash中啟動的,故應該是0x08000000)。那么STM32是如何從0x08000000過渡到0x080003a5?
查看Cortex - M3權威指南中文版本中復位序列中相應的說明:
也就是說上電復位的時候,剛開始CPU的主動權還是掌握在CM3中。CM3執行了寄存器的初始化及取復位向量表并執行!
這個絕大多數單片機不同,傳統的ARM架構總是從0地址開始執行,并且0地址是有一條跳轉指令的。在CM3中0地址處存的是MSP的位置,這并不是執行指令只是一個數據表。
另外還有一個問題,如何進入到復位序列?
觸發STM32進入復位序列的有以下條件:
(1)System reset
(2)Power reset
(3)Backup domain reset
剛上電時就是通過Power reset 進入到復位序列!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。