首页 热点 资讯 财经 国内 行业 商业 生活 快讯

深入浅出讲解单片机的BootLoader(一)

来源:面包芯语      时间:2023-07-02 08:26:03

扫描关注一起学嵌入式,一起学习,一起成长

对于一个复杂的单片机项目来说,有一个 BootLoader(以下简称BL)是非常重要的。它可以使得你的应用程序代码维护和升级更加便捷。

之前分享过一些软件升级的文章:

嵌入式设备实现OTA升级的原理


(相关资料图)

嵌入式设备差分升级原理和实现(附代码)

专为32位单片机开发的轻量级OTA组件(开源)

单片机通过 UART 实现 OTA 升级的详细流程

本篇文章,带你了解为什么要设计 Bootloader,以及如何设计 Bootloader。争取做到知其然、知其所以然。

通过对 BL 进行详细的讲解,希望让大家可以体会到它的重要性。

1、烧录方式的更新迭代

更方便的ISP烧录方式

1、依赖于专门的上位机或下载器硬件,不能作到统型;

1、通信方式统一(比如一律都用串口));

2、提供一个友好的操作界面(比如命令行方式);

3、高效快速,没有附加操作,最好一键自动化烧录;

4、另外再增加一些嵌入式固件管理的功能(比如固件版本管理)。

关于Bootloader

Bootloader的基本形态

可以看到BL就是一段存储在ROM中的程序,它主要实现4个功能:

1、通过某种途径获取要烧录的固件数据;

2、将固件数据写入到ROM的APP区中;

3、跳转到APP区运行,将烧录进去的用户程序引导起来;

Bootloader的两个设计实例

基本的操作逻辑如下:

1、通过超级终端、SecureCRT 或 Xshell 之类的串口终端输入命令 program;

2、BL 接收到命令后,开始等待接收固件文件数据;

3、串口终端通过某种文件数据传输协议(例如 X/Y/Zmodem协议)将固件数据传给BL;

4、BL 将固件数据写入到 ROM 的 APP 区中;

基本的操作逻辑如下:

1、将待烧录的固件拷贝到SD卡中;

2、将SD卡插入到卡槽中;

3、BL 检测到 SD 卡插入,搜索卡中 BIN 文件;

4、将 BIN 文件数据读出写入到 ROM 的 APP 区中;

BL实现的要点

#define VECT_TAB_OFFSET 0x4000

typedef void (*iapfun)(void);iapfun jump2app; void MSR_MSP(u32 addr){ __ASM volatile("MSR MSP, r0"); //set Main Stack value* __ASM volatile("BX r14");*}void load_app(u32 appxaddr){ if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)//**检查栈顶地址合法* { //**用户代码区第二个字为程序开始地址(**复位地址) jump2app=(iapfun)\*(vu32\*)(appxaddr+4); //**初始化APP**堆栈指针(**用户代码区的第一个字用于存放栈顶地址) MSR_MSP(*(vu32*)appxaddr); jump2app(); //**跳转到APP. }}

觉得文章不错,点击“分享”、“赞”、“在看” 呗!

标签:

最新文章

最新文章