我們言簡意賅的普及下這個知識點,爭取讓大家不傷腦細胞。
背景知識
M3,M4內核芯片上電復位后,要固定從0x0000 0000地址讀取中斷向量表,獲取復位中斷服務程序的入口地址后,進入復位中斷服務程序,其中0x0000 0004存的是復位中斷服務程序地址。
引出問題
既然ARM規定了M3,M4內核要從地址0x0000 0000讀取中斷向量表,而STM32設置Flash地址到0x0800 0000怎么辦?
STM32支持了個內存重映射功能,將地址0x0800 0000開始的內容重映射到首地址0x0000 0000中,這樣就解決了從0x0000 0000讀取中斷向量表的問題。
那么新的問題來:
(1) 你怎么保證0x08000 0000首地址存的就是中斷向量表,我們不可以隨意設置嗎?
保證中斷向量表存到0x0800 0000,這個涉及到分散加載的一個小知識,以MDK為例,如果大家看xxx.S啟動文件,里面通過AREA定義了一個名叫RESET的段,這段存的就是中斷向量表。
這個名字很重要,MDK對應的xxx.sct分散加載里面通過下面這句將這個RESET段放在了0x0800 0000優先存儲。
這樣我們就解決了0x0800 0000首地址存儲中斷向量表,一旦程序開始運行后,我們就可以隨意設置中斷向量表的位置了。比如想將中斷向量表存到內部SRAM,我們就可以操作寄存器SCB->VTOR 重新安排,然后將0x0800 0000的內容復制到設置的地址內即可。
(2) 既然設置到0x0800 0000這么麻煩,為什么不直接使用0x0000 0000?
這是因為STM32不僅可以從內部Flash啟動,還可以從系統存儲器(可以實現串口ISP,USB DFU等程序下載方式)和從內部SRAM啟動,
我們將內部Flash安排到0x0000 0000顯然是不行的。這樣會導致系統存儲器或者內部SRAM無法重映射到0x0000 0000了。
了解了M3和M4,使用M7是怎么個執行情況呢?
M7內核芯片比較靈活了,改變了固定從0x0000 0000地址讀取中斷向量表的問題,以STM32H7為例,可以從 0x0000 0000 到 0x3FFF 0000 所有地址進行啟動。
專門安排了個選項字節來配置。
來源: 安富萊電子
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
芯片
+關注
關注
456文章
51157瀏覽量
426587 -
FlaSh
+關注
關注
10文章
1642瀏覽量
148512 -
STM32
+關注
關注
2271文章
10923瀏覽量
357243
發布評論請先 登錄
相關推薦
STM32F103的Flash擦除問題
STM32升級程序里的0x08000000不是加載地址,而是中斷向量入口地址,這是為什么?如何解決?
在stm32f030如果我將起始地址從0x08000000更改為0x08003000,則Usart不工作
資料下載:STM32的Flash地址是0x08000000,從0x00000000不可以?
為什么STM32從Flash地址0x08000000的啟動而不是0x00000000
嵌入式軟件如何利用內部flash存儲參數?
STM32的Flash地址要設置到0x08000000的原因
如何在STM32F769中將程序起始地址從0x08000000更改為0x08020000?
有沒有辦法在不擦除不在起始地址0x08000000處的其余閃存的情況下調試某些代碼?
基于STM32F407的flash內存結構分析
![基于<b class='flag-5'>STM32</b>F407的<b class='flag-5'>flash</b>內存結構分析](https://file1.elecfans.com//web2/M00/A7/4B/wKgZomUMQ6GAX34nAAA6VOydwXQ540.png)
微處理器IAP技術中是如何融合rfid技術的
![微處理器IAP技術中是如何融合rfid技術的](https://file.elecfans.com/web1/M00/B3/13/pIYBAF4VpRKASjbSAAAcVqvSfA4831.png)
嵌入式軟件中利用內部flash存儲參數的方法
![嵌入式軟件中利用內部<b class='flag-5'>flash</b>存儲參數的方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CUBEIDE中修改FLASH起始地址的方法
![<b class='flag-5'>STM32</b>CUBEIDE中修改<b class='flag-5'>FLASH</b>起始<b class='flag-5'>地址</b>的方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32的Flash地址是0x08000000,從0x00000000不可以?
![<b class='flag-5'>STM32</b>的<b class='flag-5'>Flash</b><b class='flag-5'>地址</b>是<b class='flag-5'>0x08000000</b>,從<b class='flag-5'>0x</b>00000000不可以?](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論