|
| 1 | +# STM32F407 OTA Bootloader |
| 2 | + |
| 3 | +用于 STM32F407 的双分区 Bootloader。 |
| 4 | +- 支持通过 Ymodem 协议进行 OTA 升级 |
| 5 | +- 采用独立 Boot Flag 机制记录升级状态和启动状态 |
| 6 | + |
| 7 | +## Flash Layout |
| 8 | + |
| 9 | +- Bootloader: `0x08000000 - 0x08003FFF` (16KB) |
| 10 | +- Boot Flag: `0x08004000 - 0x08007FFF` (16KB) |
| 11 | +- APP1: `0x08008000 - 0x0801FFFF` (96KB, 运行区) |
| 12 | +- APP2: `0x08020000 - 0x0803FFFF` (128KB, OTA缓存区) |
| 13 | + |
| 14 | +分区定义见 [Bootloader/bootloader.h](Bootloader/bootloader.h)。 |
| 15 | + |
| 16 | +## Boot Flow |
| 17 | + |
| 18 | +上电后 Bootloader 按以下顺序决定是否进入升级模式: |
| 19 | + |
| 20 | +1. 检查软件请求标志 |
| 21 | +如果 APP 之前设置了 `enter_bootloader`,则直接进入 Bootloader 菜单。 |
| 22 | + |
| 23 | +2. 检查串口命令 |
| 24 | +上电后 3 秒内,如果 `USART1` 收到字符 `B`,则进入 Bootloader 菜单。 |
| 25 | + |
| 26 | +3. 正常启动 APP |
| 27 | +若未请求进入 Bootloader,则执行正常启动流程: |
| 28 | +- 检查 `need_copy` |
| 29 | +- 必要时把 APP2 复制到 APP1 |
| 30 | +- 检查启动次数 |
| 31 | +- 跳转到 APP1 |
| 32 | + |
| 33 | +启动入口见 [Bootloader/main.c](Bootloader/main.c)。 |
| 34 | + |
| 35 | +## UART Usage |
| 36 | + |
| 37 | +- `USART1`: 调试输出 / Bootloader 命令口 |
| 38 | +- `USART2`: APP 通信 / Ymodem OTA 数据口 |
| 39 | + |
| 40 | +## OTA Update Flow |
| 41 | + |
| 42 | +OTA 下载始终写入 APP2,不直接覆盖 APP1。 |
| 43 | + |
| 44 | +流程如下: |
| 45 | + |
| 46 | +1. APP 收到 OTA 触发命令 |
| 47 | +2. APP 设置 `enter_bootloader` 并软件复位 |
| 48 | +3. Bootloader 启动后直接进入菜单 |
| 49 | +4. 主机发送命令 `2` |
| 50 | +5. 通过 Ymodem 将固件下载到 APP2 |
| 51 | +6. 下载成功后设置 `need_copy=1` |
| 52 | +7. 下次启动时 Bootloader 将 APP2 复制到 APP1 |
| 53 | +8. 跳转到新的 APP1 |
| 54 | + |
| 55 | +Ymodem 下载处理位于 [Bootloader/bootloader.c](Bootloader/bootloader.c)。 |
| 56 | + |
| 57 | +## Boot Flag |
| 58 | + |
| 59 | +Boot Flag 保存在独立扇区,用于保存启动状态和 OTA 状态,包括: |
| 60 | + |
| 61 | +- `boot_attempts` |
| 62 | +- `need_copy` |
| 63 | +- `ota_complete` |
| 64 | +- `enter_bootloader` |
| 65 | +- `app1_version` |
| 66 | +- `app2_version` |
| 67 | + |
| 68 | +相关定义见 [Bootloader/boot_flag.h](Bootloader/boot_flag.h)。 |
| 69 | +相关实现见 [Bootloader/boot_flag.c](Bootloader/boot_flag.c)。 |
| 70 | + |
| 71 | +## Notes |
| 72 | + |
| 73 | +- APP1 必须链接到 `0x08008000` |
| 74 | +- APP 的向量表必须正确重定位到 APP1 基址 |
| 75 | +- APP 启动稳定后应清除 `boot_attempts` |
| 76 | +- 调试日志只能走 `USART1`,不要混入 `USART2` 的 Ymodem 数据流 |
0 commit comments