注意事项:

1.本文章只涉及如何移植并简单使用!!!

2.其中bootloder与ringbuffer知识请自行查询ai

3.其中所有的工程代码请自行查询我的github/gitee上进行拷贝学习

4.其中涉及路径最好不要包含中文

github项目链接:https://github.com/gaigaiz/Start-from-scratch-to-transplant-the-Turbo-Edition-of-Bootloaderhttps://github.com/gaigaiz/Start-from-scratch-to-transplant-the-Turbo-Edition-of-Bootloader

gitee项目链接:

从零开始移植Bootloader极速版: 基于 STM32F407VET6+HAL 库实现 Bootloader 与串口 OTA 升级。工程分 Bootloader、APP、公共组件等目录,划分独立 Flash 分区,支持程序跳转、DMA 串口接收、CRC32 校验。搭配 Python 上位机可远程更新固件,适合 IAP/OTA 入门学习。路径请勿含中文,推荐 USB-TTL 进行升级。https://gitee.com/longquanyijinglonglu/bootloder

使用模块以及平台说明:STM32F407VET6(嘉立创的天空星)+HAL库

BL工程创建与使用

1.文件夹创建

BL+BL_APP+APP+BL_min+Common(共5个文件夹)

2.使用STM32CubeMX完成工程创建

  1. 选择芯片STM32F407VET6

  2. 修改文件名以及程存放路径等操作(这是我的设置,仅供参考)

  3. 将时钟与SYS一同打开

  4. 打开串口3,并设置频率为500000 Bit/s(串口引脚可自行选择)-该串口3就是我们的OTA串口

  5. 设置时钟树(重点)

  6. 生成工程代码

3.keil中文件的添加以及文件路径设置与代码添加

  1. 添加文件如图所示

  2. 点击魔法棒,添加头文件的路径(参考)-点击上面的Include Paths->然后添加刚刚创建好的BL_min和Common文件的路径即可(注意:一定要点进文件夹)

  3. 打开main.c添加代码即可

    /* USER CODE BEGIN Includes */
    #include "bl_core.h"        //请添加在头文件引用中
    /* USER CODE END Includes */
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_USART3_UART_Init();
      /* USER CODE BEGIN 2 */
        bootloader_run();       //放置在硬件初始化后面
      /* USER CODE END 2 */
  4. 首先将Linker中取消勾选(如图所示)->修改MDK_ARM文件夹下的BL.sct代码(修改或者直接复制我代码中BL.sct)->在Scatter File中选择修改好的BL.sct路径(重点)

    BL.sct代码

    ; *************************************************************
    ; *** Scatter-Loading Description File generated by uVision ***
    ; *************************************************************
    
    LR_IROM1 0x08000000 0x0000C000 {    ; 48KB BL 空间(对齐 16KB,正确)
      ER_IROM1 0x08000000 0x0000C000 {
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
       .ANY (+XO)
      }
      RW_IRAM1 0x20000000 0x00030000 { .ANY (+RW +ZI) }  ; STM32F407 192KB RAM
      ER_IRAM_FUNC +0 {                         
       bsp_flash.o (+RO)                         ; Flash 代码放 RAM 执行(正确)
      }
    }
  5. 编译下载->打开串口验证是否程序成功下载并运行(如图所示)

最小APP测试工程创建与使用

1.使用STM32CubeMX完成工程创建

  1. 创建项目流程与上方BL建立工程相同

  2. 打开串口1(检验固件更新)-引脚自行选择

  3. 选中串口3,对串口3的读取添加DMA(DMA设置如图所示)

  4. 创建工程

2.keil中文件的添加以及文件路径设置与代码添加

  1. 添加文件如图所示

  2. 点击魔法棒,添加头文件的路径(参考)-点击上面的Include Paths->然后添加刚刚创建好的BL_APP和Common文件的路径即可(注意:一定要点进文件夹)-操作与上方BL创建相同

  3. 点开main.c补充代码

    /* USER CODE BEGIN Includes */
    #include "ota_uart_app.h"       //添加头文件定义
    #define APP_BANNER  "APP v1.0 running\r\n"   // OTA 验证:下发前改成 "APP v2.0
    /* USER CODE END Includes */

    主函数书写

    int main(void)
    {
    
      /* USER CODE BEGIN 1 */
    SCB->VTOR = 0x08014000UL;       //重点:防止中断跑飞       
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_DMA_Init();
      MX_USART1_UART_Init();
      MX_USART3_UART_Init();
      /* USER CODE BEGIN 2 */
    	ota_uart_start();
      HAL_UART_Transmit(&huart1, (uint8_t *)APP_BANNER, sizeof(APP_BANNER) - 1, 100);
      uint32_t t_ota = HAL_GetTick(), t_led = t_ota, t_beat = t_ota;
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
    		uint32_t now = HAL_GetTick();
        if (now - t_ota  >= 5)    { t_ota  = now; ota_poll_task(); }
        if (now - t_beat >= 1000) { t_beat = now;
        HAL_UART_Transmit(&huart1, (uint8_t *)APP_BANNER, sizeof(APP_BANNER) - 1, 100); }
      }
      /* USER CODE END 3 */
    }
  4. 首先将Linker中取消勾选(如上方BL的图所示)->修改MDK_ARM文件夹下的APP.sct代码(修改或者直接复制我代码中APP.sct)->在Scatter File中选择修改好的APP.sct路径(重点)

    APP.sct代码

    LR_IROM1 0x08014000 0x00068000 {
      ER_IROM1 0x08014000 0x00068000 {
       *.o (RESET, +First)
       *(InRoot$$Sections)
       .ANY (+RO)
       .ANY (+XO)
      }
      RW_IRAM1 0x20000000 0x00020000 { .ANY (+RW +ZI) }
      ER_IRAM_FUNC +0 {
       bsp_flash.o (+RO)
      }
    }
  5. 编译下载->打开两个串口验证是否程序成功下载并运行(如图所示)

    OTA串口打印

    测试串口打印

上位机下发固件包以及单片机工程的远程更新

1.修改int main()主函数

  1. 将APP v1.0 running->APP v2.0 running->重新编译(不要进行下载)

  2. 将MDK_ARM文件夹里面的APP.hex复制粘贴出来,放置到随便的路径位置(你知道把文件放置到哪个位置就行)->将这个APP.hex改名为v2.hex(这一步可做可不做)

2.打开Tools文件夹运行ota_gui.py即可(注意下载需要的库)

  1. 选择对应的OTA的串口,新固件的位置,测试串口,波特率大小(如图所示)

  2. 点击开始升级->查看新固件是否成功下载并打印对应的输出(如图所示)

3.注意事项:烧录固件时推荐使用USB-TTL,否则部分固件有可能更新失败或者请求超时

恭喜您完成了bootloder的快速移植与使用,感谢您的学习

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