BootLoader

在嵌入式系统中,BootLoader(引导加载程序) 是系统上电后首先执行的程序,主要用于系统启动和固件升级。它的作用至关重要,既是系统的“启动引导者”,也是固件更新的重要保障。

BootLoader 定义

BootLoader 是一个运行在嵌入式设备上的小程序,位于系统的最底层,通常存储在 Flash 的特定区域。它的主要任务包括:

  1. 硬件初始化:配置时钟、存储器、引脚、外设等。
  2. 加载主程序:将用户应用程序加载到 RAM 并跳转执行。
  3. 固件升级:支持本地或无线方式的固件更新,如 UART、CAN、SPI、I2C 或 OTA(Over-The-Air)等。
  4. 系统恢复:在系统主程序损坏时,可以引导恢复程序执行。

工作原理

嵌入式设备在上电复位后,CPU 会从一个固定的地址开始执行程序(通常是 Flash 的 0x00000000 地址)。

  • 此时,BootLoader 程序首先运行,它会进行一系列初始化操作,并判断是否需要执行特殊任务(如固件升级)。
  • 如果不需要升级,则跳转到主程序的入口地址,运行用户应用程序。

启动流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+---------------------------+  
| 上电或复位 |
+---------------------------+

+---------------------------+
| CPU 执行 BootLoader |
+---------------------------+

| 是否进入升级模式? |——— 是 —→ [ 进入升级模式 ]
↓ 否
+---------------------------+
| 初始化外设与硬件 |
+---------------------------+

| 跳转到用户程序入口地址 |

+---------------------------+
| 运行用户程序 |
+---------------------------+

固件升级

BootLoader 支持对系统固件进行升级,这在嵌入式开发中非常重要。例如:

  • 本地升级:通过串口(UART)、USB、SD 卡等传输新固件。
  • 无线升级(OTA):通过蓝牙、Wi-Fi 等通信方式远程传输固件。

实现步骤

  1. 接收新固件:通过通信接口接收新固件数据(分包接收)。
  2. 数据校验:对接收到的数据进行校验(如 CRC16 校验)以确保完整性。
  3. 擦除 Flash 区域:擦除旧的程序存储区。
  4. 写入新固件:将接收到的数据写入 Flash。
  5. 重启执行新固件:升级完成后重启 MCU,BootLoader 跳转执行新程序。