91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

STM32 開機流程分析

發布時間:2020-06-13 20:07:42 來源:網絡 閱讀:4857 作者:xichubaw 欄目:編程語言

一、啟動模式,決定向量表的位置

     當CPU上電后,首先代碼區(Flash)應該從地址為0x00000000開始,而數據區(SRAM)應該從0x20000000開始,Cortex - M3 CPU總是通過代碼區獲得復位向量。STM32F10XXX微處理器中運用了特殊的機制使得STM32不僅可以通過Flash(主閃存和系統閃存)啟動,同時還可以從SRAM中啟動。


  STM32 有下面3種啟動方式:

STM32 開機流程分析

關于Main Flash/System Memory/SRAM 可以參見下面內存映射:

STM32 開機流程分析

從上圖可以看出 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主堆棧


STM32 開機流程分析


三、開機實際運行過程

通過仿真器仿真,發現開機后程序就直接跳轉到Reset_Handler,從.map文件看Reset_Handler的地址是0x080003a5并不是0x08000000(因為此時是從Flash中啟動的,故應該是0x08000000)。那么STM32是如何從0x08000000過渡到0x080003a5?

查看Cortex - M3權威指南中文版本中復位序列中相應的說明:

STM32 開機流程分析

也就是說上電復位的時候,剛開始CPU的主動權還是掌握在CM3中。CM3執行了寄存器的初始化及取復位向量表并執行!

這個絕大多數單片機不同,傳統的ARM架構總是從0地址開始執行,并且0地址是有一條跳轉指令的。在CM3中0地址處存的是MSP的位置,這并不是執行指令只是一個數據表。

另外還有一個問題,如何進入到復位序列?

 觸發STM32進入復位序列的有以下條件:

(1)System reset

(2)Power reset

(3)Backup domain reset

剛上電時就是通過Power reset 進入到復位序列!


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和政县| 黑山县| 越西县| 贵德县| 铜陵市| 九龙城区| 囊谦县| 若羌县| 临湘市| 株洲市| 德惠市| 苗栗县| 文登市| 拉孜县| 江北区| 尉犁县| 新巴尔虎右旗| 桐柏县| 若尔盖县| 天水市| 肥城市| 华蓥市| 陕西省| 穆棱市| 怀柔区| 精河县| 石泉县| 仪陇县| 吴川市| 连城县| 克拉玛依市| 伊宁市| 巨野县| 常熟市| 嘉义市| 南川市| 万全县| 宜都市| 昔阳县| 昌邑市| 景谷|