天天看點

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

文章目錄

  • 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):

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

相關參考文檔

  • AN2606
  • RM0351-STM32L4參考手冊
  • 安富萊V7開發闆使用者手冊

進入BootLoader

硬體Boot引腳進入BootLoader模式

STM32L496通過在複位時檢測Boot0 Pin(PH3)和FlashOPTR寄存器中的nBoot1 bit狀态進入Bootloader模式:

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

預設狀态下,OPTR寄存器值為0xFFEFF8AA,即Boot0由Boot0Pin(PH3)決定,Boot1 bit跟随Boot0變化,是以隻需要在複位時保持PH3上拉即可進入系統bootloader。

需要注意的是,如果使用了Flash保護 level2,就隻能從Flash位址空間啟動,不能進入系統Bootloader

如下STM32L4X6參考手冊對OPTR寄存器的描述:

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

軟體進入BootLoader模式

如果不想通過引腳進入Bootloader,在程式内也可以通過軟體跳轉到SystemMemory來執行Bootloader。

參考AN2606 -4.1章節,在跳轉前需要做如下處理:

  • 失能所有外設時鐘
  • 失能使用的PLL
  • 失能所有中斷
  • 失能所有中斷标志

SystemMemory的位址可以在L4X6參考手冊的Flash章節查到為0x1FFF0000:

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

參照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驅動:

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

使用軟體方式就更簡單了,直接執行JumpToBootloader程式,成功的話裝置管理器上也會顯示Bootloader驅動。

CubePro上點選Connect:

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

執行下載下傳步驟:

STM32 L4X6 系統内置BootLoader的使用(DFU例程)STM32 L4 系統内置BootLoader的使用(DFU例程)

完成後提示下載下傳完成,校驗完成。