【STM32H7教程】第67章 STM32H7的系統bootloader基礎知識

完整教程下載地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

第67章       STM32H7的系統bootloader基礎知識

本章爲大家介紹STM32H7內置的系統bootloader的基礎知識。

目錄

第67章       STM32H7的系統bootloader基礎知識

67.1 初學者重要提示

67.2 系統bootLoader基礎知識

67.2.1 系統bootLoader執行流程

67.2.2 系統bootLoader使用的引腳

67.3 進入系統bootLoader的方法

67.3.1 設置硬件boot引腳進入系統bootLoader

67.3.2 用戶應用程序跳轉到系統bootLoader

67.4 退出系統bootLoader的方法

67.5 系統bootLoader的擦寫管理

67.6 總結


 

67.1 初學者重要提示

  1.   本章主要爲大家介紹系統bootloader的理論知識,下個章節爲大家實戰。
  2.   更多系統bootloader的基礎知識看本帖的AN2606應用筆記:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96573

67.2 系統bootLoader基礎知識

STM32的系統存儲區自帶bootloader,此程序是ST在芯片出廠時燒錄進去的,主要用於將用戶應用程序下載到芯片內部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下載。如果大家的應用程序打算採用這種接口方式進行升級,可以考慮採用系統bootloader,簡單易用,無需用戶自己寫bootLoader了。

更重要的是,使用系統BootLoader可以不依賴硬件boot引腳,可以直接從應用程序跳轉到系統BootLoader,這樣靈活性就很大了。

67.2.1 系統bootLoader執行流程

下面是STM32H7的BootLoader程序執行流程,簡單瞭解下即可:

關於這個執行流程,要特別注意一點:如果在進入系統BootLoader前就插入了USB線,會導致進入系統BootLoader後優先執行USB DFU,其它的接口方式將沒有機會執行。

67.2.2 系統bootLoader使用的引腳

STM32H7的Bootloader使用到的引腳分配如下:

67.3 進入系統bootLoader的方法

STM32進入系統BootLoader主要有兩種方法,一種是設置boot引腳,另一種是應用程序直接跳轉到系統BootLoader。

67.3.1 設置硬件boot引腳進入系統bootLoader

H7的啓動方式比較更靈活,只需一個boot引腳。但是一個引腳只能區分出兩個狀態,爲了解決這個問題,H7專門配套了兩個option bytes選項字節配置,如此以來就可以方便設置各種存儲器地址了。

 

BOOT_ADD0和BOOT_ADD1對應32位地址到高16位,這點要特別注意。通過這兩個選項字節,所有0x0000 0000到0x3FFF 0000的存儲器地址都可以設置,包括:

  •   所有Flash地址空間。
  •   所有RAM地址空間,ITCM,DTCM和SRAM。

設置了選項字節後,掉電不會丟失,下次上電或者復位後,會根據BOOT引腳狀態從BOOT_ADD0,或BOOT_ADD1所設置的地址進行啓動。也就是說是,H7可以從0x0000 0000到0x3FFF 0000所有地址進行啓動,這點與F4完全不同,F4系列是固定從0x0000 0000啓動的。

STM32H7的boot引腳設計:

使用BOOT功能,注意以下幾個問題:

  •   如果用戶不慎,設置的地址範圍不在有效的存儲器地址,那麼BOOT = 0時,會從Flash首地址0x0800 0000啓動,BOOT = 1時,會從ITCM首地址0x0000 0000啓動。
  •   如果用戶使能了Flash Level 2保護,那麼只能從Flash地址空間進行啓動。

67.3.2 用戶應用程序跳轉到系統bootLoader

除了使用boot引腳控制運行系統BootLoader,也可以上電後跳轉,跳轉前注意以下問題:

  •   禁止所有外設時鐘。
  •   禁止使用的PLL。
  •   禁止所有中斷。
  •   清除所有中斷掛起標誌。
  •   如果使用Go命令,對於BootLoader中使用的硬件外設寄存器,跳轉前是不會設置到復位值的,如果用戶代碼中恰好也用到這些寄存器,需要重新配置。這裏要特別注意的是BootLoader會用到看門狗,並且喂狗時間設爲最長了,如果用戶代碼裏面要用到看門狗請根據需要重新配置,並且看門狗一旦開啓是無法關閉的。
  •   對於具有雙bank特性的STM32,爲了能夠從用戶代碼跳轉到系統boot,需要將系統boot代碼區使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。對於STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然後跳轉到系統boot區。
  •   如果用到系統bootloader的DFU/CAN接口,需要用到HSE時鐘,這個時鐘的頻率是通過內部HSI/MSI檢測出具體頻率。因此,由於外部溫度等各種情況,內部HSI的精度會受到影響,從而影響檢測出來的HSE時鐘有較大誤差,最終導致DFU/CAN運行失敗。

 

具體實現會在下一章節爲大家講解。

67.4 退出系統bootLoader的方法

當前主要研究了USB DFU和串口IAP退出bootLoader。

  •   USB DFU

當芯片工作在系統bootLoader的USB DFU模式,更新完畢程序後,不會自動退出USB DFU,需要重新復位芯片後纔會退出。由於DFU模式會用到USB線,插拔USB線是難以避免的,所以是否支持自動退出,並不影響。

  •   串口IAP

當芯片工作在系統bootLoader的串口升級模式,更新完畢程序後,可以自動退出。所以基於串口的組網設備,使用系統bootloader非常方便。

67.5 系統bootLoader的擦寫管理

注:這部分知識點有個瞭解即可。

  • 使用bootloader命令進行的所有寫操作都只能字對齊(地址應該是4的倍數)。要寫入的數據數量也必須是4的倍數(接受未對齊的半頁寫地址)。
    •   有些產品不支持批量擦除操作。使用BootLoader進行批量擦除時,有兩種方法可用:
    •   使用扇區擦除命令一個一個刪除。
  •   將保護級別設置爲1,然後設置爲0(使用讀保護命令,然後使用讀非保護命令),將導致大批量擦除操作。
  •   STM32 L1和L0系列的Bootloader除了支持操作內部Flash,內部SRAM,可選字節等,還支持操作Data Memeory(數據存儲區,貌似是指的EEPROM)。數據存儲區支持讀寫操作,而不支持擦除命令,如果要擦除,寫0即可。另外對此存儲區的寫操作必須是4字節對齊(寫地址),並且寫入的數據也是4的倍數。
  •   F2, F4, F7 和 L4除了支持操作內部Flash,內部SRAM,可選字節等,還支持操作OTP存儲區。僅支持讀寫操作,不支持擦除命令。
  •   F2, F4 和 F7系列的內部Flash寫格式依賴於供電電壓範圍,默認的寫操作只支持字節(半字,字和雙字是不支持的),爲了增加寫操作速度,用戶施加足夠的電壓範圍以允許寫操作按半字,字或雙字,並通過虛擬內存位置的boot程序更新此配置。該內存位置不是物理地址,但可以根據協議使用常規的BootLoader讀寫操作。該存儲位置包含4個字節,分別爲如下表所述:

67.6 總結

本章節就爲大家講解這麼多,更新相關的知識看ST的應用筆記AN2606。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章