【OTA专题】2 初级bootloader架构和基础工程移植

目录

1.初级架构

硬件架构:

软件架构:

Bootloader:

App:

2.初阶Bootloader升级流程:

2.创建一个标准库的STM32F411基础工程

1.使用标准库开发Bootloader的意义:

2.移植标准库:

方式一:移植Boot的步骤: (开发板移植)

3.重构Boot代码的文件分层

调试工具(Easylogger+RTT)


0.书接上文

【OTA专题】1 OTA加密升级总览

1.初级架构

硬件架构:

模块介绍:

Stm32F411CEU6:用于存放Bootloader代码和APP的芯片

Key:用于实现App和Bootloader切换逻辑模块

Led:用于演示App代码运行成功

Ch340:用于实现MCU与PC之间通信的中间模块

PC:使用相关上位机软件进行控制和下载芯片

Jlink:下载代码和Trace调试

架构图:

软件架构:

Bootloader:

Key_Detect:用于上电时检测Bootloader是否进入下载模式

Download_logic:用于管理整个下载流程

Ymodem:基于上位机与MCU之间的通信协议

Gpio:MCU外设

Uart: MCU外设

Flash:MCU外设(内部)

App:

Key_Detect:用于App层是否需要跳转Bootloader命令

Led_Logic:App逻辑执行,从现象中区分APP与Bootloader

Gpio:MCU外设

2.初阶Bootloader升级流程:

2.创建一个标准库的STM32F411基础工程

1.使用标准库开发Bootloader的意义:

1.标准库体积小

2.标准库经过多年的测试使用,功能非常稳定

3.提高Bootloader的可移植性

2.移植标准库:

方式一:移植Boot的步骤: (开发板移植)

找资料,获取 标准库

从开发板资料中,我们可以获取到一些标准库的demo

gitee资料:https://gitee.com/WeAct-TC/WeActStudio.MiniSTM32F4x1

路径:(根据自己下载的路径)

D:\桌面\stm32F411资料\WeActStudio.MiniSTM32F4x1\SDK\STM32F411CEU6\STD\stm32f4x1_Templates

下载好之后,将stm32f4x1_Templates文件夹复制到我们新建的工程文件中,如下图所示:

芯片型号进行相应的更改

编译工程会发现有错误,这里的错误是没有包含相关的头文件

我们随便打开一个HAL的程序,复制include文件

粘贴到这个工程的CMSIS路径下

在keil中包含头文件的路径

对名字进行修改

这样我们就得到了一个标准库工程

3.重构Boot代码的文件分层

建议按照如下分层格式进行Boot的项目文件管理

BSP :板级支持驱动程序

BSP: Board Support Package

MCU和板上外设器件(比如MPU6050)的通信与交互过程。

Core: MCU 驱动程序

面向MCU进行编程,初始化MCU内部的外设(时钟,IIC,SPI等外设)。包含main.c文件。

Drivers:厂商SDK程序

MCU厂商和MCU内的CPU厂商提供的,用来对CPU和片上外设编程时用的驱动库,一般由厂家提供。

MDK-ARM:Keil工程文件

Keil的配置文件,以及一些debug的配置文件。

Middlewares:中间件

抽象程度很高,能在各个项目中安插通用的:LVGL\FreeRTOS\数学库\快速傅里叶变换库

SYSTEM:系统配置层

对系统定义整体的宏;对于全局系统有影响的参数,和文件,放在这个目录下;

Tasks (User) :

实现具体的应用逻辑。

调试工具(Easylogger+RTT)

Easylogger与RTT结合使用 & Easylogger在FreeRTOS下实现异步输出

移植时需要注意,bootloader工程没有系统,所以需要微调一下,删除之前自己添加的FreeRTOS系统的部分(如果有)。

特别注意这里:不要使用printf重定位(首先我们的串口要用来和上位机通信下载固件,其次如果使用printf会有奇怪bug导致程序卡死(即使使用了微库也会卡死))

移植好elog和rtt后,添加调试文件

cpp 复制代码
#include "Debug.h"
#include "elog.h"
#include "stdio.h"

void app_elog_init(void)
{
        elog_init();
        elog_set_fmt(ELOG_LVL_ASSERT,ELOG_FMT_TIME|ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_DIR|ELOG_FMT_LINE|ELOG_FMT_FUNC);
        elog_set_fmt(ELOG_LVL_ERROR,ELOG_FMT_TIME|ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_DIR|ELOG_FMT_LINE|ELOG_FMT_FUNC);
        elog_set_fmt(ELOG_LVL_WARN,ELOG_FMT_TIME|ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_DIR|ELOG_FMT_LINE|ELOG_FMT_FUNC);
        elog_set_fmt(ELOG_LVL_INFO,ELOG_FMT_TIME|ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_DIR|ELOG_FMT_LINE|ELOG_FMT_FUNC);
        elog_set_fmt(ELOG_LVL_DEBUG,ELOG_FMT_TIME|ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_DIR|ELOG_FMT_LINE|ELOG_FMT_FUNC);
        elog_set_fmt(ELOG_LVL_VERBOSE,ELOG_FMT_TIME|ELOG_FMT_LVL|ELOG_FMT_TAG|ELOG_FMT_DIR|ELOG_FMT_LINE|ELOG_FMT_FUNC);

        elog_start();
}
cpp 复制代码
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DERBUG_H
#define __DERBUG_H

/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx.h"

void app_elog_init(void);

#endif /* __MAIN_H */
相关推荐
youcans_10 分钟前
【嵌入式软件AI编程】16. Claude Code 与 VS Code 的协同开发
stm32·mcu·嵌入式·ai编程·claude code
Zw-awa33 分钟前
按键接到 STM32 后:GPIO 输入到底读到了什么
stm32
sunoo-2291 小时前
【ARM嵌入式学习笔记Day6】一文打通i.MX6ULL时钟体系:PLL/PFD/预分频+滞回比较器全解析
arm开发·笔记·vscode·单片机·imx6ull·汇编语言
阿钱真强道1 小时前
06 嵌入式操作系统 | vim 与软件管理:apt / 源码编译
ubuntu·vim·嵌入式·apt·源码编译
MarkZhou6241 小时前
智能蒸烤双核通信架构拆解:从冗余耦合到分层解耦
stm32·单片机·嵌入式硬件·架构·安卓·安全架构
G.E.M.小白1 小时前
【IMX6ULL ARM内核启动与时钟系统超详解】PLL/PFD/分频/根时钟配置
嵌入式·arm·时钟·imx6ull
嵌入式阿蔡1 小时前
嵌入式DevOps 2026:AI驱动工具链与CI/CD闭环
嵌入式
hlpinghcg1 小时前
HPM CIA402工程融合FOE
ota·ethercat·hpm·foe·先辑
chem41111 小时前
STM32CubeMX Linux 开发环境搭建
stm32·单片机·linux系统
嵌入式阿蔡10 小时前
嵌入式虚拟化2026:Hypervisor从数据中心走进MCU
嵌入式