STM32单片机bootloader扫盲

本文详细介绍了STM32单片机的BootLoader概念及其与应用程序的关系,阐述了BootLoader如何跳转到APP的过程,并提供了具体的跳转函数示例。同时,讨论了单APP和双APP框架的优缺点,以及如何通过BootLoader进行系统升级。此外,还提到了STM32的系统BootLoader的使用方法和地址,以及如何从APP跳转到系统BootLoader进行程序更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32单片机BootLoader扫盲

BootLoader和APP之间的关系

APP就是平时写的单片机上的应用程序,而BootLoader本质上和APP一样,也是平时写的应用程序。BootLoader只不过是拥有从外部接收数据,更新Flash(也就是APP),跳转至APP功能的特殊APP罢了。

以STM32F103为例,如果没有BootLoader,flash分布就如下图左半部分。如果有BootLoader,就如下图右半部分,将flash分为两部分(这里举例用0x800 4000做分界线),存储了两个应用程序(BootLoader和APP)

在这里插入图片描述

如何从BootLoader跳转到APP

从外部接收数据,更新Flash,普通的APP也会有这样的需求。不常见的也就是从BootLoader跳转到APP这个功能了。STM32 单片机启动流程中介绍了单片机上电后的启动流程,其实也就主要干了两件事:

  • 将栈顶位置加载到MSP寄存器中
  • 将复位中断服务函数的入口地址给PC寄存器

然后单片机执行复位中断服务函数,在复位中断服务函数中设置中断向量表的偏移地址,准备C环境,最后跳转到main()函数。同理,从Bootloader跳到APP也需要干这两件事情,只不过上电时是单片机自动加载的MSP和PC,而从Bootloader跳到APP则需要我们编写函数进行跳转。

下面是STM32 跳转到APP的具体函数,在BootLoader函数中调用即可跳转到APP_ADDR,如果该地址存放了APP的bin文件则会运行APP的复位中断服务函数(一定要记得在APP中修改中断向量表偏移地址,如APP中不修改则默认使用BootLoader的中断向量表,APP中发生中断时就会去查BootLoader的中断向量表,从而调用BootLoader的中断服务函数),进而运行APP的main()函数。同理,APP跳转到BootLoader,修改跳转地址 APP_ADDR 为BootLoader地址(这里为0x8000000)即可实现.

/* 开关全局中断的宏 */
#define ENABLE_INT() __set_PRIMASK(0)  /* 使能全局中断 */
#define DISABLE_INT() __set_PRIMASK(1) /* 禁止全局中断 */
#define APP_ADDR    0x8004000          /* APP地址 */
void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
static uint32_t AppAddr = APP_ADDR;    /* APP地址 */
  
/*
*********************************************************************************************************
* 函 数 名: JumpToApp
* 功能说明: 跳转到APP
* 形    参: 无
* 返 回 值: 无
************************************************************************
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值