【嵌入式实战】STM32 Bootloader 快速实现(超详细)

2023-05-16

文章目录

  • 原创声明
  • 前言
  • 一、Bootloader 是什么?
  • 二、BootLoader 的实现
    • 2.1 生成 bin 文件
    • 2.2 确认应用程序的起始位置
    • 2.3 编写引导程序
  • 三、App 的实现
    • 3.1 修改 IROM1 的位置
    • 3.2 修改向量表
    • 3.3 加入 App 循环打印提示
  • 四、演示效果
  • 总结
  • 授权须知

原创声明

本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!


前言

嵌入式的设备,或多或少都需要对设备进行更新已适配更多的需求,如果未出货的设备还可以使用下载线去下载,但是如果出货之后到了客户那里,客户没有下载线而且不是专业人员,无法对设备进行升级,这时候,bootLoader 的重要性就凸显出来了,bootLoader 的设计就是为了设备能够进行远程升级或者只用指令升级,极大简便了升级需要的步骤,做到傻瓜式升级,极大增强了产品的后续维护性。

下面我来介绍写如何快速实现 STM32 BootLoader 的引导,帮助正在读文章的您更快将此技术运用起来!

我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


一、Bootloader 是什么?

Bootloader是在应用程序开始前运行的一个小程序,里面可以进行一些初始化操作,升级引用程序等,在嵌入式设备中很常见。

二、BootLoader 的实现

我这里做了一个简单的 BootLoader 程序,只能进行引导,还没有对升级进行编写,升级是对约定好的应用程序Flash 进行擦+写,比较常用的升级方式是通过 TFTP 的方式进行升级,您可以在 STM32官方的这个例程找到答案: 基于LwIP TCP/IP栈通过以太网进行STM32F4x7应用内编程(IAP)(AN3968)

2.1 生成 bin 文件

  • 使用 Cube 生成出来后,打开工程的设置选项,填入如下命令
fromelf --bin -o ".\bin_file\@L.bin" "#L"

在这里插入图片描述

  • 编译之后,可以看到 bin_file 文件夹里面生成了 bin 文件,并可以知道其大小,我们根据其大小约定应用程序Flash 的起始位置
    在这里插入图片描述

2.2 确认应用程序的起始位置

  • 升级的过程被称为 IAP(In Application Programming) ,每个芯片的 Flash 的扇区不同,我这里使用的是 STM32F767,上官网查看有关资料:STM32F76xxx and STM32F77xxx advanced Arm®-based 32-bit MCUs.pdf 里面有关于 Flash 扇区的地址信息:
    在这里插入图片描述

  • 步骤2.1已经知道 BootLoaderbin文件大小是22 KB,我们可以根据上面的 Flash 扇区进行分配,我将应用程序的起始位置定在 扇区1,起始地址为 0x0800 8000

2.3 编写引导程序

#include "stm32f7xx.h"

typedef  void (*pFunction)(void);

/*!
* @brief 跳转到应用程序段
*        执行条件:无
* @param[in1] : 用户代码起始地址.
*
* @retval: 无
*/
void jump_to_app(uint32_t app_addr)
{ 
    
    pFunction jump_to_application;
    uint32_t jump_address;
    
    /* Check if valid stack address (RAM address) then jump to user application */
    if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      jump_address = *(__IO uint32_t*) (app_addr + 4);
      jump_to_application = (pFunction) jump_address;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) jump_address);
      jump_to_application();
    }    
    
}

#define FLASH_JUMP_ADDR							(0x08008000)

int main(void)
{
	/* 
		初始化程序省略.....  
	*/
	
	if(((FLASH_JUMP_ADDR+4)&0xFF000000)==0x08000000) //Judge if start at 0X08XXXXXX.
	{
		jump_to_app(FLASH_JUMP_ADDR); // Jump to  APP
	}
	
	while(1)
	{
	
	}
}


三、App 的实现

3.1 修改 IROM1 的位置

根据约定好的 Flash 起始位置进行更改,上面步骤 2.2 已经确定好是 0x08008000
在这里插入图片描述

3.2 修改向量表

搜索宏定义 VECT_TAB_OFFSET,将 0x00 改为距离 0x08000000 的偏移量

/*!< Uncomment the following line if you need to relocate your vector Table in    Internal SRAM. */
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.
                                  This value must be a multiple of 0x200. */

3.3 加入 App 循环打印提示

void StartDefaultTask(void const * argument)
{
	/* USER CODE BEGIN StartDefaultTask */
	segger_rtt_init("APP enter!");
	/* Infinite loop */
	for(;;)
	{
		print_log("You are in App now !!\n");
		osDelay(1000);
	}
	/* USER CODE END StartDefaultTask */
}

