日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32的三种Boot模式的差异

發布時間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]引腳選擇三種不同啟動模式

BOOT1BOOT0啟動模式說明
X0主閃存存儲器主閃存存儲器被選為啟動區域
01系統存儲器系統存儲器被選為啟動區域
11內置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 函數

  • 代碼如下:
void SystemInit (void) {/* ..其它代碼部分省略 *//* 配置向量表添加的偏移地址 ----*/#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif }

直接在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模式的差异的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。