你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】如何在 IAR 中配置 CRC 参数

[复制链接]
STMCU小助手 发布时间:2022-2-27 16:29
前言
STM32 全系列产品都具有 CRC 外设,对 CRC 的计算提供硬件支持,为应用程序节省了代码空间。CRC 校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在 IEC60335 中,也接受通过 CRC 校验对 FLASH 的完整性进行检查。在对 FLASH 完整性检查的应用中,需要事先计算出整个 FLASH 的 CRC 校验值(不包括最后保存 CRC 值的字节),放在 FLASH 的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个 FLASH 的 CRC 校验值,然后与保存在 FLASH 末尾的 CRC 值进行比较。
EWARM 从 v5.5 版本之后开始支持 STM32 芯片的 CRC 计算。前面所说的计算整个 FLASH 的 CRC 校验值并保存在 FLASH末尾的过程,可以在 IAR 中完成。通过配置 EWARM 的 CRC 计算参数,自动对整个 FLASH 空间进行 CRC 计算,并将计算结果放到 FLASH 的末尾。本文中将介绍的就是如何配置 IAR 的 CRC 参数,使之与 STM32 的 CRC 硬件模块保持一致。本文中的例子都基于 STM32F072 进行。

STM32 的 CRC 外设
CRC 校验值的计算采用多项式除法,可以通过除数和被除数进行异或运算实现。这种方法非常适合通过硬件电路来实现。使用 STM32CRC 外设时,你要考虑的内容包括:采用哪个 CRC 生成多项式,输入数据(要进行校验的数据)和初始值。

1.生成多项式
默认使用 CRC32 多项式:0x4C11DB7
—— X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1
部分芯片支持可编程的多项式,比如 STM32F3,STM32F0,STM32L0

2.初始值
STM32 的 CRC 初始值默认为 0xFFFFFFFF,STM32F3,STM32F0,STM32L0 系列可以修改初始值
3.输入/输出数据的反转
STM32F3,STM32F0,STM32L0 系列还提供了对输入/输出数据进行反转的功能。
默认不对输入数据和输出数据进行位反转
对输入数据的位反转操作可以设置为按字节/半字 /字为单元进行操作。例如输入数据为 0x1A2B3C4D,
o 每个字节内逐位反转,结果是 0x58D43CB2
o 每半字内逐位反转,结果是 0xD458B23C
o 每个字长内逐位反转,结果是 0xB23CD458
对输出数据的位反转。
o 例如输出数据为 0x11223344,反转后为 0x22CC4488


IAR 的 CRC 配置
1.修改 Link 文件
指定 checksum 在 FLASH 中的存储位置,在 Link 文件中增加下面语句。
  1. place at end of ROM_region { ro section .checksum };
复制代码

该语句指定将 CRC 的值放在 FLASH 的末尾位置。是整个 FLASH 空间的末尾,不是应用程序的代码末尾。这样,CRC 值的位置就是固定的。不会随代码大小而变化。

2.配置 Checksum 页面的参数
IAR Checksum 页说明(v6.4 及以上)

}L5GV]%UXDBHZGLO$GZT9.png

IAR 的 checksum 页面分为两个部分。
第一部分,也就是红线圈出的部分。定义了 FLASH 中需要计算 CRC 的范围和空闲字节填充值。
剩下的部分,就是对 checksum 计算参数的设定部分。
Checksum size :选择 checksum 的大小(字节数)
Alignment:指定 checksum 的对齐方式。不填的话默认 2 字节对齐。
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.STM32 CRC 外设使用默认配置时 IAR 的配置
STM32CRC 外设的配置:
POLY= 0x4C11DB7(CRC32)
Initial_Crc = 0Xffffffff
输入/输出数据不反转
输入数据:0x08000000~0x0801FFFB。(最后 4 个字节用来放计算出的 CRC 值)
CRC 外设初始化代码:
  1. /*##-1- Configure the CRC peripheral #######################################*/
  2. CrcHandle.Instance = CRC;
  3. /* The default polynomial is used */
  4. CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;
  5. /* The default init value is used */
  6. CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
  7. /* The input data are not inverted */
  8. CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
  9. /* The output data are not inverted */
  10. CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLED;
  11. /* The input data are 32 bits lenght */
  12. CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;
  13. if (HAL_CRC_Init(&CrcHandle) != HAL_OK)
  14. {
  15. /* Initialization Error */
  16. Error_Handler();
  17. }
  18. pdata = (uint32_t*)ROM_START;
  19. /*##-2- Compute the CRC of "aDataBuffer" ###################################*/
  20. uwCRCValue = HAL_CRC_Calculate(&CrcHandle, pdata, ROM_SIZEinWORDS);
复制代码

IAR v6.4 及以上版本的参考配置如下:

PT0S@71OR})6P`OVG{G8PWU.png

在实验的过程发现, ”Alignment ”似乎对计算出的 CRC 值没有影响。但“Reverse byte order within word ”与“Checksum unit size ”这两项的配置有一定关系。如果后者选择 32-bit,则不能勾选前者;反之如果后者选择 8-bit,则一定要勾选上“ Reverse byte order within word ”。
也就是说,对 checksum 页面参数的配置也可以参考下面这张图:

1XR908C17GUIO@T(PR382PX.png

IAR v6.4 以下版本,没有”Checksum unit size”选项。参考配置如下


SA$U5U7D@B{7IR[X99@0Z.png

收藏 评论0 发布时间:2022-2-27 16:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版