四、演示效果

  • 确认烧录过程是 Erase Sectors
    在这里插入图片描述

  • 打开 RTT 窗口,连接 RTTSTM32 ,依次烧录 BootLoaderApp 的程序;
    如何使用 JLink 实现 Segger log 可以按参考我之前的文章: 【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)

  • 烧录完 App 程序之后,可以在 RTT窗口 看到正确引导到 App成功!!!
    在这里插入图片描述

总结

以上是使用 快速搭建 STM32 Bootloader 的引导程序,希望能够帮助正在读文章的您更快将此技术运用起来!


更多阅读推荐
  • 【嵌入式实战】STM32+Lwip 实现 DHCP+HostName(超详细) : 在 DHCP 的基础上 Ping 域名的方式获取 DHCP 的 IP
  • 【嵌入式实战】STM32+Lwip 实现 SNTP 网络授时(超详细)
  • 【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)
  • 【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)
  • 【嵌入式实战】STM32+Lwip 实现 MQTT(超详细步骤+代码注释,内含避坑提示)

我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


授权须知

  1. 原创文章在推送两天后才可进行转载
  2. 转载文章,禁止声明原创
  3. 不允许直接二次转载,转载请根据原文链接联系作者
  4. 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
    但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:HinGwenWoong
一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
CSDN: HinGwenWoong
原文链接:【嵌入式实战】STM32 Bootloader 快速实现(超详细)

  1. 若需要修改文章的排版,请根据原文链接联系作者
  2. 再次感谢您的认可,转载请遵守如上转载须知!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式实战】STM32 Bootloader 快速实现(超详细) 的相关文章

  • ubuntu配置静态IP、DNS地址

    虚拟机需要使用桥接上网 1 ifconfig 查看网卡信息 2 vi etc network interfaces 打开并编辑配置文件 配置说明 xff1a auto lo iface lo inet loopback auto ens33
  • c调用libcurl库发送GET 和 POST请求

    libcrul请求的基本套路流程 1 调用curl global init 初始化libcurl2 调用curl easy init 函数得到 easy interface型指针3 调用curl easy setopt 设置传输选项4 根据
  • LINUX 操作GPIO口

    两种方法 1 写驱动的方式 缺 2 通过linux提供的用户空间 终端控制 通过在用户空间上来操作GPIO xff0c 控制入口在 xff1a sys class gpio 首先确认内核里是否已选择上gpiolib的sysfs接口功能 默认
  • V4L2简介

    http work blog readthedocs org en latest v4l2 20intro html 第一章 V4L2简介 1 1 什么是v4l2 V4L2 xff08 Video4Linux的缩写 xff09 是Linux
  • 电子设计项目

    全套完整毕业设计智能家居控制系统设计 16X16点阵滚动显示 单片机595 43 138LED点阵 基于WIFI传输的单片机传感器设计 xff08 毕业论文 xff09 基于单片机设计的多点测温系统 数码管显示温度 基于单片机设计的公交报站
  • 视觉惯导里程计VIO综述

    最近阅读了VIO中的一些论文 xff0c 在这里做个汇总方便以后查阅 xff0c 如有问题欢迎指正 一 背景 VIO xff08 Visual Inertial Odometry xff09 视觉惯导里程计 xff0c VINS xff08
  • 【Cocos2d-X-2.1.4游戏引擎】发布第一个游戏

    有一段时间没更新博客了 xff0c 最近一直在写一个小游戏 xff0c 游戏在今天终于搞好了 xff0c 又可以开始写写博客 xff0c 打打dota的悠闲的日子了哈 看了十几天cocos2d x后 xff0c 也依照官网的例子写了个打飞机
  • 游戏升级之路

    七十一雾央原创 转载请注明 http blog csdn net hust xy 楼主学习编程有两年了 xff0c 决定向游戏发展大概就是半年前了 xff0c 在这里总结一下游戏方面的学习经历过 xff0c 给初学的朋友们参考下 xff0c
  • Nmap安装和使用详解

    文章目录 Nmap概述功能概述运行方式 Nmap安装Nmap参数详解目标说明主机发现端口扫描端口说明和扫描顺序服务与版本探测脚本扫描操作系统探测时间和性能防火墙 IDS规避和欺骗输出选项使用示例 常用扫描命令扫描ip地址或域名扫描整个网段扫
  • MSCKF_VIO:MSCKF的双目版本

    论文 xff1a MSCKF的双目版本 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 下载地址 xff1a 点击 源码地址 xff1a https git
  • 功能测试,系统测试,兼容性测试,手工测试

    功能测试 功能测试一般需要根据编写的 测试用例 xff0c 执行测试用例 xff0c 执行的过程中提交缺陷 xff1b 功能测试一般至少会有两轮 xff0c 遇到比较麻烦的项目甚至会有三到四轮 xff0c 而每一轮测试都有其侧重点 xff0
  • C++ sdk 获取执行文件所在路径

    TCHAR szFilePath MAX PATH 43 1 61 0 GetModuleFileName NULL szFilePath MAX PATH tcsrchr szFilePath T 39 39 1 61 0 szFileP
  • UART串口

    一 串口的历史 首先 xff0c 串口对每一个做硬件和嵌入式软件的人来说 xff0c 就是一个必备的工具 xff0c 调试一个带MCU或者CPU的系统 我们在调试的过程中 xff0c 一般第一件事情 xff1a GPIO点灯 xff0c 第
  • C++软件工程师的发展前景如何?

    目前国内的嵌入式开发非常火 xff0c 而C 43 43 主要用于底层的嵌入式开发 驱动开发等 xff0c 也用于WINCE等嵌入式系统的应用软件开发 可以说C 43 43 软件工程师发展前景还是不错的 xff0c 下面就给大家具体介绍一下
  • 成为一名C++开发工程师,需要具备哪些条件?

    C 43 43 是C语言的继承 xff0c 它既可以进行C语言的过程化程序设计 xff0c 又可以进行以抽象数据类型为特点的基于对象的程序设计 xff0c 还可以进行以继承和多态为特点的面向对象的程序设计 C 43 43 擅长面向对象程序设
  • 一年精通,三年熟悉,五年了解,十年用过!C++真的这么难吗?

    C 43 43 有句俗话说 xff1a 一年精通 三年熟悉 五年了解 十年用过 如果可以把C 43 43 程序员分层的话 xff0c 看看你在第几层 xff1f 第0层 掌握基本的C 43 43 语法 xff0c 会写一些基本的if els
  • 【C语言实现贝塞尔曲线】无聊人士专用程序,PS钢笔工具最初原形~

    简介 动态演示贝塞尔曲线的绘制过程 支持任意点数 任意阶次 点击鼠标右键 xff0c 在鼠标位置将创建新的点 按住鼠标左键拖动控制点 空格键屏幕将清空 一起来玩一玩吧 xff01 运行效果 源码 程序名称 xff1a 贝塞尔曲线 inclu
  • c++ stream iword、pword和register_callback函数

    pword xff0c stream 的 register callback函数 include lt iostream gt include lt sstream gt using namespace std const int name
  • AWS CLI version 2 在 Windows 下的安装

    首先你需要到下面的链接地址中下载需要的应用 xff1a https awscli amazonaws com AWSCLIV2 msi 双击运行 双击运行下载的可以运行的文件 下一步继续 下一步继续安装进程 许可协议 你需要同意许可协议后继
  • MATLAB安装时为英文如何切换中文

    MATLAB安装时为英文如何切换中文 MATLAB安装问题 问题描述 2018b及以上版本的MATLAB安装时 xff0c 其中英文模式会根据电脑所在区域环境进行配置 若电脑所在区域环境不在中国 xff0c 则MATLAB初始化安装会被定义

