5.8:动态固件校验信息
1. 介绍

1.1:工作流程
- 在固件中集成信息块生成代码,将校验数据写入到SRAM 中。
- 利用PowerWriter 烧录器烧录目标固件到芯片。
- PowerWriter 自动搜索读取SRAM 中的由MCU 固件自主生成和验证的固件块信息。
1.2:应用场景
- 校验芯片数据时,不通过读取数据或者校验功能,去校验芯片烧录的数据是否完整。
- 简化数据校验流程,无需读取全部Flash 数据,只需读取校验块信息。
- 由MCU 自主运算生成动态的校验信息,而非静态校验,当Flash 固件被异常修改时,快速定位。
- 其他未列举的其他的场景。
1.3:限制
- 需要确保目标芯片 SRAM 可读,部分芯片在 RDP1 开启的情况下可以读取SRAM,但并非全部。
- 工程中需要集成 信息块生成代码, 并使用PowerWriter 烧录目标固件到芯片。
2 代码集成
2.1 示例源码
powerwriter_auto_flash_region_hash_utils.zip,代码中最关键的结构定义,请仔细查看注释说明:
/* PowerWriter 将通过此标记搜索数据 */
#define powerwriter_flash_magic "powerwriter_flash_region_chunks"
/* 固件块信息数量,默认为1,可以改为其他值 */
#define powerwriter_region_count (1)
/* 单区段固件的标准armcc 编译器导出符号 */
extern const uint32_t Load$$LR$$LR_IROM1$$Base;
extern const uint32_t Load$$LR$$LR_IROM1$$Length;
extern const uint32_t Load$$LR$$LR_IROM1$$Limit;
/* flash section info item struct */
#pragma pack(push, 1)
typedef struct flash_section_info_item_t {
uint32_t start; /* 固件起始地址 */
uint32_t end; /* 固件结束地址 */
uint32_t size; /* 固件大小 */
uint32_t crc32; /* 固件crc32 */
uint32_t checksum;/* 固件checksum */
} flash_section_info_item_t;
/* flash section info struct */
typedef struct flash_section_info_t {
char m_flash_hash_magic[32]; /* powerwriter_flash_magic */
uint8_t m_flash_hash_count; /* 固件中块信息的数量 */
flash_section_info_item_t m_flash_hash_info[powerwriter_region_count]; /* 信息块存储 */
} flash_section_info_t;
#pragma pack(pop)
提示
当前只提供了MDK 单区段固件(一个hex 文件中只包含一个分段)的自动集成源码,多分段固件项目或者 GCC、IAR 编译器实现流程类似,请根据上述结构和示例工程填充校验数据结构。
2.2 示例工程以及步骤
powerwriter_auto_flash_region_hash_mdk.zip,快速集成步骤:
- 添加 powerwriter_auto_hash.c 和 powerwriter_auto_hash.h 到目标工程中。
- 在main 函数开头的位置,添加 fw_section_info_initial 信息块生成以及填充函数。
#include "powerwriter_auto_hash.h"
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
fw_section_info_initial();
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
警告
fw_section_info_initial 函数要尽可能靠前,powerwriter 读取信息块前,将复位目标芯片并让目标芯片运行,以便让芯片可以尽快计算出结果存储到内存中便于PowerWriter 进行搜索。
3:实际操作演示

