页面加载中,请稍候
来源:strongerHuang发布时间:2023-05-194432浏览
询问 AI
素材来源| 网络
编排 | strongerHuang
这里给大家推荐一个嵌入式相关招聘信息的平台:
Flash自检的流程
Flash的自检一般分为启动时自检和程序运行时自检两个阶段。不管是哪种自检,其思路都是:在程序编译完成后,计算整个程序的CRC值,然后将这个CRC值添加到可执行文件末尾,再将带有CRC校验值的可执行文件烧录到MCU中。程序启动后,由程序中的自检代码重新根据当前Flash内容(不包括预存的CRC校验值)计算一次CRC值,再与之前预先计算并烧录到Flash中的CRC校验值进行比较,如果一致就通过检测。如何添加CRC值
该语句指定将CRC的值放在FLASH的末尾位置,是整个FLASH空间的末尾,不是应用程序的代码末尾。这样,CRC值的位置就是固定的。不会随代码大小而变化。在自检代码中,可以通过__checksum读取Flash中保存的CRC校验值来与重新计算的CRC值进行比较。
IAR的checksum页面分为两个部分。第一部分,也就是红线圈出的部分。定义了FLASH中需要计算CRC的范围和空闲字节填充值。这里注意要留出flash末尾存储CRC值的位置。剩下的部分,就是对checksum计算参数的设定部分。Checksum size:选择checksum的大小(字节数)Alignment:指定checksum的对齐方式。一般,处理器不支持非对齐访问时有用,不填的话默认1字节对齐。Algorithm:选择checksum的算法Complement:是否需要进行补码计算。选择“As is”就是不进行补码计算。Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。Reverse byte order within word:对于输入数据,在一个字内反转各个字节的顺序。Initial value:checksum计算的初始化值Checksum unit size:选择进行迭代的单元大小,按8-bit,16-bit还是32-bit进行迭代。3. STM32CRC外设的配置与上图IARchecksum的配置对应,STM32 CRC外设可以按以下配置:POLY= 0x4C11DB7(CRC32)Initial_Crc = 0Xffffffff输入/输出数据不反转输入数据:根据实际Flash范围设定,留出CRC校验值的位置
2、基于Keil环境KEIL没有提供直接生成CRC值的功能,所以需要借助外部的工具计算CRC值,然后添加到可执行文件的末尾。在X-CUBE-CLASSB软件中提供了bat文件,它会利用外部工具Srecord来生成整个Flash的CRC校验码并放在文件末尾。这个工具同样也可以和标准外设库的ClassB库一起用。下面我们就来看看如何在KEIL工程中利用Srecord工具来添加CRC值。
这两个文件中的内容也需要根据新工程路径进行修改:

(可点击图片放大查看)在分散加载文件中将CHECKSUM指定在代码的末尾。和IAR不同的是,通过在分散加载文件中+last指定checksum的位置,它不是将其固定放在整个flash地址的末尾,而是放在实际代码的末尾。
(可点击图片放大查看)



(可点击图片放大查看)或者,将crc_gen_keil.bat文件,里面的BYTE_SWAP改为0, 就可以直接调用HAL_CRC_Calculate函数进行计算了。总结


新闻来源:strongerHuang,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-07-02

2026-07-08
2026-06-24