首页 > 其他分享 >STM32单片机实现Bootloader跳转的关键步骤(转载)

STM32单片机实现Bootloader跳转的关键步骤(转载)

时间:2023-10-20 10:27:00浏览次数:38  
标签:关键步骤 __ APP FLASH STM32 地址 跳转 BootLoader

STM32单片机实现Bootloader跳转的关键步骤 - 知乎 (zhihu.com)

STM32单片机实现Bootloader跳转的关键步骤 (qq.com)

现在越来越多的嵌入式设备支持远程自动升级,不需要再借助下载器。这样对于设备的维护非常方便。

当然若使设备支持远程升级,需要编写支持升级的程序代码,可以称之为 BootLoader。

也就是说,将设备的程序代码分为两部分:BootLoader 和 APP。

BootLoader 负责升级 APP 以及引导APP运行。APP 负责实现设备的业务处理功能,也就是设备的核心功能代码。

对于Cortex-M 系列的单片机来说,若要实现 BootLoader 安全跳转到 APP,需要进行一些配置。

本文就以 STM32 单片机为例,来聊一聊实现 BootLoader 跳转的关键配置步骤。

聊一聊

在程序开发设计阶段,要根据具体应用情况,对程序存储的 Flash 进行分区。

即,BootLoader 存储的位置以及需要分配的空间大小,以及 APP 的存储的位置和大小。这个存储位置直接关系到程序的执行和跳转。

最简单的一种升级方案是:一个 BootLoader 和 一个 APP ,BootLoader 实现跳转和升级APP 的功能。本文以这个升级方案为例进行介绍。

对于 STM32 单片机来说,程序启动的映射地址为 0x8000000。

可以将 BootLoader 存储在 0x8000000 地址,分配的空间可以根据芯片具体的Flash大小进行调整。比如 0x10000,64K 字节。

APP 存储的地址,安排在 BootLoader 后边,即存储地址为 0x8010000,Flash 剩余的空间都可以分配给APP。

BootLoader 工程配置

BootLoader 的工程需要进行一些配置,以MDK为例,如下图所示,BootLoader 程序存放的 FLASH 地址为 0x8000000,大小为 0x10000。

在跳转APP的程序代码需要注意以下几点:

  • 检查栈顶地址是否合法,也就是 APP 存放的起始地址是否合法,
  • if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
  • 屏蔽总中断,防止在程序跳转过程中,中断干扰出现异常
  • 获取APP程序起始地址,代码区第二个字(起始地址+4 Flash 位置存储的数据)
  • 初始化堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  • 利用 APP 起始地址,转化为函数指针类型,执行跳转

其具体的跳转代码如下:

/* 定义类型 */
typedef void (*pFunction)(void);

/* APP flash address */
#define APP_FLASH_ADDR             (0x8010000)

void jump_to_app(void)
{
  uint32_t JumpAddress;
  pFunction Jump_To_Application;

  /* 检查栈顶地址是否合法 */
  if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
  {
    /* 屏蔽所有中断,防止在跳转过程中,中断干扰出现异常 */
    __disable_irq();

    /* 用户代码区第二个 字 为程序开始地址(复位地址) */
    JumpAddress = *(__IO uint32_t *) (APP_FLASH_ADDR + 4);

    /* Initialize user application's Stack Pointer */
    /* 初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) */
    __set_MSP(*(__IO uint32_t *) APP_FLASH_ADDR);

    /* 类型转换 */
    Jump_To_Application = (pFunction) JumpAddress;

    /* 跳转到 APP */
    Jump_To_Application();
  }
}

APP 工程配置

APP 的工程需要进行一些配置,以MDK为例,如下图所示,APP 程序存放的 FLASH 地址为 0x8010000,大小为 0x30000。

APP程序代码需要进行如下配置:

  • 修改APP 内部 Flash 向量表重定位 SCB->VTOR
  • APP运行后,初始化函数中,开启中断,否则程序会运行异常

正常来说,在启动文件中执行调用 SystemInit() 函数,这个函数会配置 Flash 的接口信息。 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET

修改宏定义 VECT_TAB_OFFSET 的值为 0x10000。

APP程序启动之后,需要先使能全局中断,可将下边的代码放在初始化的地方:

/* 使能中断 */
__enable_irq();

最后

设备运行期间,APP 在运行处理业务功能。如果要升级 APP ,需要从 APP 切换到 BootLoader 中。

