96SEO 2026-09-08 05:27 33
在 STM32F103 系列上实现 OTA升级,看似简单却隐藏着不少技术细节和坑点。本教程从最基础的概念出发,逐步带你搭建 Bootloader、两份 App、还有串口通信协议。并通过 Qt 图形上位机完成 A→B、B→A 的升级流程。就在这个时候我在每个关键环节都标注了开发者常遇到的痛点,让你在实践中一目了然。按理说,
| 名称 | 存放位置 | 谁提供 | 本项目如何进入 | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| STM32 ROM/System Memory Bootloader | 芯片程序存储区。由 ST 出厂固化,进入方式通过 BOOT 配置;协议见 AN2606/AN3155。 | |||||||||||||||||||
| Bootloader | 使用者 Flash(0x08000000);每次复位先运行, |
|||||||||||||||||||
本项目自定义帧以 A A 55 开头,不是 ST ROM Bootloader 的 AN3155 协议。 | ||||||||||||||||||||
| UART 上位机与 CubeProgrammer 使用不同协议。 | ||||||||||||||||||||
| Application Slot A / B | 同一源码链接成 A/B 两份;Bootloader 校验向量表后跳转。 | |||||||||||||||||||
| 分区 | 起始地址 | 结束地址 | 大小 |
|---|---|---|---|
| Bootloader | 0x08000000 | 0x08007FFF | 8 KiB |
| Slot A | 0x08008000 | 0x0803FFFF | 224 KiB |
| Slot B | 0x08040000 | 0x08077FFF | 224 KiB |
| Metadata | 0x08078000 | 0x0807FFFF | 8 KiB |
Metadata 虽预留 8 KiB当前只写前面几百字节用于存储 CRC & 状态。
Flash 页大小是 1 KiB所有分区起始地址都必须页对齐,以避免擦写错误。
bash
arm-none-eabi-nm --size-sort --print-size app/app/build/Debug/app_a.elf \
--reverse -C -t dS \
| grep '^*$'
此命令可快速定位向量表是否正确放置。
c
/* offset +0×00 : initial MSP */
p = SRAM_TOP;不过,/* offset +0×04 : Reset_Handler 地址 */
p = &Reset_Handler;
Bootloader 在跳转前会做以下检查:
c _disableirq;HALDeInit;SysTick->CTRL = SysTickCTRLCLKSOURCEMsk;SysTick->LOAD = SysTickLOADRELOADMsk;SysTick->VAL = SysTickVALCURRENTMsk; 按理说,
SCB->VTOR = appaddress;_DSB;__ISB,
_setMSP;appresethandler);
再看注意,Bootloader 在跳转后不会
开启全局中断。如果忘记执行 则会导致 #define __enable_irqHAL_Delay 卡死。
由于 STM32 没有 MMU,链接器根据 决定向量表及代码位置。我们必须分别为 Slot A 与 B 建立两份二进制:
c
addexecutable addexecutable
targetlinkoptions targetlinkoptions
app_a.bin 烧到 Slot A,用 app_b.bin 烧到 Slot B。<07_ret6_oled.bin> 到 Slot B。bash
cmake --preset Debug -S bootloader && cmake --build build/Debug --target bootloader
cmake --preset Debug -S app/app && cmake --build build/Debug --target appa appb
cmake --preset Debug -S 07ret6oled && cmake --build build/Debug --target defaultTargetNameHere
text
bootloader/build/Debug:
├─ bootloader.hex │ bin │ elf
app/app/build/Debug:
├─ app_a.hex │ bin │ elf
├─ app_b.hex │ bin │ elf
| LNK | SWDIO | SWDCLK | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CMD 名称 | 值 | 请求 payload | 成功响应 payload |
|---|---|---|---|
| INFO | 01 | 无 | 固件版本 / Flash / Slots |
| ERASE | 02 | address:u32 + size:u32 | status:u8 |
| DATA | 03 | address:u32 + data | status:u8 |
| VERIFY | 04 … |
所有 u64 字段均采用小端格式。这一点非常关键,否则 PC 与 MCU 会产生 CRC mismatch 报错!
为了兼容 STM32 HAL 半字写入还有保持协议整齐性。每块最大送达512字节——若最终一块不足则填补为空白且保持偶数长度,否则主机会直接拒绝上传而非隐式补齐。这也是许多人上传奇数长度 BIN 后出现“不完整包”的根源所在!
c
typedef struct {
uint32_t magic;uint32_t state;uint32_t confirmed_slot;uint32_t pending_slot;uint32_t boot_count;uint32_t crc;uint32_t size;} __attribute__) boot_metadata_t;
Metadata 存放于 Flash 最终一页 (BOTHSLOTSEND + PAGESIZE - METADATAPAGE_SIZE)。该结构仅记录全局状态,不针对每个 slot 独立维护 EMPTY/INVALID 标记。所以任何更改都需重写整个 page,以保证原子性。
至于查看帮助,
bash
py ota.py --help
从典型上传命令来看,
bash py ota.py ..\app\app\build\Debug\app_b.bin \ --port COM5 \ --target 0x08040000 \ --confirmed 0x08008000
CLI 当前只负责升级,不提供 confirm 子命令,请使用 GUI 或自行发送 CMD_CONFIRM.
| 现象 | 可能原因 | 排查方法/解决办法) |
|---|
...
✓ 两份 App 链接独立镜像 ✓ 自定义 UART IAP 帧及 CRC ✓ 单槽边界擦写保护 ✓ PENDING/CONFIRMED 状态及跨复位计数 ✓ 主机侧向量检查 ✓ 手工 Confirm 与四次回滚实验验证
❌ 固件数字签名、公钥验证 ❌ anti‑rollback 策略与版本控制 ❌ 数据包重试/窗口/去重/断点续传 ❌ App 自动健康检测 ❌ Metadata 双副本与事务提交
建议优先实现 Metadata 双页副本++结构 CRC,接下来引入公钥签名验证,还有 IWDG+App 健康检测形成完整流程。按理说,如需网络下载,可考虑 TLS 加密通道并结合设备身份管理。实现真正使用较稳定的大规模 OTA 部署。
参考文献包括 STM32201 数据手册、RM0008 等官方文档,还有开源项目如 MCUboot/wolfBoot 对比学习。但请记住本仓库采用自定义协议和元数据模型。与这些成熟方案存在差异,需要自行适配才能迁移或合并代码。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback