
简介 Flash 自检是功能安全应用 ClassB 或者 SIL 必不可少的测试项目,自检包含启动时自检和运行时自检,通常情况下,启动时自检要求对 Flash 全片 ROM 进行自检,在 Flash 全片自检过程中,需要知道 ROM 实际占用的 Flash 大小,如果配置的参数与 ROM 实际大小不一致,那么自检就会失败。 客户询问实际开发过程中是否有较好的方法获取实际的 ROM 大小进行 Flash 全片自检配置,针对客户的疑问,本文介绍功能安全应用中 Flash 自检的原理以及在 KEIL 编译环境下如何使用链接器自定义变量计算实际的 ROM 大小。
CRC 预计算,针对编译生成的可执行文件生成 CRC 并插入 CRC 到可执行文件中,其生成 CRC 的过程要符合如下要求。 图1. CRC 预计算 (1)Flash 空间划分为CRC 区域和程序区,其中 CRC 区域的起始地址与 Flash 大小相关,其计算的公式如下:CRC区域起始地址=Flash结束地址-4(Flash 大小/1024),如果Flash大小为 2M 字节,起始地址为0x08000000,那么CRC区域的起始地址为0x08200000-4(0x200000/1024)=0x81E0000。 (2)程序区从Flash起始地址开始,分为连续的Section,每个Section的大小为 1024 字节,实际程序能够使用的 Flash 空间最大为 Flash 大小-CRC 区域大小,也就是 Flash Size-4*(Flash Size/1024),对于 2M 空间的 Flash,其程序空间最大为 0x1E0000。 (3)编译生成的可执行文件ROM包含了Code段,RO段以及 RW 段,使用STM32_Programmer_CLI 工具预计算 CRC 的过程,只对实际产生的 ROM 段进行计算,ROM 段必须保证 4 字节对齐,ROM 按照 1024 字节为单位划分为多个Section,通常最后一个 Section 不足 1024 字节,但是也记作一个Section。假设可执行文件的ROM大小为 81928,那么其一共划分为 81 个 Section,其中最后一个Section占用 8 字节空间,STM32_Programmer_CLI 工具针对这个 ROM 生成 81 个CRC 值,其中前 80 个 CRC 值为 1024 字节的校验码,最后一个 CRC 值为 8 字节的校验码。这 80 个 CRC 值按照顺序存放在 CRC 区域空间。 (4)烧录程序的过程中,可执行程序二进制代码和工具生成从 CRC 分别烧录到 Flash 的程序空间和 CRC 空间。 CRC 比较,程序运行阶段,用户程序调用功能安全库提供的自检 API 进行检测,用户需要正确配置 ROM 检测的范围,功能安全库提供了标准的数据结构供用户配置自检范围,结构体如下图所示。 图2. Flash 自检配置 用户程序通过上述两个数据结构配置 Flash 自检的区域,待测试的 Flash 区域通过 STL_MemSubSet_t 结构体指定,用户可以定义一个或多个 MemSubSet,对于 Flash 全片测试,只需要定义一个 MemSubSet,其中 StartAddr 为 ROM 起始地址, EndAddr 为 ROM 的结束地址,正确的 ROM 结束地址是确保自检通过的必备条件。
实际上,在代码编译过程中,KEIL 编译器已经定义了一些变量,用户程序可以直接引用,这些变量包含了可执行文件的各个段的长度信息,如果用户代码需要计算 ROM 大小,直接使用这些变量即可。从 KEIL 的帮助文档中,可以找到这些变量的定义以及如何在用户代码中使用这些变量。 图3. Linker 自定义符合变量 上图定义的变量可以直接在用户代码中引用,其中 region-name 需要替换为 Linker 脚本 Scatter 文件中定义的段名,我们以下图 Scatter 文件为例,使用下面代码即可计算出实际ROM 大小。
图4. Scatter 文件 图5. 计算 ROM 大小
原文链接:https://blog.csdn.net/2501_92678806/article/details/149630721 |
经验分享 | 利用TIMER测量信号周期及占空比的精度话题
经验分享 | 一个 STM32U5 SBSFU SecureFault 问题定位与分析
经验分享 | 高精度定时器如何实现 PWM 零满占空比的连续切换
经验分享 | STM32G474 勘误手册中 SRAM Write Error 详解
经验分享 | 定时器触发ADC时可能遇到的几种情形
实战经验 | 1小时在STM32MPU上运行YOLOv8——训练篇
经验分享 | STM32CubeMX 生成时钟获取函数的分析
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32片内信号的ADC应用演示