那么如何实现 APP 跳转到 BootLoader 呢?有两种方法:

  • 硬件方式,设备断电重启或复位按键
  • 软件方式,通过软件控制复位MCU

软件方式,可以在APP代码中添加控制指令,当APP接收到跳转指令(或者升级指令)后,复位 MCU。如下代码可以复位MCU:

/* 复位芯片 */
HAL_NVIC_SystemReset();

好了,就这些内容。欢迎探讨交流。

标签:关键步骤,__,APP,FLASH,STM32,地址,跳转,BootLoader
From: https://www.cnblogs.com/qijunzifeng/p/17776381.html

相关文章

  • vim+ptags.py 实现跳转
    转载:https://cloud.tencent.com/developer/article/1656073网上很多帖子都是说通过ctags或者ExuberantCtags来实现函数跳转,如果你是C语言开发者,无可厚非,Python怎么办?快来看下面操作吧!1.步骤1.下载一个文件2.使用下载的文件为项目生成tags文件(里面记录了所有函数、类......
  • STM32 ADC基础知识讲解
    (文章目录)前言在正式的学习如何编写ADC代码时我们先来学习一下ADC的基础知识部分,只有掌握好了这些基础知识才能顺利的进行后面的代码编写。一、ADC的基本介绍ADC指的是模数转换器(Analog-to-DigitalConverter),它是一种用于将模拟信号转换为数字信号的电子设备或电路。模拟信......
  • a链接的跳转方式
    a链接可以跳转哪些地方呢,今天就给大家讲解一下a链接跳转有五种,最基本的是  <ahref="http://baidu.com"></a>还有这些_blank表示跳到新页面打开,打开一个新窗口_self表示当前页面打开链接_parent表示在父集框架中打开_top表示在整个窗口中打开framename表示在指定的框架中打开需......
  • 测试用例的优化与整理:确保软件质量的关键步骤
    测试用例的优化和整理对于确保软件质量至关重要。通过消除冗余、精简分类、优先级排序以及考虑边界条件等策略,可以提高测试效率、覆盖更全面的功能和场景,并减少漏测的风险。本文将探讨如何优化和整理测试用例,以提升测试质量和效率。1.消除冗余:在测试用例的审查过程中,我们应当特......
  • vue进行跳转之后出现Cannot read properties of undefined (reading 'router') TypeEr
    问题描述使用router进行页面跳转时,就出现了这样的问题:也就是这里出现了问题:问题解决本来是按照网上的教程:const_this=this;但是,但是,我本来就是用的这种方法呀~然后就打算直接在这个界面引用:importrouterfrom'@/router'router.push('/one');里面引用的跳转页面......
  • 快速入门运维:成为一名高效运维工程师的关键步骤
    引言:运维(OperationsandMaintenance)是现代技术领域中至关重要的角色之一。而作为一名运维工程师,需要负责维护和管理软件系统、网络基础设施和服务器等关键组件。本篇博客将介绍如何快速入门运维,成为一名高效的运维工程师。学习基本概念和原理:在开始之前,了解运维的基本概念和原理......
  • STM32——GPIO输出
    一、结构二、8种模式三、对推挽输出、开漏输出的理解1、推挽输出:推:将电流推出去    挽:将电流挽回来 上图的前两种情况组合,就是推挽输出模式。情况1时即“推”,情况2时即“挽”。2、开漏输出:漏:漏极啥也没接。情况2与3组合构成开漏模式。(常配一个外接上拉电阻)......
  • 将点击跳转放置后台
    prettynum_list.html{%extends'layout.html'%}{%blockcontent%}<divclass="container"><divstyle="margin-bottom:10px"class="clearfix"><aclass="btnbtn-success"......
  • 关于STM32 HAL库版本IAP升级跳转一直进入HAL_Delay()函数;只需要在升级 程序中加入如下
    __set_FAULTMASK(1);/*setvectortable/SCB->VTOR=FLASH_BASE|0x1F800;///USERCODEEND1*//*MCUConfiguration--------------------------------------------------------//Resetofallperipherals,InitializestheFlashinterfaceandtheSystick......
  • FPGA, arduino, STM32, RaspBerry 树莓派 简介
    https://www.cnblogs.com/zhenghb31/p/15046496.html 市面上控制器这么多,似乎每一个都很厉害…为什么有的控制器编写起来那么难,功能很少,有的简单易学,功能强大呢?各种控制器又有什么区别呢?经过我的思考,我个人把控制器分为三类!第一类:基于逻辑电路的控制器(FPGA)FPGA(FieldPr......