当前位置: 首页 > news >正文

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录

一、前言

二、BootLoader

三、BootLoader的实现

四、APP程序

五、效果展示

六、拓展


一、前言

        听到BootLoader大家一定很熟悉,在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现,建议大家学习前掌握些原理基础。

二、BootLoader

        Boot系统即设备启动时优先运行的程序,可以帮助我们选择进入哪一个系统。在电脑中,Boot系统也是十分重要的,系统的基础功能和引导功能都是有Boot实现的。

        而Loader即载入系统,载入用户真正使用的系统。

        系统上电后,先进入Boot程序,由Boot程序决定进入系统,还是等待用户指令。以单片机为例,假设其Flash为20K,那么我可以将其分为两个区域,一个区域用于存储Boot程序,一个区域用于存储应用程序(APP),而Boot程序只烧写一次,用户烧录APP程序时,仅擦除APP区域。

        Boot程序作为独立的单片机程序,当然也可以完成擦除和写入Flash的功能,如果我们在Boot程序运行时,将APP对应的Flash信息发送给Boot程序,由Boot程序对Flash中的APP区的擦除和写入,那是不是同样能实现烧写程序的功能。

        如果将发送方式改为蓝牙、WIFI等无线形式,是不是就能对APP程序实现远程烧写。既然远程烧写能够实现,那么远程升级的功能应运而生,这就是OTA(On The Air)。

三、BootLoader的实现

        配置基础的STM32CUBEMX工程,此处选用芯片为STM32F103C8T6.

        此处我只配置了一个串口(波特率256000,自定),用于输出调试信息,并使能DMA和中断。

        打开项目工程。此处STM32F103C8T6的Flash为64K,其实地址为0x08000000,则Flash范围为0x0800 0000~0x0800 FFFF,此处我划Boot分区16K,APP分区48K,则Boot分区Flash范围为:0x0800 0000~0x0800 3FFF,Size = 0x4000。

        按照下图配置。

        如果你使用ST-Link或者其他烧写器的话,在Boot程序工程中要勾选全部擦除

        此时,我们让设备等待三秒,随后进入APP。

__asm void MSR_MSP(uint32_t addr)
{MSR MSP, r0BX r14;
}void App_Loading(void)
{APP_FUNC Jump;//定义一个函数指针printf("\n%x\n",(*(uint32_t *)APP_ADDR)&0x2FFFFFFF);// 栈顶地址是否合法if(((*(uint32_t *)APP_ADDR)&0x2FFFFFFF) < (0x20000000+0x400 * RAM_SIZE)){printf("Start To APP");//设置栈指针 MSR_MSP(APP_ADDR);// 获取复位地址Jump=(APP_FUNC)*(volatile uint32_t *)(APP_ADDR+4);	//设置栈指针__set_MSP(*(volatile uint32_t *)APP_ADDR);//关闭所有中断__set_PRIMASK(1);// 跳转至APP Jump();}else{printf("Address Not Found");}
}

        将程序烧写进单片机,Boot程序就已经下载完成了。

        注意,使用printf函数需要重写fputc并且勾选MicroLib。

#include "stdio.h"int fputc(int c, FILE* stream)
{uint8_t ch[]={c};HAL_UART_Transmit(&huart1,ch,1,0xffff);return c;
}

四、APP程序

        在自己定制的BootLoader中,APP的程序与日常使用的程序有些许不同,由于在BootLoader中我们更改了一些参数配置,为了能够顺利跳转到APP程序中。但这些配置需要恢复才能让APP程序正常运行。

        使用STM32CUBEMX生成一个LED闪烁的程序,使用Keil打开工程。

        先配置程序烧写区域,上述中Boot区域占16K,因此APP程序起始地址为0x0800 4000 ,APP程序48K,即Size = 0xC000。

        有ST-LINK的情况下,需要设置烧写模式为仅擦除训选择区域,防止擦除Boot程序。

        随后在main.c中main函数中添加这两条语句。

	//SCB ->VTOR = FLASH_BASE | OFFSET;SCB ->VTOR = FLASH_BASE | 0x4000;__set_PRIMASK(0);

五、效果展示

        将单片机程序烧写进板子后,打开串口助手,并观察效果。

        观察到单片机顺利进入APP程序,并且实现了交替闪烁。

六、拓展

        大家可以添加菜单模式,比如通过串口收到某个指令随后进入菜单模式,实现擦除或者其他操作。我实现了一小部分,大家可以看看。源码不需要积分。

        本文仅帮助快速实现BootLoader,具体原理讲解将在另一篇博文进行。

        BootLoader源工程:BootLoader

        APP源工程:简易APP配套BootLoader

相关文章:

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …...

鸿萌数据备份服务:中小型企业如何策划及实施云备份方案

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据安全、数据备份、数据恢复、数据清除等解决方案与服务。 对于中小型企业来说&#xff0c;保护运营数据&#xff08;客户记录、财务文档和项目文件&#xff09;的重要性不言而喻…...

x264 编码过程中延迟逻辑分析

编码延迟相关参数 相关参数:在 common.h文件中 frames 结构体中声明关于编码延迟的变量int i_delay; /* Number of frames buffered for B reordering */ int i_bframe_delay; int64_t i_bframe_delay_time;编码延迟计算 编码延迟计算:在x264_encoder_open函数和x264_…...

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…...

2024.8.1(前端服务器的配置以及tomcat环境的配置)

回顾 [roottomcat ~]# cd eleme_web/public/img/ [roottomcat img]# ls 1.jpg [roottomcat public]# cd [roottomcat ~]# cd eleme_web/ [roottomcat eleme_web]# cd src [roottomcat src]# vim views/HomeView.vue [roottomcat src]# nohup npm run serve ctrlc后网页不出…...

