文章目錄
- STM32 L4 系統内置BootLoader的使用(DFU例程)
-
- 系統Bootloader基礎知識
-
- 什麼是DFU
- 相關參考文檔
- 進入BootLoader
-
- 硬體Boot引腳進入BootLoader模式
- 軟體進入BootLoader模式
- 下載下傳程式
-
- 安裝STM32CubeProgrammer
- 環境搭建
- Bootloader下載下傳
STM32 L4 系統内置BootLoader的使用(DFU例程)
實驗環境基于STM32L496。
系統Bootloader基礎知識
什麼是DFU
ST官方在很多STM32的系統存儲區燒錄了Bootloader程式用以實作IAP。
使用者可以通過進入系統Bootloader模式,經由USART、CAN、USB、I2C、SPI燒錄程式,其中DFU(Device Firmware Update)就是通過USB接口實作IAP的方案。
作為一個IAP,該方案常用于避免産品軟體更新時的拆裝,并且能省去上位機程式和Bootloader程式的編寫。
ST支援系統Bootloader的單片機型号如下(摘自AN2606,V44,2020.7):
相關參考文檔
- AN2606
- RM0351-STM32L4參考手冊
- 安富萊V7開發闆使用者手冊
進入BootLoader
硬體Boot引腳進入BootLoader模式
STM32L496通過在複位時檢測Boot0 Pin(PH3)和FlashOPTR寄存器中的nBoot1 bit狀态進入Bootloader模式:
預設狀态下,OPTR寄存器值為0xFFEFF8AA,即Boot0由Boot0Pin(PH3)決定,Boot1 bit跟随Boot0變化,是以隻需要在複位時保持PH3上拉即可進入系統bootloader。
需要注意的是,如果使用了Flash保護 level2,就隻能從Flash位址空間啟動,不能進入系統Bootloader
如下STM32L4X6參考手冊對OPTR寄存器的描述:
軟體進入BootLoader模式
如果不想通過引腳進入Bootloader,在程式内也可以通過軟體跳轉到SystemMemory來執行Bootloader。
參考AN2606 -4.1章節,在跳轉前需要做如下處理:
- 失能所有外設時鐘
- 失能使用的PLL
- 失能所有中斷
- 失能所有中斷标志
SystemMemory的位址可以在L4X6參考手冊的Flash章節查到為0x1FFF0000:
參照AN2606,由于L4X6具有雙Bank特性,需要将系統Boot代碼區使用SYSCFG重映射到0x00000000。
最終跳轉代碼如下:
void JumpToBootloader(void)
{
uint32_t i=0;
void (*SysMemBootJump)(void);
__IO uint32_t BootAddr = 0x1FFF0000;
/* Disable IRQ */
__set_PRIMASK(1);
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
HAL_RCC_DeInit();
/* Disable all irq flag */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
/* Enable IRQ */
__set_PRIMASK(0);
/* Remap system memory bootloader at 0x00000000 */
CLEAR_BIT(SYSCFG->MEMRMP, 0x07);
SET_BIT(SYSCFG->MEMRMP, 0x01);
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
/* Set stack address */
__set_MSP(*(uint32_t *)BootAddr);
/* 在RTOS工程中,這條語句很重要,設定為特權模式,使用MSP指針 */
__set_CONTROL(0);
/* Jump to system bootloader */
SysMemBootJump();
}
通過硬體複位和運作指令可以退出Bootloader。
下載下傳程式
安裝STM32CubeProgrammer
- 安裝STM32CubeProgrammer
- 運作該安裝目錄裡的STM32Bootloader.bat,我的在這裡D:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\Drivers\DFU_Driver
環境搭建
準備标準USB線,綠色線(D+)接單片機的USB-DP(PA12),白色線(D-)接單片機的USB-DN(PA11),黑色地線接地。連接配接PC,打開STM32CubeProgrammer,打開裝置管理器。
Bootloader下載下傳
Boot0 Pin置高,斷電複位,等待3S左右,PC上裝置管理器會顯示STM32Bootloader驅動:
使用軟體方式就更簡單了,直接執行JumpToBootloader程式,成功的話裝置管理器上也會顯示Bootloader驅動。
CubePro上點選Connect:
執行下載下傳步驟:
完成後提示下載下傳完成,校驗完成。