在 STM32 系列 MCU 的固件开发与升级过程中,I2C Bootloader 是常用的底层工具,其提供的 “GetCheckSum” 命令可快速校验 Flash 指定区域的固件完整性,避免因固件损坏导致的设备运行异常。然而,不少开发者在使用该命令时,常会遇到 “命令计算结果与自行计算结果不一致” 的问题 —— 核心原因是对命令的 CRC 算法配置、数据存储模式等细节理解不足。本文基于 ST 官方技术文档 LAT1524(Rev 1.0),全面解析 GetCheckSum 命令的使用逻辑、关键注意事项及实操验证方法,帮助开发者高效解决校验难题。
资料获取:开发经验 | LAT1524 I2C bootloader的GetCheckSum命令的使用介绍
1. 命令核心原理:基于 CRC IP 的 Flash 校验逻辑
GetCheckSum 命令的核心功能是通过 STM32 内置的 CRC 外设(CRC IP),计算 Flash 中指定地址范围的数据校验和。其本质是将目标区域的 Flash 数据按特定规则传入 CRC 外设,由硬件快速完成计算,最终返回标准化的校验结果。该命令的优势在于无需占用 CPU 大量资源,校验效率远高于软件模拟 CRC 计算,且结果由硬件保证一致性。
关键前提:命令的 CRC 计算依赖固定的硬件配置,若开发者自行计算时未遵循相同配置,必然导致结果偏差 —— 这是多数 “结果不一致” 问题的根源。
2. 必懂关键配置:CRC 算法参数与数据存储规则
要确保 GetCheckSum 命令与自行计算结果一致,首先需严格遵循其默认的 CRC 算法配置及数据处理规则,这是校验一致的核心前提。
2.1 CRC 算法默认配置(以 STM32L452 为例)
GetCheckSum 命令使用 CRC 外设的默认配置,不可自定义修改,具体参数如下:
| 配置项 | 取值 / 规则 |
|---|---|
| 数据宽度 | 32-bit(以 32 位字为基本单位) |
| 多项式(Poly) | 0x04C11DB7(标准 CRC-32 多项式) |
| 初始值(Init) | 0xFFFFFFFF |
| 输入反转(RefIn) | False(数据输入不反转) |
| 输出反转(RefOut) | False(计算结果不反转) |
| 异或输出(XorOut) | 0x0(结果不做异或处理) |
2.2 数据存储模式:小端模式的影响
STM32L4 系列的 Flash 采用小端模式存储数据(多数 STM32 系列均遵循此规则),即 32 位数据的低位字节存储在低地址,高位字节存储在高地址。例如:
- 32 位数据
0x01020304在 Flash 中的存储形式为:
地址 0x08000000 0x08000001 0x08000002 0x08000003 存储数据 0x04(低位) 0x03 0x02 0x01(高位)
若自行计算 CRC 时,未按小端模式将字节组合为 32 位字,直接按地址顺序逐字节计算,会导致结果与 GetCheckSum 命令完全不一致。
3. 实操关键注意事项:避免踩坑的 8 个核心要点
使用 GetCheckSum 命令时,需严格遵守以下规则,否则会导致命令执行失败或结果异常:
3.1 地址传输规则
- 主机需发送 4 字节地址(MSB 在前、LSB 在后),后续紧跟 1 字节校验和(4 个地址字节的异或结果);
- 目标地址必须是 Flash 的有效地址,且需 4 字节对齐(如 0x0807F800 符合要求,0x0807F801 不符合)。
3.2 数据大小要求
- 待计算的 Flash 数据大小(memory size)不可为 0;
- 大小必须是 4 的倍数(因 CRC 计算以 32 位字为单位),例如 0x50(80 字节)、0x10(16 字节)均符合要求。
3.3 命令执行时序
- 地址和大小验证有效后,主机需等待 CRC 计算完成,不可中途中断;
- 计算过程中,I2C Bootloader 会返回忙状态(0x76),主机需轮询等待,直至收到计算结果。
3.4 结果接收格式
- 命令执行成功后,Bootloader 会返回 4 字节 CRC 结果(MSB 优先),后续紧跟 1 字节结果校验和,主机需按此格式解析数据。
3.5 CRC 计算流程(命令内部逻辑)
GetCheckSum 命令执行时,会自动完成以下步骤,无需用户干预:
- 启用 CRC 外设;
- 复位 CRC 计算单元(设置 CR 寄存器的 RESET 位);
- 按 32 位字为单位,从 Flash 读取数据并传入 CRC 外设;
- 读取 CRC 外设的最终计算结果;
- 关闭 CRC 外设。
4. 实操验证:确保结果一致的测试流程
为验证 GetCheckSum 命令的准确性及自行计算的一致性,以 STM32L452 为例,按以下步骤开展测试:
4.1 测试准备
- 目标 Flash 区域:地址
0x0807F800~0x0807F84F(大小 0x50 字节,即 16 个 32 位字); - 填充数据:按小端模式存储,部分数据示例为
0x11223344、0x55667788等(具体见文档 Flash 内容配置)。
4.2 使用 GetCheckSum 命令计算
- 主机发送地址
0x0807F800(4 字节 MSB 在前)+ 地址校验和; - 发送数据大小
0x50(4 的倍数); - 等待 Bootloader 返回结果,最终得到 CRC 值为
0xC0B0C6B9。
4.3 基于 CRC 外设自行计算(验证一致性)
按 GetCheckSum 的 CRC 配置,使用 STM32 HAL 库实现计算:
- 执行结果:自行计算的 CRC 值为
0xC0B0C6B9,与 GetCheckSum 命令结果完全一致,验证了配置的正确性。
5. 常见问题排查:快速解决结果不一致
若遇到命令与自行计算结果不一致,优先排查以下 3 点:
- CRC 算法配置不匹配:检查自行计算时的多项式、初始值、数据宽度等是否与本文第二部分的默认配置一致;
- 小端模式处理错误:确认是否按小端模式将 Flash 字节数据组合为 32 位字后再计算;
- 地址 / 大小不符合要求:目标地址是否 4 字节对齐,数据大小是否为 4 的倍数。
GetCheckSum 命令是 STM32 I2C Bootloader 中高效的固件校验工具,其核心难点在于 “严格遵循 CRC 算法配置” 和 “小端模式数据处理”。开发者只需把握本文所述的地址规则、大小要求、CRC 参数及数据组合方式,即可彻底解决 “结果不一致” 问题。该命令适用于固件升级前的完整性校验、设备出厂前的固件验证等场景,能有效降低因固件损坏导致的设备故障风险。
本文内容基于 ST 官方技术文档 LAT1524(Rev 1.0)整理,若与 ST 官网最新资料存在差异,以官网发布内容为准。
145