STM32的三种Boot模式的差异
STM32的三種Boot模式的差異
- 一、 STM32啟動配置
- 二、 內置SRAM簡介
- 三、 例程驗證
- 3.1 硬件設置
- 3.2 創建工程調試版本
- 3.3 配置分散加載文件
- 3.5 配置中斷向量表
- 3.6 修改FLASH 下載配置
- 3.7 實驗結果
- 四、 總結
- 五、 參考資料
摘要:在我們學習STM32F103XX系列的,一般都是通過串口或者ST-Llink直接燒錄到Falsh中。但有些是時候想直接調試硬件,那么如何進行燒錄程序呢?-----此次通過學習將介紹將程序燒到SRAM中。
一、 STM32啟動配置
在STM32F10xxx里,可以通過BOOT[1:0]引腳選擇三種不同啟動模式。
| X | 0 | 主閃存存儲器 | 主閃存存儲器被選為啟動區域 |
| 0 | 1 | 系統存儲器 | 系統存儲器被選為啟動區域 |
| 1 | 1 | 內置SRAM | 內置SRAM被選為啟動區域 |
在系統復位后,SYSCLK的第4個上升沿,BOOT引腳的值將被鎖存。
用戶可以通過設置BOOT1和BOOT0引腳的狀態,來選擇在復位后的啟動模式。
在從待機模式退出時,BOOT引腳的值將被被重新鎖存;因此,**在待機模式下BOOT引腳應保持為需要的啟動配置。**在啟動延遲之后,CPU從地址0x0000 0000獲取堆棧頂的地址,并從啟動存儲器的0x0000 0004指示的地址開始執行代碼。
因為固定的存儲器映像,代碼區始終從地址0x0000 0000開始(通過ICode和DCode總線訪問),而數據區**(SRAM)**始終從地址0x2000 0000開始(通過系統總線訪問)。Cortex-M3的CPU始終從ICode總線獲取復位向量,即啟動僅適合于從代碼區開始(典型地從Flash啟動)。STM32F10xxx微控制器實現了一個特殊的機制,系統可以不僅僅從Flash存儲器或系統存儲器啟動,還可以從內置SRAM啟動。
根據選定的啟動模式,主閃存存儲器、系統存儲器或SRAM可以按照以下方式訪問:
- 從主閃存存儲器啟動:主閃存存儲器被映射到啟動空間(0x0000 0000),但仍然能夠在它原有的地址(0x0800 0000)訪問它,即閃存存儲器的內容可以在兩個地址區域訪問,0x0000 0000或0x0800 0000。
- 從系統存儲器啟動:系統存儲器被映射到啟動空間(0x0000 0000),但仍然能夠在它原有的地址(互聯型產品原有地址為0x1FFF B000,其它產品原有地址為0x1FFF F000)訪問它。
- 從內置SRAM啟動:只能在0x2000 0000開始的地址區訪問SRAM。
注意: 當從內置SRAM啟動,在應用程序的初始化代碼中,必須使用NVIC的異常表和偏移寄存器,從新映射向量表之SRAM中。
以上皆來源《STM32F10xxx參考手冊》–2.4啟動配置章節
二、 內置SRAM簡介
一般情況下,我們在MDK 中編寫工程應用后,調試時都是把程序下載到芯片的內部FLASH 運行測試的,代碼的CODE 及RW-data 的內容被寫入到內部FLASH中存儲。但在某些應用場合下卻不希望或不能修改內部FLASH 的內容,這時就可以使用RAM 調試功能了,它的本質是把原來存儲在內部FLASH 的代碼(CODE 及RW-data 的內容)改為存儲到SRAM中(內部SRAM或外部SDRAM均可),芯片復位后從SRAM中加載代碼并運行。
STM32F10xxx內置64K字節的靜態SRAM。它可以以字節、半字(16位)或全字(32位)訪問。SRAM的起始地址是0x2000 0000。
把代碼下載到RAM中調試有如下優點:
- 下載程序非常快。RAM 存儲器的寫入速度比在內部FLASH 中要快得多,且沒有擦除過程,因此在RAM上調試程序時程序幾乎是秒下的,對于需要頻繁改動代碼的調試過程,能節約很多時間,省去了煩人的擦除與寫入FLASH 過程。另外,STM32 的內部FLASH 可擦除次數為1 萬次,雖然一般的調試過程都不會擦除這么多次導致FLASH 失效,但這確實也是一個考慮使用RAM的因素。
- 不改寫內部FLASH 的原有程序。
- 對于內部FLASH 被鎖定的芯片,可以把解鎖程序下載到RAM上,進行解鎖。
相對地,把代碼下載到RAM中調試有如下缺點:
- 存儲在RAM上的程序掉電后會丟失,不能像FLASH 那樣保存。
- 若使用STM32 的內部SRAM 存儲程序,程序的執行速度與在FLASH 上執行速度無異,但SRAM空間較小。
- 若使用外部擴展的SRAM 存儲程序,程序空間非常大,但STM32讀取外部SRAM 的速度比讀取內部FLASH 慢,這會導致程序總執行時間增加,因此在外部SRAM中調試的程序無法完美仿真在內部FLASH 運行時的環境。另外,由于STM32 無法直接從外部SRAM中啟動且應用程序復制到外部SRAM的過程比較復雜(下載程序前需要使STM32 能正常控制外部SRAM),所以在很少會在STM32 的外部SRAM中調試程序。
具體介紹請參考學習《零死角玩轉STM32——F103指南者》第44章在SRAM中調試代碼
三、 例程驗證
具體實驗步驟參考《零死角玩轉STM32——F103指南者》44.4實驗:在內部SRAM 中調試
此博客將介紹的是串口下載的SRAM的步驟,且在實驗最后并沒有完美呈現出串口輸出地址,也可以說是失敗案例。如想直接通過串口成功讀出代碼地址請閱讀**《零死角玩轉STM32——F103指南者》44.4實驗:在內部SRAM 中調試**
3.1 硬件設置
將跳線設置為BOOT[1:1]
3.2 創建工程調試版本
3.3 配置分散加載文件
新建SRAM-test.srt文件并進行添加路徑,編寫內容代碼:
; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************LR_IROM1 0x08000000 0x00080000 { ; load region size_regionER_IROM1 0x08000000 0x00080000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00010000 { ; RW data.ANY (+RW +ZI)} }3.5 配置中斷向量表
system_stm32f10x.c文件中配置SystemInit 函數
- 代碼如下:
直接在system_stm32f10x.c快捷查找Ctrl+F SystemInit函數
3.6 修改FLASH 下載配置
3.7 實驗結果
可以通過串口將程序燒錄到SRAM中,但按下復位鍵串口輸出不到任何信息。根據《零死角玩轉STM32——F103指南者》44.4實驗:在內部SRAM 中調試得出
通過繼續閱讀,使用Dubegger可以進行串口調試輸出代碼地址。
以上流程皆參考《零死角玩轉STM32——F103指南者》44.4實驗:在內部SRAM 中調試,如有侵權,立即刪除。同時也特別感謝野火提供的資料學習。
與之前C語言程序里全局變量、局部變量、堆、棧等概念的對比驗證了主函數地址入口確實發生了改變。代碼入口地址為0x20000145。顯然代碼進入了SRAM中調試
四、 總結
通過學習SRAM,使我了解并掌握了通過SRAM進行代碼調試的工作,也對一些Flash鎖死有了一定的了解,但通過串口實現還是有許多各種各樣的困難,且無法通過串口輸出代碼入口地址,所以推薦大家直接進行Debugger進行驗證。
五、 參考資料
1.《零死角玩轉STM32——F103指南者》44.4實驗:在內部SRAM 中調試
2.STM32 BOOT模式配置以及作用
3.stm32的程序在ROM和RAM中是如何運行的/在哪里執行的?
4.STM32的map文件詳細教程
5.STM32燒錄程序方式
6.《STM32F10xxx參考手冊》–2.4啟動配置章節
總結
以上是生活随笔為你收集整理的STM32的三种Boot模式的差异的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ArcGIS API for JavaS
- 下一篇: 判断某点是否在三角形内