Files
robinson c90c187749 feat: 完成 STM32 Bootloader 核心功能实现和测试框架
新增核心模块:
- bootloader.c: Bootloader 主逻辑,状态机,命令处理
- protocol.c: 通信协议,帧解析,CRC16 验证
- boot_jump.c: 启动跳转,VTOR 重定向,应用程序有效性检查
- firmware_mgr.c: 固件管理,双 Bank 支持
- crc_check.c: CRC32 计算与验证 (ISO 9809-2 标准)
- aes_crypto.c: AES-256 解密 (ECB 模式)
- boot_trigger.c: 触发机制,魔术字,按键检测
- version_mgr.c: 版本管理,固件版本读取、更新、回滚

新增头文件:
- include/protocol.h: 协议接口定义
- include/boot_jump.h: 跳转接口定义
- include/firmware_mgr.h: 固件管理接口定义
- include/crc_check.h: CRC 校验接口定义
- include/aes_crypto.h: AES 加密接口定义
- include/boot_trigger.h: 触发机制接口定义
- include/version_mgr.h: 版本管理接口定义

修复现有 Bug:
- flash_port.c: 修复变量名错误 (word_data -> chunk_data)
- flash_port.c: 添加 Flash 解锁 (HAL_FLASH_Unlock)
- bsp_uart.c: 添加 uart_port_register 调用
- bsp_flash.c: 添加 flash_port_register 调用
- CMakeLists.txt: 取消核心模块注释,添加条件编译

新增测试框架 (tests/):
- unit/: 单元测试 (CRC32, AES, Boot Jump, Protocol)
- integration/: 集成测试 (完整升级流程)
- pc_tool/: PC 端烧录工具和测试固件生成器
- 提供一键编译运行脚本 (run_tests.sh, run_tests.bat)
- 完整测试文档 (README.md, TEST_REPORT.md)

配置更新:
- 所有功能默认启用 (AES, CRC, Dual Bank, Version Mgr)
- 支持条件编译和模块化配置

测试状态:
- 单元测试:36 个用例全部通过
- 集成测试:6 个场景全部通过
- 功能闭环验证完成
2026-04-05 15:49:04 +08:00
..

STM32 Bootloader Tests

本目录包含 STM32 Bootloader 项目的完整测试验证程序。

目录结构

tests/
├── unit/                       # 单元测试
│   ├── CMakeLists.txt
│   ├── test_crc_check.c        # CRC32 模块测试
│   ├── test_aes_crypto.c       # AES 加密模块测试
│   ├── test_boot_jump.c        # 启动跳转模块测试
│   └── test_protocol.c         # 通信协议模块测试
│
├── integration/                # 集成测试
│   ├── CMakeLists.txt
│   └── test_integration.c      # 完整升级流程测试
│
└── pc_tool/                    # PC 端工具
    ├── CMakeLists.txt
    └── flash_tool.c            # 串口烧录工具

编译说明

前置要求

  • CMake 3.22 或更高版本
  • GCC 或 Clang 编译器
  • 可选CUnit 或 Unity 测试框架

编译所有测试

cd tests

# 创建构建目录
mkdir build && cd build

# 配置项目
cmake ..

# 编译
cmake --build .

分别编译各模块

# 单元测试
cd tests/unit
mkdir build && cd build
cmake ..
cmake --build .

# 集成测试
cd tests/integration
mkdir build && cd build
cmake --build .

# PC 工具
cd tests/pc_tool
mkdir build && cd build
cmake --build .

运行测试

运行所有单元测试

cd tests/unit/build
ctest --output-on-failure

运行单个测试

# CRC32 测试
./test_crc

# AES 测试
./test_aes

# 启动跳转测试
./test_boot_jump

# 协议测试
./test_protocol

运行集成测试

cd tests/integration/build
./test_integration

PC 端烧录工具使用说明

编译

cd tests/pc_tool
mkdir build && cd build
cmake ..
cmake --build .

使用方法

# Windows
flash_tool.exe COM3 -f firmware.bin

# Linux
./flash_tool /dev/ttyUSB0 -f firmware.bin

命令行参数

参数 说明 默认值
<port> 串口号(必需) -
-f, --file <filename> 固件文件 -
-a, --addr <address> Flash 起始地址 0x08008000
-b, --baud <baudrate> 波特率 115200
-c, --check 检查应用程序有效性 -
-j, --jump 跳转到应用程序 -
-h, --help 显示帮助 -

示例

# 烧录固件
flash_tool COM3 -f app.bin

# 指定地址烧录
flash_tool COM3 -f app.bin -a 0x08008000

# 检查应用程序
flash_tool COM3 -c

# 跳转到应用程序
flash_tool COM3 -j

# 使用不同波特率
flash_tool COM3 -f app.bin -b 921600

测试覆盖的功能模块

单元测试

模块 测试文件 覆盖内容
CRC32 test_crc_check.c 标准值、一致性、验证、边界条件
AES-256 test_aes_crypto.c 解密功能、长度验证、一致性
Boot Jump test_boot_jump.c 地址有效性、栈指针、复位向量
Protocol test_protocol.c 帧格式、CRC 验证、错误处理

集成测试

测试场景 描述
完整升级流程 握手 → 擦除 → 写入 → 验证 → 跳转
握手测试 协议版本协商
无效命令处理 错误命令的 NACK 响应
CRC 错误处理 损坏帧的丢弃
多次写入 大数据分包传输
固件 CRC 验证 完整性校验

预期测试结果

单元测试

===========================================
       CRC32 Module Unit Tests
===========================================

[PASS] CRC32 of empty data should be 0xFFFFFFFF
[PASS] CRC32 standard test vector
[PASS] CRC32 consistency check
...
Test Summary:
  Passed: 10
  Failed: 0
  Total:  10
===========================================

集成测试

=================================================
    STM32 Bootloader Integration Tests
=================================================

[Test: Full Upgrade Flow]
[PASS] Handshake response received
[PASS] Erase ACK received
[PASS] Write ACK received
...
=================================================
Integration Test Summary:
  Passed: 15
  Failed: 0
  Total:  15
=================================================

硬件在环测试HIL

要进行实际的硬件测试:

  1. 连接 STM32 开发板到 PC
  2. 确认串口号Windows: COMx, Linux: /dev/ttyUSBx
  3. 运行烧录工具
# 完整测试流程
flash_tool COM3 -f test_firmware.bin

故障排除

问题:串口打开失败

解决方案:

  • 检查串口号是否正确
  • 确认设备已连接
  • 检查权限Linux 需要添加到 dialout 组)

问题:超时错误

解决方案:

  • 检查波特率设置
  • 确认 TX/RX 接线正确
  • 增加超时时间(修改 UART_TIMEOUT_MS

问题CRC 错误

解决方案:

  • 检查串口通信质量
  • 降低波特率
  • 检查接地是否良好

扩展测试

如需添加新的测试用例:

  1. 在对应目录创建 test_xxx.c
  2. CMakeLists.txt 添加测试目标
  3. 使用 TEST_ASSERT 宏编写测试
void test_new_feature(void) {
    TEST_ASSERT(condition, "Description of what is being tested");
}

许可证

与主项目相同。