对于一个复杂的单片机项目来说,有一个 BootLoader(以下简称BL)是非常重要的。它可以使得你的应用程序代码维护和升级更加便捷。
之前分享过一些软件升级的文章:
嵌入式设备实现OTA升级的原理
(相关资料图)
嵌入式设备差分升级原理和实现(附代码)
专为32位单片机开发的轻量级OTA组件(开源)
单片机通过 UART 实现 OTA 升级的详细流程
本篇文章,带你了解为什么要设计 Bootloader,以及如何设计 Bootloader。争取做到知其然、知其所以然。
通过对 BL 进行详细的讲解,希望让大家可以体会到它的重要性。
1、依赖于专门的上位机或下载器硬件,不能作到统型;
1、通信方式统一(比如一律都用串口));
2、提供一个友好的操作界面(比如命令行方式);
3、高效快速,没有附加操作,最好一键自动化烧录;
4、另外再增加一些嵌入式固件管理的功能(比如固件版本管理)。
可以看到BL就是一段存储在ROM中的程序,它主要实现4个功能:
1、通过某种途径获取要烧录的固件数据;
2、将固件数据写入到ROM的APP区中;
3、跳转到APP区运行,将烧录进去的用户程序引导起来;
基本的操作逻辑如下:
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 区中;
#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. }}
觉得文章不错,点击“分享”、“赞”、“在看” 呗!
标签: