我們言簡意賅的普及下這個知識點,爭取讓大家不傷腦細(xì)胞。
背景知識
M3,M4內(nèi)核芯片上電復(fù)位后,要固定從0x0000 0000地址讀取中斷向量表,獲取復(fù)位中斷服務(wù)程序的入口地址后,進入復(fù)位中斷服務(wù)程序,其中0x0000 0004存的是復(fù)位中斷服務(wù)程序地址。
引出問題
既然ARM規(guī)定了M3,M4內(nèi)核要從地址0x0000 0000讀取中斷向量表,而STM32設(shè)置Flash地址到0x0800 0000怎么辦?
STM32支持了個內(nèi)存重映射功能,將地址0x0800 0000開始的內(nèi)容重映射到首地址0x0000 0000中,這樣就解決了從0x0000 0000讀取中斷向量表的問題。
那么新的問題來:
(1) 你怎么保證0x08000 0000首地址存的就是中斷向量表,我們不可以隨意設(shè)置嗎?
保證中斷向量表存到0x0800 0000,這個涉及到分散加載的一個小知識,以MDK為例,如果大家看xxx.S啟動文件,里面通過AREA定義了一個名叫RESET的段,這段存的就是中斷向量表。
這個名字很重要,MDK對應(yīng)的xxx.sct分散加載里面通過下面這句將這個RESET段放在了0x0800 0000優(yōu)先存儲。
這樣我們就解決了0x0800 0000首地址存儲中斷向量表,一旦程序開始運行后,我們就可以隨意設(shè)置中斷向量表的位置了。比如想將中斷向量表存到內(nèi)部SRAM,我們就可以操作寄存器SCB->VTOR 重新安排,然后將0x0800 0000的內(nèi)容復(fù)制到設(shè)置的地址內(nèi)即可。
(2) 既然設(shè)置到0x0800 0000這么麻煩,為什么不直接使用0x0000 0000?
這是因為STM32不僅可以從內(nèi)部Flash啟動,還可以從系統(tǒng)存儲器(可以實現(xiàn)串口ISP,USB DFU等程序下載方式)和從內(nèi)部SRAM啟動,
我們將內(nèi)部Flash安排到0x0000 0000顯然是不行的。這樣會導(dǎo)致系統(tǒng)存儲器或者內(nèi)部SRAM無法重映射到0x0000 0000了。
了解了M3和M4,使用M7是怎么個執(zhí)行情況呢?
M7內(nèi)核芯片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問題,以STM32H7為例,可以從 0x0000 0000 到 0x3FFF 0000 所有地址進行啟動。
專門安排了個選項字節(jié)來配置。
來源: 安富萊電子
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進行處理
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
456文章
51011瀏覽量
425281 -
FlaSh
+關(guān)注
關(guān)注
10文章
1640瀏覽量
148285 -
STM32
+關(guān)注
關(guān)注
2270文章
10914瀏覽量
356726
發(fā)布評論請先 登錄
相關(guān)推薦
評論