跳到主要内容
版本:Next

5.8:动态固件校验信息

1. 介绍

image-20260411122805696

1.1:工作流程

  1. 在固件中集成信息块生成代码,将校验数据写入到SRAM 中。
  2. 利用PowerWriter 烧录器烧录目标固件到芯片。
  3. 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:实际操作演示

1

image-20260411120911044