使用 宝塔面板 部署 语料库php网站

【语料库网站】宝塔面板 在线部署全过程 代码仓库&#xff1a;https://github.com/talmudmaster/RedCorpus 网站介绍 语料库提供双语文本检索和分享功能。供英语、翻译相关专业的爱好者&#xff0c;学生和老师学习使用。 该网站是对BiCorpus开源项目的二次开发。 技术栈&am…...

springboot农产品报价系统-计算机毕业设计源码37300

摘 要 本研究基于鸿蒙系统&#xff0c;设计开发了一款农产品报价系统小程序&#xff0c;旨在帮助商家与买家更便捷、高效地进行交易。该系统利用鸿蒙系统的优势&#xff0c;实现了跨平台应用程序的开发&#xff0c;同时利用定位技术和数据采集技术&#xff0c;为用户提供了个性…...

食源送系统项目的测试

一、对整个系统编写测试用例 功能测试 性能测试 兼容性测试 易用性测试 安全测试 二、接口测试 针对接口的功能测试&#xff0c;也就是检验接口是否按照接口文档输入输出 2.1 使用Postman发送HTTP请求 2.2 使用Java TestNG 编写自动化测试用例 登录界面功能 package com.sky.…...

JS解构赋值

可以将数组中的值或对象的属性取出&#xff0c;赋值给其他变量。 例如 Let [a, …b] [1, 2, 3]; // a 1, b [2, 3]; let {a, b, …rest} {a : 10, b : 20, c : 30, d : 40}; // a 10, b 20, rest {c : 30, d : 40};...

多多OJ评测系统 前端项目环境初始化 安装Vue脚手架 引入Arco Design组件

目录 确定环境 命令行输入 装一下脚手架 监测一下是否安装成功 创建一个项目 选择一系列的配置后 我们打开webStorm 配置脚手架后我们先运行 我们这边能获取到网址 其实我们脚手架已经帮我们做到了 接下来要引入相关的组件 选择用npm进行安装 我们建议的是完整引入…...

OceanBase 配置项系统变量实现及应用详解(4):新增系统变量

本专题的前几篇文章已经详细阐述了OceanBase的配置项和系统变量的基础用法&#xff0c;并对配置项的源码进行了剖析。但有一些同学可能还对系统变量的实现方式有兴趣&#xff0c;并希望能够像自定义配置项那样&#xff0c;新增一个系统变量。 本文将围绕“如何新增系统变量”这…...

`CAUTION: request is not finished yet!`

前言&#xff1a; 在一次与后台的接口联调中&#xff0c;数据量很大&#xff0c;导致页面卡顿&#xff0c;经排查&#xff0c;浏览器的某个接口显示CAUTION: request is not finished yet! 之前没遇到过这个错误&#xff0c;获取数据的接口开始进行请求&#xff0c;状态码返回…...

科研绘图系列:R语言GWAS曼哈顿图(Manhattan plot)

介绍 曼哈顿图(Manhattan Plot)是一种常用于展示全基因组关联研究(Genome-Wide Association Study, GWAS)结果的图形。GWAS是一种研究方法,用于识别整个基因组中与特定疾病或性状相关的遗传变异。 特点: 染色体表示:曼哈顿图通常将每个染色体表示为一个水平条,染色体…...

DjangoRF-11-创建testcases子应用--任务模块

这里先写任务应用&#xff0c;再写套件&#xff0c;然后写接口&#xff0c;最后再写请求&#xff0c; 这个是新的应用&#xff0c;要创建子应用&#xff0c;然后添加到settings的注册里面 1、和往常一样先写模型&#xff0c;序列化&#xff0c;权限&#xff0c;视图&#xf…...

服务器数据恢复—SAN环境下LUN被重复映射导致写操作不互斥的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台存储中有一组由6块硬盘组成的RAID6&#xff0c;划分为若干LUN&#xff0c;MAP到不同业务的SOLARIS操作系统服务器上。 服务器存储故障&#xff1a; 由于业务变化需要增加一台服务器&#xff0c;在存储在线的状态下将该存储中的某个LUN映…...

Linux系统安全加固:从防火墙到SELinux策略

1. iptables防火墙配置 •基础规则设定&#xff1a;学习如何设置iptable的基本规则&#xff0c;包括允许/拒绝特定端口的进出流量&#xff0c;限制特定IP地址的访问等。 •状态检查&#xff1a;利用iptables的状态检查功能&#xff0c;只允许已建立连接或相关联的流量通过&am…...

排序算法:归并排序,golang实现

目录 前言 归并排序 代码示例 1. 算法包 2. 归并排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 归并排序主要操作 1. 合并 2. 分割&#xff08;Divide&#xff09;与递归排序&#xff08;Conquer&#xff09; 总体思想 循环次数测试 假如 10 条数据进行排序…...

CSS 的工作原理

我们已经学习了CSS的基础知识,它的用途以及如何编写简单的样式表。在本课中,我们将了解浏览器如何获取 CSS 和 HTML 并将其转换为网页。 先决条件:已安装基本软件,了解处理文件的基本知识以及 HTML 基础知识(学习 HTML 简介。目的:要了解浏览器如何解析 CSS 和 HTML 的基…...

买完就后悔?只需几步教你 Apple 怎么申请退款

苹果系统不同于 Android 系统的一点在于下载某一些 App 的时候需要付费才能下载&#xff0c;但是有时候在我们付费之后突然就不想要购买了怎么办呢&#xff1f;别急这可以申请退款&#xff0c;你知道 Apple 怎么申请退款吗&#xff1f;下面就带大家了解一下 Apple 申请退款的步…...

【保卫战】休闲小游戏 链游

...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...