前置知识
flash
flash是如何工作的
- Flash 单元以电荷存储表示 0/1,编程只能把位从 1 写为 0,擦除把整页/扇区统一恢复为 1。
- 擦除粒度通常为 Page/Sector(几 KB 到几十 KB),编程粒度为 半字/字/双字(依芯片而异,STM32F1/F4 常见为半字/字,STM32G4/H7 常见为双字)。
- 由于擦写次数有限(10k~100k 次/页),需避免频繁在同一页更新小量数据;对“升级信息/设备信息”等高频写区域应做磨损均衡或冗余备份。
- 一些系列支持 Dual-Bank,可在运行一侧时擦写另一侧,利于在线升级;部分系列带 ECC,写入时需按对齐和双字写入以避免 ECC 错误。
常见的flash
- 片内 Flash(NOR):启动代码存储,随机读取快、可靠;容量相对有限。
- 片外 SPI NOR Flash:容量大、成本低、顺序读写快;擦写需页对齐,写前要擦除;通过 QSPI/OSPI 可做 XIP(部分系列)。
- 片外 NAND:大容量,坏块管理复杂,MCU 端较少用于固件存储;如果使用,建议在外部处理器或文件系统层处理。
flash的读写操作
- 典型流程(STM32 HAL):
HAL_FLASH_Unlock()
;2) 擦除HAL_FLASHEx_Erase(...)
;3) 按对齐写入HAL_FLASH_Program(...)
;4)HAL_FLASH_Lock()
。
- 写前确保:关中断临界区(至少屏蔽影响时序的中断)、设置合适的 Flash Latency、关闭数据/指令 Cache(视系列而定)。
- 断电保护:写入分块+页校验+幂等策略;Bootloader 应确保任意掉电后都能从“最后一次一致状态”恢复。
什么是ota,ota的作用是什么
OTA(Over-The-Air/Over-The-Any-link)是设备在不拆机、不中断服务或最小中断的前提下,通过通信链路远程更新固件的能力。作用:
- 降低维护成本:远程修复缺陷、发布新功能。
- 提升安全:及时修补漏洞、轮换证书/密钥。
- 提升可靠性:引入回滚与试运行机制,降低升级失败风险。
在单片机端有哪些ota方案,优缺点是什么
- 单区原地升级(In-place):
- 思路:Bootloader 在同一分区内边擦边写覆盖旧固件。
- 优点:占用 Flash 空间最小。
- 缺点:掉电风险高、实现复杂,需要小心搬移和断点续传;通常需额外“备份页”或外设辅助。
- 片内双区(A/B):
- 思路:两套固件分区,当前运行 A,下载到 B,切换启动标志后从 B 启动,失败可回退到 A。
- 优点:最稳妥,掉电可恢复,支持试运行与确认。
- 缺点:占用两倍固件空间;对小容量芯片可能不现实。
- 片外缓存升级:
- 思路:固件先存片外 Flash,验证通过后拷贝/交换到片内运行区。
- 优点:适配小容量片内 Flash;可存多版本或差分包。
- 缺点:依赖外设稳定性,增加 BOM 和驱动复杂度。
- 差分升级(Patch):
- 思路:只下发旧版到新版的差分数据,在设备端重建新固件。
- 优点:大幅减少下载体积。
- 缺点:设备端计算/IO 复杂度高;需强校验和回退;对压缩/链接方式敏感,易产生大差分。
单片机是如何启动的,bootloader又是什么
- 复位后 CPU 从固定地址取栈顶与复位向量(向量表),跳入启动代码;用户可通过
SCB->VTOR
变更向量表基址。 - Bootloader 是最先运行的用户程序,负责:
- 验证与选择要启动的固件镜像
- 处理升级数据的接收与写入
- 管理升级状态(试运行/确认/回退)与断点续传
- 安全校验(签名验证、版本反回滚)
- 关键:Bootloader 自身要尽量小且稳定,放在写保护区域,最好配合读保护/代码保护(RDP/WRP/PCROP)。
System Bootloader
- STM32 内置的系统 Bootloader(ROM)支持通过 UART/I2C/SPI/USB DFU 等协议下载固件,不占用用户 Flash。
- 适用场景:产线烧录、救援刷机、无用户 Bootloader 的简化升级路径。
- 局限:协议固定、可定制性弱、难以做安全验签/回滚等策略,一般作为兜底或引导方式。
加密与签名
-
签名用于完整性和身份认证,推荐“哈