[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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3266102.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

全链路追踪 性能监控,GO 应用可观测全面升级

作者&#xff1a;古琦 01 介绍 随着 Kubernetes 和容器化技术的普及&#xff0c;Go 语言不仅在云原生基础组件领域广泛应用&#xff0c;也在各类业务场景中占据了重要地位。如今&#xff0c;越来越多的新兴业务选择 Golang 作为首选编程语言。得益于丰富的 RPC 框架&#xff…

编程类精品GPTs

文章目录 编程类精品GPTs前言种类ChatGPT - GrimoireProfessional-coder-auto-programming 总结 编程类精品GPTs 前言 代码类的AI, 主要看以下要点: 面对含糊不清的需求是否能引导出完整的需求面对完整的需求是否能分步编写代码完成需求编写的代码是否具有可读性和可扩展性 …

力扣算法题:矩阵(玄幻不变量法),链表(虚拟头节点,递归法)

20240725 一、矩阵54.螺旋矩阵(循环不变量) 二、链表1 移除链表元素1.1 原链表删除元素&#xff1a;1.2 虚拟头节点&#xff08;&#xff01;&#xff01;&#xff01;&#xff09; 2. 设计链表206. 反转链表(双向指针和递归)双指针递归 交换链表中的元素虚拟头节点法递归法 删…

如何解决 Nginx 与边缘计算节点的集成问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 如何解决 Nginx 与边缘计算节点的集成问题&#xff1f;一、理解集成的需求和目标二、解决网络配置问题三、优化 Nginx 配置四、处理安全与认证问题五、监控与调试…

STM32是使用的内部时钟还是外部时钟

STM32是使用的内部时钟还是外部时钟&#xff0c;经常会有人问这个问题。 1、先了解时钟树&#xff0c;见下图&#xff1a; 2、在MDK中&#xff0c;使用的是HSEPLL作为SYSCLK&#xff0c;因此需要对时钟配置寄存器&#xff08;RCC_CFGR&#xff09;进行配置&#xff0c;寄存器内…

Jacoco 单元测试配置

前言 编写单元测试是开发健壮程序的有效途径&#xff0c;单元测试写的好不好可以从多个指标考量&#xff0c;其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算&#xff0c;…

在IDEA中切换分支没有反应

说明&#xff1a;记录一次在IDEA中切换分支没有反应的情况&#xff0c;新建一个分支后&#xff0c;准备暂存代码&#xff0c;切换到其他分支去&#xff0c;发现怎么切都没有反应&#xff0c;也没有切过去&#xff1b; 解决&#xff1a;首先&#xff0c;我想到是不是当前新分支…

如何解决 Nginx 与无服务器架构的集成问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 如何解决 Nginx 与无服务器架构的集成问题&#xff1f; 如何解决 Nginx 与无服务器架构的集成问题&#xff1f; 在当今的云计算时代&#xff0c;无服务器架构因…

机器学习驱动的智能化电池管理技术与应用

目录 主要内容 电池管理技术概述 电池的工作原理与关键性能指标 电池管理系统的核心功能 SOC估计 SOH估计 寿命预测 故障诊断 人工智能机器学习 基础 人工智能的发展 机器学习的关键概念 机器学习在电池管理中的应用案例介绍 人工智能在电池荷电状态估计中的…

AttributeError: ‘list‘ object has no attribute ‘text‘

AttributeError: ‘list‘ object has no attribute ‘text‘ 目录 AttributeError: ‘list‘ object has no attribute ‘text‘ 【常见模块错误】 【解决方案】 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英…

谷粒商城实战笔记-63-商品服务-API-品牌管理-OSS获取服务端签名

文章目录 一&#xff0c;创建第三方服务模块thrid-party1&#xff0c;创建一个名为gulimall-third-party的模块2&#xff0c;nacos上创建third-party命名空间&#xff0c;用来管理这个服务的所有配置3&#xff0c;配置pom文件4&#xff0c;配置文件5&#xff0c;单元测试6&…

模型剪枝中有哪些经验|mobile-yolov5-pruning-distillation项目中剪枝知识分析

项目地址&#xff1a;https://github.com/Syencil/mobile-yolov5-pruning-distillation 项目时间&#xff1a;2022年 mobile-yolov5-pruning-distillation是一个以yolov5改进为主的开源项目&#xff0c;主要包含3中改进方向&#xff1a;更改backbone、模型剪枝、知识蒸馏。这里…

路由表与IP数据报的转发

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 1、路由类型 路由表中有3类路由&#xff1a;直连路由、静态路由、动态路由 直连路由&#xff1a;一般指去往路由器接口直接连接网络的…

JAW:一款针对客户端JavaScript的图形化安全分析框架

关于JAW JAW是一款针对客户端JavaScript的图形化安全分析框架&#xff0c;该工具基于esprima解析器和EsTree SpiderMonkey Spec实现其功能&#xff0c;广大研究人员可以使用该工具分析Web应用程序和基于JavaScript的客户端程序的安全性。 工具特性 1、动态可扩展的框架&#x…

LeetCode 2844.生成特殊数字的最少操作(哈希表 + 贪心)

给你一个下标从 0 开始的字符串 num &#xff0c;表示一个非负整数。 在一次操作中&#xff0c;您可以选择 num 的任意一位数字并将其删除。请注意&#xff0c;如果你删除 num 中的所有数字&#xff0c;则 num 变为 0。 返回最少需要多少次操作可以使 num 变成特殊数字。 如…

vue接入google map自定义marker教程

需求背景 由于客户需求&#xff0c;原来系统接入的高德地图&#xff0c;他们不接受&#xff0c;需要换成google地图。然后就各种百度&#xff0c;各种Google&#xff0c;却不能实现。----无语&#xff0c;就连google地图官方的api也是一坨S-H-I。所以才出现这篇文章。 google地…

CSS(七)——CSS 列表和CSS Table(表格)

目录 CSS 列表 列表 作为列表项标记的图像 列表 - 简写属性 移除默认设置 所有的CSS列表属性 CSS 表格 表格边框 折叠边框&#xff08;border-collapse&#xff09; 表格宽度和高度 表格文字对齐 表格填充 表格颜色 CSS 列表 CSS 列表属性作用如下&#xff1a; 设…

Hello SLAM(在Linux中实现第一个C++程序)

首先需要安装vim编辑器&#xff0c;输入命令 sudo apt install vim 在Ubuntu上安装好vim编辑器后&#xff0c;创建路径&#xff08;/home/slambook/ch2&#xff09;&#xff0c;在该路径下创建一个cpp文档&#xff08;touch hello.c&#xff09;&#xff0c;通过vim编辑器进行…

【OpenCV C++20 学习笔记】图片处理基础

OpenCV C20 图片处理基础 VS 2022 C20 标准库导入的问题头文件包含以及命名空间声明main函数读取图片读取检查显式图片写入图片 完整代码bug VS 2022 C20 标准库导入的问题 VS还没有完全兼容C20。C20的import语句不一定能正确导入标准库&#xff0c;所以必须要新建一个头文件专…