从零开始移植Bootloader(极速版)
注意事项:
1.本文章只涉及如何移植并简单使用!!!
2.其中bootloder与ringbuffer知识请自行查询ai
3.其中所有的工程代码请自行查询我的github/gitee上进行拷贝学习
4.其中涉及路径最好不要包含中文
github项目链接:https://github.com/gaigaiz/Start-from-scratch-to-transplant-the-Turbo-Edition-of-Bootloader
https://github.com/gaigaiz/Start-from-scratch-to-transplant-the-Turbo-Edition-of-Bootloader
gitee项目链接:
使用模块以及平台说明:STM32F407VET6(嘉立创的天空星)+HAL库
BL工程创建与使用
1.文件夹创建
BL+BL_APP+APP+BL_min+Common(共5个文件夹)
2.使用STM32CubeMX完成工程创建
-
选择芯片STM32F407VET6
-
修改文件名以及程存放路径等操作(这是我的设置,仅供参考)


-
将时钟与SYS一同打开


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

-
设置时钟树(重点)

-
生成工程代码
3.keil中文件的添加以及文件路径设置与代码添加
-
添加文件如图所示


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

-
打开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 */ -
首先将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 执行(正确) } } -
编译下载->打开串口验证是否程序成功下载并运行(如图所示)

最小APP测试工程创建与使用
1.使用STM32CubeMX完成工程创建
-
创建项目流程与上方BL建立工程相同
-
打开串口1(检验固件更新)-引脚自行选择
-
选中串口3,对串口3的读取添加DMA(DMA设置如图所示)

-
创建工程
2.keil中文件的添加以及文件路径设置与代码添加
-
添加文件如图所示


-
点击魔法棒,添加头文件的路径(参考)-点击上面的Include Paths->然后添加刚刚创建好的BL_APP和Common文件的路径即可(注意:一定要点进文件夹)-操作与上方BL创建相同
-
点开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 */ } -
首先将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) } } -
编译下载->打开两个串口验证是否程序成功下载并运行(如图所示)
OTA串口打印
测试串口打印

上位机下发固件包以及单片机工程的远程更新
1.修改int main()主函数
-
将APP v1.0 running->APP v2.0 running->重新编译(不要进行下载)
-
将MDK_ARM文件夹里面的APP.hex复制粘贴出来,放置到随便的路径位置(你知道把文件放置到哪个位置就行)->将这个APP.hex改名为v2.hex(这一步可做可不做)
2.打开Tools文件夹运行ota_gui.py即可(注意下载需要的库)
-
选择对应的OTA的串口,新固件的位置,测试串口,波特率大小(如图所示)

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

3.注意事项:烧录固件时推荐使用USB-TTL,否则部分固件有可能更新失败或者请求超时
恭喜您完成了bootloder的快速移植与使用,感谢您的学习
更多推荐



所有评论(0)