1. STM32 A/B分区OTA升级的核心原理
STM32的A/B分区OTA升级是一种可靠的固件更新机制,它通过在Flash中维护两个完全相同的应用程序分区(A区和B区)来实现无缝升级和回滚。这种设计最大的优势在于,即使升级过程中发生断电或固件损坏,设备仍然能够从另一个完好的分区正常启动。
让我用一个生活中的比喻来解释:想象你的手机有两个系统分区,当你升级系统时,新系统会安装到闲置的分区,老系统继续正常运行。只有在新系统验证通过后,才会切换启动到新分区。如果新系统有问题,只需重新启动就能回到老系统,完全不影响使用。
在STM32中实现这个机制需要理解三个关键技术点:
内存映射机制:STM32通过内存重映射来实现不同的启动方式。以上电启动为例,虽然ARM规定必须从0x0地址开始执行,但STM32通过硬件将Flash起始地址(0x08000000)映射到0x0地址,这样上电后实际上是从Flash开始执行。
中断向量表偏移:这是A/B分区切换的关键。每个应用程序分区都有自己的中断向量表,通过设置SCB->VTOR寄存器来告诉内核当前使用哪个中断向量表。如果没有正确设置这个偏移量,程序无法正常响应中断。
跳转机制:Bootloader需要能够跳转到应用程序执行,这通过获取应用程序中断向量表中的复位中断地址来实现。具体来说,应用程序起始地址存放的是栈顶指针,偏移4字节存放的是复位中断地址。
2. 完整的A/B分区设计方案
在实际项目中,我采用了一种经过验证的双分区设计方案。这个方案不仅考虑了正常的升级流程,还包含了异常处理和状态管理,确保系统在各种情况下都能可靠运行。
Flash分区布局:
- Bootloader区(0x08000000-0x08003FFF):16KB,负责升级逻辑和应用程序引导
- 参数区(0x08004000-0x08007FFF):16KB,存储分区状态和元数据
- 应用程序A区(0x08020000-0x0805FFFF):256KB,主应用程序
- 应用程序B区(0x08060000-0x0809FFFF):256KB,备份应用程序
元数据管理设计: 我使用一个结构体来管理每个分区的状态信息,这些信息存储在Flash的参数区:
typedef enum {
PARTITION_STATE_INVALID = 0, // 无效状态
PARTITION_STATE_ACTIVE, // 当前活动分区
PARTITION_STATE_UPDATING, // 正在更新
PARTITION_STATE_UPDATED, // 更新完成待验证
PARTITION_STATE_VALID, // 验证通过
PARTITION_STATE_FAILED // 启动失败
} partition_state_t;
typedef struct {
uint32_t magic;


2789

被折叠的 条评论
为什么被折叠?



