• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 設計應用 > 深入理解MCU啟動原理

    深入理解MCU啟動原理

    作者: 時間:2025-01-23 來源: 收藏

    最開始一啟動后去哪里讀代碼?

    本文引用地址:http://www.czjhyjcfj.com/article/202501/466577.htm

    CPU上電啟動后被設計為去地址0x00000000位置處讀取代碼;首先會連續讀取兩個字,分別是棧指針初始值和復位異常處理函數的地址;然后跳去執行復位異常處理函數。

    640-3.png

    640-4.png

    當然在一些早期的ARM處理器設計中,如Arm7TDMI,復位后會直接讀取0地址處的代碼進行執行,由軟件初始化棧指針,0地址處存放的直接就是中斷處理函數,而不是函數地址。所以我們可以有理由推測出,第一個字是棧地址是因為接下來的復位中斷處理函數涉及函數跳轉,可能已經需要存放內容在棧里了。

    0x0地址處是bootROM代碼嗎,還是用戶bootloader代碼?

    答案是都可以,這其實取決于用戶的代碼是存放在哪里的。比如說對于一些性能強的(如Cortex-A系列)來說,代碼本身體積比較大,存放在SD卡里或者QSPI/SPI Flash里都有可能,這些啟動一定是先去bootROM執行代碼,因為SD卡、SPI Flash的儲存不在MCU的統一編址空間里,沒初始化這些外設前根本無法訪問,bootROM這塊Nor Flash就一定是可以被MCU直接通過總線地址訪問的,0地址的代碼位于bootROM中。

    代碼從bootROM中起來后,通過啟動引腳判斷從哪個外設中搬用戶程序,并去初始化相應外設,將外設中存儲的用戶代碼搬到內部SRAM中執行。后續的啟動流程不贅述。

    640-5.png

    對于一些小容量的MCU來說,比如Cortex-M3/M4,他們的芯片里有內置Flash,這個Flash的特點跟上面說的bootROM很像,是MCU可以直接通過地址總線去訪問到的,不需要進行外設初始化的。當然,這些MCU內部也是有bootROM的,因此這些MCU一上電可以選擇從bootROM中啟動,也可以選擇從內置Flash中啟動,是通過外部引腳進行選擇的,選擇了誰,就把誰的起始地址映射到0地址處。

    640-6.png

    類似Cortex-M3/M4是如何保證Flash起始地址是棧指針和復位異常處理函數指針的?

    這一點實際是通過編譯的鏈接文件制定的。比如說如下是我截取的IAR的鏈接文件.icf。

    640-7.png

    MCU有可能不從0地址開始讀代碼嗎?

    M7內核芯片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問題,以STM32H7為例,可以從0x0000 0000到0x3FFF 0000所有地址進行啟動。專門安排了個選項字節來配置。



    關鍵詞: MCU

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 岱山县| 五大连池市| 冀州市| 耿马| 库车县| 怀柔区| 周口市| 仙桃市| 葫芦岛市| 鄂尔多斯市| 宁城县| 九台市| 昆明市| 那曲县| 吉安县| 鄂伦春自治旗| 景洪市| 松滋市| 岢岚县| 侯马市| 宁国市| 常山县| 奉贤区| 郴州市| 许昌县| 项城市| 和平县| 内黄县| 阳春市| 金华市| 静安区| 隆安县| 平果县| 方正县| 青川县| 靖江市| 岑巩县| 元朗区| 五原县| 界首市| 海安县|