您好,登錄后才能下訂單哦!
一、啟動(dòng)模式,決定向量表的位置
當(dāng)CPU上電后,首先代碼區(qū)(Flash)應(yīng)該從地址為0x00000000開(kāi)始,而數(shù)據(jù)區(qū)(SRAM)應(yīng)該從0x20000000開(kāi)始,Cortex - M3 CPU總是通過(guò)代碼區(qū)獲得復(fù)位向量。STM32F10XXX微處理器中運(yùn)用了特殊的機(jī)制使得STM32不僅可以通過(guò)Flash(主閃存和系統(tǒng)閃存)啟動(dòng),同時(shí)還可以從SRAM中啟動(dòng)。
STM32 有下面3種啟動(dòng)方式:
關(guān)于Main Flash/System Memory/SRAM 可以參見(jiàn)下面內(nèi)存映射:
從上圖可以看出 0x00000000 - 0x08000000 之間這128M空間是預(yù)留的,該區(qū)稱為Boot Memory Space(Aliased to Flash or systen memory depending on BOOT pins)。
(1)從Main Flash 啟動(dòng):Boot Space 是Main Flash 的別名。以0x08000000 對(duì)應(yīng)的內(nèi)存為例,則該塊內(nèi)存既可以通過(guò)0x00000000 操作也可以通過(guò)0x08000000 操作,且都是操作的同一塊內(nèi)存
(2)從System Memory啟動(dòng):Boot Space 是System Memory的別名。以0x1FFFFFF0對(duì)應(yīng)的內(nèi)存為例,則該塊內(nèi)存既可以通過(guò)0x00000000 操作也可以通過(guò)0x1FFFFFF0操作,且都是操作的同一塊內(nèi)存
(3)從SRAM 啟動(dòng):SRAM 只能通過(guò)0x20000000進(jìn)行操作,與上述兩者不同 。從SRAM 啟動(dòng)時(shí),需要在應(yīng)用程序初始化代碼中重新設(shè)置向量表的位置。
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的啟動(dòng)文件startup_stm32f10x_hd.s(大容量)主要做了以下事情:
(1)設(shè)置初始堆棧指針(SP)
(2)設(shè)置初始程序計(jì)數(shù)器(PC)為復(fù)位向量,并在執(zhí)行main函數(shù)前初始化系統(tǒng)時(shí)鐘
(3)設(shè)置向量表入口為異常事件的入口地址
(4)復(fù)位之后處理器為線程模式,優(yōu)先級(jí)為特權(quán)級(jí),堆棧設(shè)置為MSP主堆棧
三、開(kāi)機(jī)實(shí)際運(yùn)行過(guò)程
通過(guò)仿真器仿真,發(fā)現(xiàn)開(kāi)機(jī)后程序就直接跳轉(zhuǎn)到Reset_Handler,從.map文件看Reset_Handler的地址是0x080003a5并不是0x08000000(因?yàn)榇藭r(shí)是從Flash中啟動(dòng)的,故應(yīng)該是0x08000000)。那么STM32是如何從0x08000000過(guò)渡到0x080003a5?
查看Cortex - M3權(quán)威指南中文版本中復(fù)位序列中相應(yīng)的說(shuō)明:
也就是說(shuō)上電復(fù)位的時(shí)候,剛開(kāi)始CPU的主動(dòng)權(quán)還是掌握在CM3中。CM3執(zhí)行了寄存器的初始化及取復(fù)位向量表并執(zhí)行!
這個(gè)絕大多數(shù)單片機(jī)不同,傳統(tǒng)的ARM架構(gòu)總是從0地址開(kāi)始執(zhí)行,并且0地址是有一條跳轉(zhuǎn)指令的。在CM3中0地址處存的是MSP的位置,這并不是執(zhí)行指令只是一個(gè)數(shù)據(jù)表。
另外還有一個(gè)問(wèn)題,如何進(jìn)入到復(fù)位序列?
觸發(fā)STM32進(jìn)入復(fù)位序列的有以下條件:
(1)System reset
(2)Power reset
(3)Backup domain reset
剛上電時(shí)就是通過(guò)Power reset 進(jìn)入到復(fù)位序列!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。