1、MCU最開始一啟動(dòng)后去哪里讀代碼?
CPU上電啟動(dòng)后被設(shè)計(jì)為去地址0x00000000位置處讀取代碼;首先會(huì)連續(xù)讀取兩個(gè)字,分別是棧指針初始值和復(fù)位異常處理函數(shù)的地址;然后跳去執(zhí)行復(fù)位異常處理函數(shù)。
當(dāng)然在一些早期的ARM處理器設(shè)計(jì)中,如Arm7TDMI,復(fù)位后會(huì)直接讀取0地址處的代碼進(jìn)行執(zhí)行,由軟件初始化棧指針,0地址處存放的直接就是中斷處理函數(shù),而不是函數(shù)地址。
所以我們可以有理由推測(cè)出,第一個(gè)字是棧地址是因?yàn)榻酉聛?lái)的復(fù)位中斷處理函數(shù)涉及函數(shù)跳轉(zhuǎn),可能已經(jīng)需要存放內(nèi)容在棧里了。
2. 0x0地址處是bootROM代碼嗎,還是用戶bootloader代碼?
答案是都可以。這其實(shí)取決于用戶的代碼是存放在哪里的。
比如說(shuō)對(duì)于一些性能強(qiáng)的MCU(如Cortex-A系列)來(lái)說(shuō),代碼本身體積比較大,存放在SD卡里或者QSPI/SPI Flash里都有可能,這些MCU啟動(dòng)一定是先去bootROM執(zhí)行代碼,因?yàn)镾D卡、SPI Flash的儲(chǔ)存不在MCU的統(tǒng)一編址空間里,沒初始化這些外設(shè)前根本無(wú)法訪問(wèn),bootROM這塊Nor Flash就一定是可以被MCU直接通過(guò)總線地址訪問(wèn)的,0地址的代碼位于bootROM中。
代碼從bootROM中起來(lái)后,通過(guò)啟動(dòng)引腳判斷從哪個(gè)外設(shè)中搬用戶程序,并去初始化相應(yīng)外設(shè),將外設(shè)中存儲(chǔ)的用戶代碼搬到內(nèi)部SRAM中執(zhí)行。后續(xù)的啟動(dòng)流程不贅述。
對(duì)于一些小容量的MCU來(lái)說(shuō),比如Cortex-M3/M4,他們的芯片里有內(nèi)置Flash,這個(gè)Flash的特點(diǎn)跟上面說(shuō)的bootROM很像,是MCU可以直接通過(guò)地址總線去訪問(wèn)到的,不需要進(jìn)行外設(shè)初始化的。
當(dāng)然,這些MCU內(nèi)部也是有bootROM的,因此這些MCU一上電可以選擇從bootROM中啟動(dòng),也可以選擇從內(nèi)置Flash中啟動(dòng),是通過(guò)外部引腳進(jìn)行選擇的,選擇了誰(shuí),就把誰(shuí)的起始地址映射到0地址處。
3. 類似Cortex-M3/M4是如何保證Flash起始地址是棧指針和復(fù)位異常處理函數(shù)指針的?
這一點(diǎn)實(shí)際是通過(guò)編譯的鏈接文件制定的。比如說(shuō)如下是我截取的IAR的鏈接文件.icf。
4. MCU有可能不從0地址開始讀代碼嗎?
M7內(nèi)核芯片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問(wèn)題,以STM32H7為例,可以從 0x0000 0000 到 0x3FFF 0000 所有地址進(jìn)行啟動(dòng)。專門安排了個(gè)選項(xiàng)字節(jié)來(lái)配置。
審核編輯:劉清
-
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354223 -
SD卡
+關(guān)注
關(guān)注
2文章
558瀏覽量
63724 -
ARM處理器
+關(guān)注
關(guān)注
6文章
360瀏覽量
41628 -
SRAM芯片
+關(guān)注
關(guān)注
0文章
65瀏覽量
12043 -
MCU芯片
+關(guān)注
關(guān)注
3文章
246瀏覽量
11348
原文標(biāo)題:深入理解MCU啟動(dòng)原理
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論