【GD32】ROM Bootloader、自定义Bootloader区别
Bootloader是应用程序跑起来之前,用于初始化的一段程序,它分为两种,ROM Bootloader、自定义Bootloader。GD32芯片出厂时预烧录在ROM中的Bootloader(以下简称ROM Bootloader)和自己编写的Bootloader(以下简称自定义Bootloader)在角色、目的、能力和实现方式上有着根本性的区别。
你可以将它们理解为:
- ROM Bootloader:芯片厂商提供的、永久的、功能单一的 “安全救生艇”。它被固化在硬件里,无法被修改或擦除,用于最基础的恢复和编程。
- 自定义Bootloader:软件工程师开发的、灵活的、功能强大的 “汽车4S店”。它存储在用户Flash中,可以实现复杂的应用逻辑(如网络更新、故障恢复、A/B分区),但本身也可能被损坏。
下面是它们的详细区别:
核心区别对比表
特性 | 芯片ROM Bootloader (内置ISP) | 用户自定义Bootloader (在Flash中) |
---|---|---|
物理存储 | 只读存储器(ROM) | 用户Flash的起始部分 (例如 0x0800 0000 ) |
可修改性 | 不可修改、不可擦除 | 可被修改、更新、甚至擦除 |
调用方式 | 通过BOOT引脚电平在复位时强制进入 | 通常由软件逻辑或标志位决定跳转 |
主要目的 | 工厂编程、烧录器替代、恢复变砖 | 产品发布后的现场固件升级(FOTA/OA) |
功能 | 功能固定单一 (通常是串口/USB DFU) | 功能无限可能 (以太网、Wi-Fi、蓝牙、CAN、USB等) |
内存占用 | 不占用用户Flash空间 | 占用一部分用户Flash空间 (通常几十KB) |
安全性 | 无或基础校验 | 可加入高级安全措施 (加密、签名、CRC校验) |
易用性 | 需手动操作BOOT引脚,配合PC软件 | 全自动,用户无感或通过App触发 |
**** | “救命”的 | “优化”的 |
详细解释
1. ROM Bootloader (内置Bootloader)
- 本质:它是芯片硅片的一部分,在芯片制造时就被固化在硬件里。它不是存储在Flash中的,因此你无法通过任何方式修改或删除它。它永远在那里。
- 目的:
- 最初编程:在芯片贴到PCB板上之前,厂商或客户可以用它通过串口给空白芯片下载第一个程序。
- 恢复“变砖”:如果用户的自定义Bootloader或应用程序编写有bug,导致程序无法运行(即“变砖”),你可以通过操作BOOT引脚强制进入ROM Bootloader,从而重新烧写一个正确的程序。它是最后的救命稻草。
- 功能:通常只支持非常基础的通信接口,如:
- USART(串口):这是最普遍的方式。
- USB DFU(部分型号支持)。
- 功能单一:主要是接收数据并写入主Flash。
- 使用场景:需要手动干预。工程师必须用跳帽改变BOOT引脚电平,然后复位芯片,再打开电脑上的ISP下载工具(如GD32 MCU ISP Programmer)进行操作。普通最终用户根本无法使用这个功能。
2. 自定义Bootloader (用户Bootloader)
- 本质:它是你自己编写或使用第三方库开发的一段程序,存储在主Flash的开头部分(例如从
0x0800 0000
开始)。它和你的应用程序(App)一样,是可以被修改、更新和擦除的。 - 目的:
- 现场固件升级(FOTA - Firmware Over-The-Air):这是最主要的目的。产品发布到现场后,可以通过各种网络方式(Wi-Fi、4G、以太网)远程接收新固件并更新自身,无需召回产品。
- 多应用程序管理:实现A/B分区(双固件备份),保证更新失败后能回滚到旧版本。
- 安全启动:在跳转到应用程序前,对其进行密码签名验证、CRC校验等,确保固件完整且来自可信源。
- 功能:取决于你的代码能力和硬件资源,可以实现任何复杂的功能:
- 支持多种通信协议:以太网、Wi-Fi、蓝牙、CAN总线、USB、SD卡等。
- 高级功能:固件解密、数字签名验证、断点续传、更新状态上报等。
- 使用场景:全自动或用户友好。例如:
- 设备屏幕上出现“发现新版本,是否更新?”的提示,用户点击“确定”即可。
- 设备在半夜自动从服务器检测并下载更新,完成后自动重启生效。
工作流程对比
ROM Bootloader 工作流程:
自定义Bootloader 工作流程:
总结
ROM Bootloader | 自定义Bootloader | |
---|---|---|
角色 | 芯片自带的修复工具 | 你开发的产品功能 |
存储 | 硬件ROM | 用户Flash |
特点 | 永久、安全、功能弱 | 灵活、强大、有风险 |
关系 | 用于更新和恢复自定义Bootloader和App | 依赖于ROM Bootloader作为最后的备份 |
在开发中,典型的做法是:
- 首先使用 ROM Bootloader 通过串口将你的 自定义Bootloader 程序烧录到芯片中。
- 然后,你的 自定义Bootloader 再通过更高级的接口(如网络)去更新 应用程序(App)。
- 如果 自定义Bootloader 本身需要升级,可能需要设计一个特殊的机制(例如由App来更新Bootloader),或者 fallback 到 ROM Bootloader 来进行恢复。