博客專欄

        EEPW首頁 > 博客 > 為什么 STM32 的起始地址不是 0 ?

        為什么 STM32 的起始地址不是 0 ?

        發(fā)布人:魚鷹談單片機(jī) 時(shí)間:2021-11-21 來源:工程師 發(fā)布文章

        以下文章來源于安富萊電子 ,作者Eric2013

        背景知識(shí)

            M3,M4內(nèi)核芯片上電復(fù)位后,要固定從0x0000 0000地址讀取中斷向量表,獲取復(fù)位中斷服務(wù)程序的入口地址后,進(jìn)入復(fù)位中斷服務(wù)程序,其中0x0000 0004存的是復(fù)位中斷服務(wù)程序地址。

        1.png2.png

        引出問題

            既然ARM規(guī)定了M3,M4內(nèi)核要從地址0x0000 0000讀取中斷向量表,而STM32設(shè)置Flash地址到0x0800 0000怎么辦?

            STM32支持了個(gè)內(nèi)存重映射功能,將地址0x0800 0000開始的內(nèi)容重映射到首地址0x0000 0000中,這樣就解決了從0x0000 0000讀取中斷向量表的問題。

        圖示,以STM32F407IGT6為例,0x0000 0000和0x0800 0000開始的程序?qū)Ρ龋?/p>

        3.png

        那么新的問題來:

        (1) 你怎么保證0x08000 0000首地址存的就是中斷向量表,我們不可以隨意設(shè)置嗎?

            保證中斷向量表存到0x0800 0000,這個(gè)涉及到分散加載的一個(gè)小知識(shí),以MDK為例,如果大家看xxx.S啟動(dòng)文件,里面通過AREA定義了一個(gè)名叫RESET的段,這段存的就是中斷向量表。

        4.png

            這個(gè)名字很重要,MDK對(duì)應(yīng)的xxx.sct分散加載里面通過下面這句將這個(gè)RESET段放在了0x0800 0000優(yōu)先存儲(chǔ)。

        5.png

            這樣我們就解決了0x0800 0000首地址存儲(chǔ)中斷向量表,一旦程序開始運(yùn)行后,我們就可以隨意設(shè)置中斷向量表的位置了。比如想將中斷向量表存到內(nèi)部SRAM,我們就可以操作寄存器SCB->VTOR 重新安排,然后將

        0x0800 0000的內(nèi)容復(fù)制到設(shè)置的地址內(nèi)即可。

        (2) 既然設(shè)置到0x0800 0000這么麻煩,為什么不直接使用0x0000 0000?

            這是因?yàn)镾TM32不僅可以從內(nèi)部Flash啟動(dòng),還可以從系統(tǒng)存儲(chǔ)器(可以實(shí)現(xiàn)串口ISP,USB DFU等程序下載方式)和從內(nèi)部SRAM啟動(dòng),

            我們將內(nèi)部Flash安排到0x0000 0000顯然是不行的。這樣會(huì)導(dǎo)致系統(tǒng)存儲(chǔ)器或者內(nèi)部SRAM無法重映射到0x0000 0000了。

        6.png

        了解了M3和M4,使用M7是怎么個(gè)執(zhí)行情況呢?

            M7內(nèi)核芯片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問題,以STM32H7為例,可以從 0x0000 0000 到 0x3FFF 0000 所有地址進(jìn)行啟動(dòng)。

            專門安排了個(gè)選項(xiàng)字節(jié)來配置。

        7.png

        *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



        關(guān)鍵詞: 單片機(jī)

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 满洲里市| 华池县| 台前县| 嘉兴市| 化州市| 确山县| 额尔古纳市| 阜阳市| 佛冈县| 南投市| 迁安市| 兖州市| 志丹县| 瓦房店市| 奉贤区| 电白县| 诸城市| 宁国市| 宜黄县| 扬州市| 含山县| 额济纳旗| 北京市| 临高县| 宜阳县| 安平县| 大姚县| 唐河县| 牙克石市| 西吉县| 邓州市| 手机| 贵港市| 汝城县| 正定县| 孝感市| 酒泉市| 抚顺县| 治县。| 宾阳县| 娄底市|