随机推荐

  • VINS-Fusion-RGBD在双轮差数轮小车上配置并进行稠密建图

    VINS Fusion RGBD在小车上进行稠密建图 1 轮式里程计代替视觉里程计2 其他获得更为鲁棒性建图效果的做法3 点云地图及栅格地图的获得4 多个参数可配置 VINS Mono由于存在运动初始化过程 xff0c 对于地面小车来说运动
  • ST LINK V2.1接线图

    方便查询 xff0c 图片来源已经忘记了 xff0c 如有冒犯请通知我 特此记录以防忘记 anlog 2020年8月29日
  • ROS笔记之Gazebo机器人仿真(二)——Soildworks搭建机器人模型

    1 引言 机器人的模型是通过URDF文件进行描述 xff0c 具体说明可以参考URDF 但对于一些复杂的机器人 xff0c 通过直接编写URDF文件就比较繁琐 xff0c 这里我们介绍一种通过专业的三维建图软件Soildworks构建模型然
  • ROS笔记之Gazebo机器人仿真(四)——Rviz及Gazebo下机器人模型显示

    1 引言 上一章中我们成功导出了URDF文件 xff0c 这章中我们将学习如何在Rviz和Gazebo下显示我们创建的三维模型 2 预备 首先 xff0c 我们需要对导出的URDF文件进行下修改 xff08 1 xff09 package
  • 制作树莓派镜像img,并在其他新板上使用,实现批量克隆树莓派板

    1 将现有的系统制作成镜像img 2 配置网络 1 将现有的系统制作成镜像img 1 1 先将新买的sd卡用SDFormatter工具格式化 xff0c 以作备用 1 2 将带有系统的sd卡用Win32DiskImager exe工具Rea
  • Qt开发-Qt对象间的关系

    一 Qt对象间的关系 1 Qt对象间可以存在父子关系 xff08 1 xff09 每个对象都保存有它所有子对象的指针 xff08 2 xff09 每一个对象都有一个指向其父对象的指针 2 当指定Qt对象的父对象时 xff08 1 xff09
  • VScode+esp-idf:例程(esp32-web-camera)保存视频到sd卡(附源码)

    文章目录 1 移植到 esp32 web camera 2 jpeg2avi使用方法2 1 何处调用jpeg2avi start2 2 何处调用jpeg2avi add frame2 3何处调用jpeg2avi end 3 编译运行工程4
  • 单片机能代替PLC吗?过来人告诉你

    随着科技的进步和市场的需要 xff0c 近年来出现了 非常多 类似Arduino 这样的开源电子原型平台 xff0c 它们大部分实现了对单片机的二次封装 xff0c 所有外设 模块接口都是现成的 xff0c 对于 使用者 的要求 只需懂C语
  • STM32学到什么程度可以就业

    很多在门外观望的朋友总会有这些担心 STM32难不难学 xff1f 学到什么程度可以去工作 xff1f 前景怎么样 xff1f 对应的工资高不高 xff1f 对于小编来说最难的事你已经在做了 xff0c 就是还在门口观望 xff0c 望来望
  • 那么辛苦的熬单片机,不拿它DIY点小玩意怎么对得起自己。

    大家好 xff0c 我是华维蔵鹰 xff0c 不管你处于什么身份 做任何一件事情你都会需要一个动力的源泉 在大学中很多人弹吉他并不是爱好它 xff0c 只是为了多点机会去接触些妹子 xff0c 就像我们以前刚入门单片机的时候 xff0c 都
  • 众人寻AI千百度

    引 xff1a 说起AI xff0c 或许很多普通人仍然不清楚这是什么 然而说起人工智能 xff0c 机器人 xff0c 想必大家不是如雷贯耳也是耳濡目染 xff0c 略知一二 从小我们便不断的从电影 xff0c 电视剧中接触AI xff0
  • PID知识总结

    PID算法算是控制系统中一个比较常见的控制算法了 xff0c 特别是在闭环控制系统中 xff0c PID的使用尤为常见 xff0c 鄙人由于电赛延期在家闲来无事 xff0c 决定把自己在电赛备赛期间所学的PID知识总结一下 xff0c 希望
  • Java中this关键字的几种用法

    1 当成员变量和局部变量重名时 xff0c 在方法中使用this 时 xff0c 表示的是该方法所在类中的成员变量 xff08 this 是当前对象自己 xff09 如 xff1a public class Hello String s 6
  • WIN10 ping不通 VMWare CentOS7

    如题 Win10 ping不通VMWare下的Centos7 因为使用的是NAT模式 xff0c 所以检查虚拟网络编辑器下面的配置 VMWare下编辑 gt 虚拟网络编辑器 查看VMnet8的IP 设置虚拟机的IP地址和VMnet同一段 启
  • 计算机视觉数据集大全 - Part2

    转载自http homepages inf ed ac uk rbf CVonline Imagedbase htm Index by Topic Action Databases Agriculture Attribute recogni
  • Server unexpectedly closed network connection的解决

    1 apt get remove openssh server 2 sudo apt install openssh server 3 sudo service ssh start 4 ps aux grep ssh 5 sudo apt
  • STM32 GPIO模拟UART串口:最简延时方式

    STM32 GPIO模拟UART串口 xff1a 最简延时方式 在一些应用场景 xff0c MCU的硬件UART资源不足时 xff0c 或者可用于硬件UART配置的管脚优先配置给了其它功能使用 xff0c 就可以通过GPIO模拟UART功能
  • 【C++】带你深入理解vector

    目录 1 vector的介绍 2 vector类方法的模拟实现 2 1 vector类构造函数的实现 2 2 begin 和end 2 3 size capacity 和empty 2 4 运算符 的重载 2 5 reserve 2 6 r
  • 2019年个人在嵌入式领域上的发展思路

    摘自 xff1a 嵌入式软件工程师前期职业生涯规划 嵌入式软件工程师学习路线 1 打好嵌入式软件编程的基础 这一阶段重点打好嵌入式软件编程的基础 xff0c 包括 学习Linux系统的基本应用Linux的常用命令C语言编程基础常用的数据结构
  • 【嵌入式实战】STM32 Bootloader 快速实现(超详细)

    文章目录 原创声明前言一 Bootloader 是什么 xff1f 二 BootLoader 的实现2 1 生成 bin 文件2 2 确认应用程序的起始位置2 3 编写引导程序 三 App 的实现3 1 修改 IROM1 的位置3 2 修改