127 lines
4.2 KiB
Markdown
127 lines
4.2 KiB
Markdown
# PY32F040 OTA 开发框架
|
||
|
||
基于 PY32F040 的 OTA 双工程开发框架。**Bootloader 与 App 是两个独立的 Keil 工程**,
|
||
共用顶层 `Shared/`(OTA 契约)与 `Drivers/`(厂商 SDK)。
|
||
|
||
支持三种可配置 OTA 模式(`Shared/ota_config.h`):
|
||
|
||
| 模式 | 说明 |
|
||
|------|------|
|
||
| 单备份 | BAK 下载 → 校验 → 拷贝覆盖主区,最省 Flash |
|
||
| 双备份 + RAM | A/B 交换,新固件崩溃可自动回滚 |
|
||
| 双备份 + 暂存区 | A/B 交换 + Flash scratch,升级最快、掉电恢复最稳 |
|
||
|
||
协议对接 jb_protocol(0x30/0x32/0x34),用户层在 `Protocol/jb_product.c` 对接。
|
||
|
||
详细设计见 [`Doc/OTA_AB_双备份升级设计.md`](Doc/OTA_AB_双备份升级设计.md)。
|
||
|
||
---
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
PY32F040开发框架/
|
||
├── App/ APP 工程(链接 0x08003000)
|
||
│ ├── Src/ main.c / application.c / system_py32f040.c
|
||
│ ├── Core/ ota_ab / iwdg / app_boot / jb_uart 等
|
||
│ ├── Protocol/ jb_protocol + jb_product(协议与用户层)
|
||
│ ├── Utils/
|
||
│ └── MDK-ARM/ project.uvprojx
|
||
├── Bootloader/ Bootloader 工程(链接 0x08000000)
|
||
│ ├── Src/ boot_main.c
|
||
│ ├── Code/ flash.h(实现见 Shared/flash.c)
|
||
│ └── MDK-ARM/ Bootloader.uvprojx
|
||
├── Drivers/ 厂商 HAL/CMSIS(只读,勿改)
|
||
├── Shared/ OTA 契约【单一真源】
|
||
│ ├── ota_config.h 三模式配置入口
|
||
│ ├── flash.c 状态区读写
|
||
│ ├── crc32.c/h 固件 CRC32
|
||
│ ├── iwdg_config.h 看门狗超时参数
|
||
│ └── log.h
|
||
├── tools/ 构建与打包脚本
|
||
├── Output/ 构建产物(git 忽略)
|
||
└── Doc/ 设计文档
|
||
```
|
||
|
||
两工程通过 `..\..\Shared`、`..\..\Drivers` 引用共享层,**彼此零依赖**。
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 环境要求
|
||
|
||
- Keil MDK(含 PY32F040 器件包)
|
||
- Python 3(用于 `tools/` 脚本,可选)
|
||
|
||
### 1) 一键构建
|
||
|
||
```bat
|
||
build.bat
|
||
```
|
||
或
|
||
```bat
|
||
python tools\build_all.py
|
||
```
|
||
|
||
产物输出到 `Output/`:
|
||
|
||
- `bootloader.hex|bin` — 0x08000000
|
||
- `app.hex|bin` — 0x08003000
|
||
- 末尾打印 `app.bin` 的 **fwCrc32**(0x30 请求需携带)
|
||
|
||
### 2) Keil 单独打开
|
||
|
||
| 工程 | 工程文件 |
|
||
|------|----------|
|
||
| Bootloader | `Bootloader/MDK-ARM/Bootloader.uvprojx` |
|
||
| App | `App/MDK-ARM/project.uvprojx` |
|
||
|
||
### 3) 修改 OTA 模式
|
||
|
||
只改 `Shared/ota_config.h` 中的 `OTA_BACKUP_MODE` / `OTA_SWAP_STRATEGY`,
|
||
然后重新构建两工程(无需手动同步两份代码)。
|
||
|
||
### 4) 打包发给用户
|
||
|
||
```bat
|
||
tools\pack_bootloader.bat → Output\bootloader_package.zip
|
||
tools\pack_app.bat → Output\app_package.zip
|
||
```
|
||
|
||
zip 内布局:`Bootloader|App/` + `Drivers/` + `Shared/` 平级。
|
||
对方解压后直接用 Keil 打开 `.uvprojx` 即可编译(已剔除 `.o/.d` 等中间产物)。
|
||
|
||
> 需解压整个 zip,保持相对目录结构,不要只拷贝子文件夹。
|
||
|
||
### 5) 出厂烧录
|
||
|
||
```bat
|
||
python tools\merge_hex.py → Output\merged_single.hex
|
||
```
|
||
|
||
合并 Bootloader + App 为单一 hex。纯 OTA 远程升级只需 `app.bin`。
|
||
|
||
---
|
||
|
||
## 关键注意点
|
||
|
||
- **Shared/ 是唯一真源**:改 OTA 布局/状态机只改此处;`flash.h` 两工程各有一份(适配各自头文件路径)。
|
||
- **Drivers/ 只读**:厂商 SDK,两工程共用,勿修改。
|
||
- **链接地址**:由 Keil Target → ROM1(`OCR_RVCT4`)决定,须与 `Shared/ota_config.h` 的 `OTA_RUN_ADDR_BASE`(0x08003000)一致。
|
||
- **`.bat` 脚本保持纯 ASCII**:cmd 按 GBK 解析,含中文可能乱码。
|
||
- **IWDG**:Bootloader 跳转前启动看门狗;App 在 `app_boot.c` 中接管并喂狗,时钟配置不可关 LSI。
|
||
|
||
---
|
||
|
||
## 开发入口(常用文件)
|
||
|
||
| 目的 | 文件 |
|
||
|------|------|
|
||
| 改 OTA 模式/布局 | `Shared/ota_config.h` |
|
||
| OTA 下载逻辑 | `App/Core/ota_ab.c` |
|
||
| 协议 OTA 回调 | `App/Protocol/jb_product.c` |
|
||
| Bootloader 状态机 | `Bootloader/Src/boot_main.c` |
|
||
| App 启动流程 | `App/Core/app_boot.c` |
|
||
| 应用主循环 | `App/Src/application.c` |
|