什么是MCU的BootLoader?

一、 什么是BootLoader?

对于嵌入式MCU来说,当产品稳定投产,程序烧录后,MCU我们一般是看不到的,因为外面被外壳等材料覆盖,那后期产品需要升级,无法使用烧录口的情况下,我们怎么解决问题了?
BootLoader就是为了解决这样的问题来设计的,它相当于一个引导程序。这段程序比较特殊,他可以通过一定方式,比如用按键触发、或者UDS协议指令(汽车行业)触发进入运行,BootLoader运行后,他可以通过串口接收新的代码并写入Flash,从而在不能使用烧录器的情况下,升级程序,如下流程图所示:
在这里插入图片描述

二、BootLoader是上电就运行的吗?

之前一直以为BootLoader是MCU里面上电就运行的程序,后面才发现其实并不是。
其实MCU里面有一段代码叫“Starup Code”即启动代码。它在MCU上电或复位后最先执行。主要完成堆栈指针的设置,复位向量的获取和加载,然后初始化变量,最后跳转到用户代码。

当芯片复位,或从Standby低功耗模式唤醒时:

  • 如果引脚BOOT0是被拉低的,将映射到Flash memory。这里是常用的代码运行模式;
  • 如果引脚BOOT0是拉高的,且nBOOT为1,将映射到System memory,进入BootLoader模式
  • 如果引脚BOOT0是被拉高的,且nBOOT1为0,将映射到SRAM。
    注:nBOOT1为Flash寄存器中的一位。
    以上可以直接阅读参考1,博主写的很好很全面。

三、BootLoader的种类

BootLoader严重依赖硬件实现,而嵌入式环境硬件环境变化太多了,不可能存在一个统一的BootLoader,所以市场上有很多不同类型的BootLoader存在

  • Redboot
    Redboot是Redhat公司随eCos发布的一个BOOT方案,是一个开源项目。
  • ARMboot
    ARMboot是一个ARM平台的开源 固件项目,它特别基于PPCBoot,一个为PowerPC平台上的系统提供类似功能的姊妹项目。鉴于对PPCBoot的严重依赖性,已经与PPCBoot项目合并,新的项目为 U-Boot。
  • U-Boot
    U-Boot是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch的Loader合称U-Boot。2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot和ARMboot停止维护。
  • Blob
    Blob(Boot Loader Object)是由Jan-Derk Bakker and Erik Mouw发布的,是专门为StrongARM 构架下的LART设计的Boot Loader。
    详细内容可以查看参考3
    参考:
  1. STM32F0单片机快速入门三 MCU启动过程
  2. 汽车ECU的Bootloader升级过程分析
  3. 什么是Bootloader?
为了确定微控制器(MCU)是否进入了bootloader,通常需要在bootloader的代码中设置一个检查机制。这个机制可以是一个特定的标记、状态寄存器、内存位置或者通过检测某个特定的硬件信号。以下是一个简单的例子,展示了如何使用一个全局变量作为进入bootloader的标志: ```c #include <stdbool.h> // 全局变量,标记是否进入bootloader bool bootloader_active = false; // 假设这是进入bootloader之前的某个点 void enter_bootloader_mode() { // 设置全局变量为true,表示进入bootloader bootloader_active = true; // 执行其他必要的初始化代码... } // 在bootloader的主循环或处理函数中 void bootloader_loop() { if (bootloader_active) { // 执行bootloader代码... } } int main() { // 其他应用程序代码... // 假设某个条件触发了bootloader的进入 enter_bootloader_mode(); // 之后可能的应用程序代码,但此时不会执行,因为bootloader_active为true // ... return 0; } ``` 在上面的代码中,当`enter_bootloader_mode`函数被调用时,它将`bootloader_active`变量设置为`true`。然后,程序会进入一个循环,在这个循环中,它会检查`bootloader_active`是否为`true`,如果是,则执行bootloader代码。 在实际的MCU应用中,确定是否进入了bootloader通常涉及更加复杂的机制,例如使用MCU的特定硬件特性,如看门狗定时器(WDT)复位值、特殊的引脚状态、或者由外部设备发出的信号来触发。有时,这个决定可能是由一个外部的引导程序或者启动代码来完成的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值