STM32F10X的boot分析
尊重原著版權:http://www.bubuko.com/infodetail-1610468.html
轉載于:http://www.bubuko.com/infodetail-1610468.html
一、啟動模式,決定向量表的位置
?????當CPU上電后,首先代碼區(Flash)應該從地址為0x00000000開始,而數據區(SRAM)應該從0x20000000開始,Cortex - M3 CPU總是通過代碼區獲得復位向量。STM32F10XXX微處理器中運用了特殊的機制使得STM32不僅可以通過Flash(主閃存和系統閃存)啟動,同時還可以從SRAM中啟動。
關于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 進入到復位序列!
總結
以上是生活随笔為你收集整理的STM32F10X的boot分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 各种烧写文件格式简介-ELF Hex B
- 下一篇: C语言中malloc为字符型指针分配内存