STM32 之十四 System Memory、Bootloader
??由于工作的需要,最近學習了一下 STM32F4 MCU 中的 BootLoader。對比了 ST 的其他系列的的 MCU,關于 Bootloader 這部分原理基本都是一樣的,無非就是配置項多少的區(qū)別。下面記錄一下以 STM32F411 為例的學習歷程。
引導模式
??每個芯片對應的參考手冊中都有這部分的介紹,在對應的翻譯的中文手冊中被稱為自舉模式。在 STM32F4xx 中,可通過 BOOT[1:0] 引腳選擇三種不同的自舉模式,如下圖所示:
- 從 Main memory 引導: Main memory 被映射到為引導存儲空間(0x00000000),但仍可以從其原始存儲空間(0x08000000)中訪問。 換句話說,可以從地址 0x00000000 或 0x08000000 開始訪問 Main memory。在實際使用中,這種模式用的居多!
- 從 System memory 引導: System memory 被映射到為引導存儲空間(0x00000000),但仍可以從其原始存儲空間(0x1FFF0000)中訪問。這部分存儲空間中,存放了 ST 的 Boot 代碼!不同的芯片里面的代碼是有區(qū)別的,這個部分在手冊 AN2606.pdf 中有詳細的介紹。今天我們就來重點學習一下這部分。
- 從 SRAM 引導: SRAM1 被映射到為引導存儲空間(0x00000000),但仍可以從其原始存儲空間(0x20000000)中訪問。我至今沒明白這個模式如何去使用,后面有機會再研究研究。或者有知道的小伙伴可以私聊給我一些指導!
??復位后,MCU 會在 SYSCLK 的 第四個 上升沿鎖存 BOOT 引腳的值。如果我們需要改變啟動模式,就需要在復位之后盡快改變 BOOT 引腳的值。其中,BOOT0 為專用引腳,而 BOOT1 就不一樣了。主要有以下兩種情況:
- 當 nBoot1 位置 1 時,相當于上圖中的 BOOT1 復位為 0。
- 當 nBoot1 位復位為 0 時,相當于上圖中的 BOOT1 置 1。
注意:
System Memory
??這部分其實就是 MCU 中固定位置的一塊區(qū)域,里面存放了一些固定的代碼。如下圖是 STM32F411 的地址映射圖:
這部分空間在出廠前的生產(chǎn)期間由 ST 進行了編程,出廠后就不可更改,通常我們就將這里的程序稱為 引導程序(BootLoader) 。其主要作用就是是通過一些可用的串行外設(USART、CAN、USB、I2C 等)將應用程序下載到內(nèi)部 Flash 中。
幾乎全系列的 MCU 都是支持這部分功能的。下面是手冊給出的適用情況表格:
當然不同的 MCU 因為外設的不同,可能支持一個或多個嵌入式串行外圍設備。 **引導程序標識符(ID)**提供了 MCU 支持的串行外圍設備的信息。引導程序標識符具有固定的格式,適用于除STM32F1xx 之外的所有 STM32 系列 MCU。
這個 ID 也存儲在 MCU 的固定位置,下圖是一個部分系列 MCU 的列表
上圖只是部分內(nèi)容,AN2606 中有一個很長表格,詳細列出了每個系列的 MCU 中的 BootLoader 支持的串行外設情況。
對于不同的外設協(xié)議,ST 都提供對應的非常詳細的應用手冊:
- AN3154: CAN protocol used in the STM32 bootloader
- AN3155: USART protocol used in the STM32 bootloader
- AN3156: USB DFU protocol used in the STM32 bootloader
- AN4221: I2C protocol used in the STM32 bootloader
- AN4286: SPI protocol used in the STM32 bootloader
- AN5405: FDCAN protocol used in the STM32 bootloader
??對于使用 DFU/CAN 接口嵌入引導程序的 STM32 MCU,其中 DFU/CAN 操作需要外部時鐘源(HSE)。 其中的引導加載程序固件會使用內(nèi)部振蕩器時鐘(HSI,MSI) 動態(tài)檢測 HSE 的值(因為引導加載程序不知道用戶有沒有外接 HSE)。 當(由于溫度變化或其他條件)內(nèi)部振蕩器精度在公差帶以上(理論值的1%左右)變化,引導加載程序可能會計算出錯誤的 HSE 頻率值。 在這種情況下,引導加載程序 DFU/CAN 接口可能會出現(xiàn)故障或根本無法工作。
進入
??除了上面的引導模式章節(jié)介紹的 BOOT 引腳方式可以進入 System Memory 之外,我們其實還可以直接使用程序跳轉(zhuǎn)進入。但是在跳到引導加載程序之前,必須處理一下幾個方面:
- 禁用所有外設時鐘
- 禁用使用的 PLL
- 關閉所有中斷
- 清除所有被掛起的中斷
??進入引導程序之后,我們就可以使用對應的外設協(xié)議來對 FLASH 進行操作了。ST 本身也提供了很多實用工具。例如,若通過 UART 接口來燒寫程序,則要下載個 PC 端的 flash 燒錄工具軟件 STM32 Flash loader demonstrator 來配合;若通過USB 接口來燒寫程序,則需要下載 USB DfuSe工具軟件來實現(xiàn)。
目前,ST 推出了新一代燒寫工具 STM32CubeProgrammer,把上面的工具給整合成了一個
退出
??通過退出引導加載程序激活條件并生成硬件復位或使用 Go 命令執(zhí)行用戶代碼,即可以退出系統(tǒng)內(nèi)存引導模式。
??執(zhí)行 Go 命令時,引導加載程序使用的外設寄存器不會在跳轉(zhuǎn)到用戶應用程序之前初始化為它們的默認重置值。 如果要使用,則必須在用戶應用程序中重新配置。 因此,如果 IWDG 用于在應用中,必須調(diào)整 IWDG 預分頻器的值,以滿足其要求。
參考
總結
以上是生活随笔為你收集整理的STM32 之十四 System Memory、Bootloader的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华大 MCU 之一 HC32F460 替
- 下一篇: STM32 之十五 奇怪问题处理及驱动库