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

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

[复制链接]
STMCU小助手 发布时间:2022-2-27 16:29
前言
9 W( L* m. y' J' u$ b4 |6 qSTM32 全系列产品都具有 CRC 外设,对 CRC 的计算提供硬件支持,为应用程序节省了代码空间。CRC 校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在 IEC60335 中,也接受通过 CRC 校验对 FLASH 的完整性进行检查。在对 FLASH 完整性检查的应用中,需要事先计算出整个 FLASH 的 CRC 校验值(不包括最后保存 CRC 值的字节),放在 FLASH 的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个 FLASH 的 CRC 校验值,然后与保存在 FLASH 末尾的 CRC 值进行比较。# n2 B$ V6 D$ ^& f
EWARM 从 v5.5 版本之后开始支持 STM32 芯片的 CRC 计算。前面所说的计算整个 FLASH 的 CRC 校验值并保存在 FLASH末尾的过程,可以在 IAR 中完成。通过配置 EWARM 的 CRC 计算参数,自动对整个 FLASH 空间进行 CRC 计算,并将计算结果放到 FLASH 的末尾。本文中将介绍的就是如何配置 IAR 的 CRC 参数,使之与 STM32 的 CRC 硬件模块保持一致。本文中的例子都基于 STM32F072 进行。! x0 g" r3 F  v6 E/ v  z5 `
+ r0 [4 _' [! l8 i" i
STM32 的 CRC 外设
; k: H5 l! u  ?: J& Z2 e% VCRC 校验值的计算采用多项式除法,可以通过除数和被除数进行异或运算实现。这种方法非常适合通过硬件电路来实现。使用 STM32CRC 外设时,你要考虑的内容包括:采用哪个 CRC 生成多项式,输入数据(要进行校验的数据)和初始值。( |. k  x8 [1 v# u& m
9 A7 \! Z' m/ Z
1.生成多项式3 V- k* T. ]' D
默认使用 CRC32 多项式:0x4C11DB7( J9 ~/ y' p  O, c/ O$ d
—— X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+13 b3 l( v( B, g$ f) [. H0 V
部分芯片支持可编程的多项式,比如 STM32F3,STM32F0,STM32L0
9 B) ], T& y1 z4 |" T3 W
- c' Q4 D- p4 K1 v0 }: r: z* C2.初始值! s* D8 _6 ~) X, z1 c; d
STM32 的 CRC 初始值默认为 0xFFFFFFFF,STM32F3,STM32F0,STM32L0 系列可以修改初始值
( j" Y8 k1 {' h) P; Z5 n3.输入/输出数据的反转
& k5 i. q# I! O5 I8 c# qSTM32F3,STM32F0,STM32L0 系列还提供了对输入/输出数据进行反转的功能。
0 Z+ [9 t. ~+ U* G: |+ i! @默认不对输入数据和输出数据进行位反转7 D. N1 B1 l+ ~2 x
对输入数据的位反转操作可以设置为按字节/半字 /字为单元进行操作。例如输入数据为 0x1A2B3C4D,6 `5 g% V% s$ M' x
o 每个字节内逐位反转,结果是 0x58D43CB2
* |6 Q2 R9 ^, l  V3 H$ x! J& }8 r. Uo 每半字内逐位反转,结果是 0xD458B23C! ?$ T. w2 I5 |7 ?; E
o 每个字长内逐位反转,结果是 0xB23CD4586 L$ _( _9 m2 }1 G: y( E
对输出数据的位反转。
5 A; h4 H! G% ho 例如输出数据为 0x11223344,反转后为 0x22CC44889 I: i: g# ?" T6 b

0 e2 m5 T4 L( J. M4 `8 T$ n
0 Y* k) N. n1 k( d. m* }' mIAR 的 CRC 配置
3 q& p' Y' `2 W1 d' R1 A0 r* R1.修改 Link 文件
& A, B9 ~/ p) a: M) |" R! G, o- R3 u指定 checksum 在 FLASH 中的存储位置,在 Link 文件中增加下面语句。
  K; H* ~3 Y, P5 ^/ I0 Y$ o& M
  1. place at end of ROM_region { ro section .checksum };
复制代码
; Z" t& n; _+ }+ Q# l$ Q! [
该语句指定将 CRC 的值放在 FLASH 的末尾位置。是整个 FLASH 空间的末尾,不是应用程序的代码末尾。这样,CRC 值的位置就是固定的。不会随代码大小而变化。
4 ?8 _! m; F7 y: c7 O
0 H2 v( A9 R, k+ S$ z$ g$ e% F# p2.配置 Checksum 页面的参数4 d# W' `, U9 n- I% P  X6 k
IAR Checksum 页说明(v6.4 及以上)8 c# l4 z- t9 k) X! @

, `7 ~- g# ^' i" y; d8 g }L5GV]%UXDBHZGLO$GZT9.png
8 Q2 b) Y+ r6 t) \
6 g2 i; W4 `1 b4 pIAR 的 checksum 页面分为两个部分。
! _# \9 Z0 T3 h+ \第一部分,也就是红线圈出的部分。定义了 FLASH 中需要计算 CRC 的范围和空闲字节填充值。
+ K6 P, O1 n8 M7 n/ a: |剩下的部分,就是对 checksum 计算参数的设定部分。) g+ O5 @0 e3 _6 z9 g
Checksum size :选择 checksum 的大小(字节数): n! O$ ]! T7 E% Y0 H' Y
Alignment:指定 checksum 的对齐方式。不填的话默认 2 字节对齐。
; v6 A; Q! v# Z, I. s9 N2 P( \, UAlgorithm:选择 checksum 的算法
# J* p* X' a) b3 QComplement:是否需要进行补码计算。选择“As is”就是不进行补码计算。2 x  r1 m6 D' \4 g
Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。# T! n6 W: d! V) G
Reverse byte order within word: 对于输入数据,在一个字内反转各个字节的顺序。. k; f! r* f) a' {/ A  C
Initial value: checksum 计算的初始化值  G. Z, x( g& m: a
Checksum unit size :选择进行迭代的单元大小,按 8-bit,16-bit 还是 32-bit 进行迭代。. ]: o9 Z& C: c8 h  y5 E
9 t8 G/ ?+ `! g5 V8 v9 v
3.STM32 CRC 外设使用默认配置时 IAR 的配置/ L1 y- S$ l2 ?
STM32CRC 外设的配置:
( F) k+ X/ g2 R: V" H/ T: A. e" LPOLY= 0x4C11DB7(CRC32)+ c' Y: W/ Z9 u+ n5 W8 d
Initial_Crc = 0Xffffffff
; d4 {3 W2 |# d4 q( Y3 Z+ d输入/输出数据不反转
' U9 U  G. f+ Z' N# y8 I# U输入数据:0x08000000~0x0801FFFB。(最后 4 个字节用来放计算出的 CRC 值)* S6 A' B4 L  L& ~4 k# C, r
CRC 外设初始化代码:
8 B- r3 k7 F) ]' z2 Q3 j# i$ K, B0 Q
  1. /*##-1- Configure the CRC peripheral #######################################*/: z- C, l# K' r. s: v
  2. CrcHandle.Instance = CRC;
    : z. p. U! m* O4 l  t3 t, ~% \) K
  3. /* The default polynomial is used */. t% Q: B( r& O) I1 u0 Z, q' x' L/ |
  4. CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;% x- C& G7 e8 g+ m3 T
  5. /* The default init value is used */
    7 H4 A: P' w1 H9 \; r8 U4 |) B7 y
  6. CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
    " N: T: u2 |. g& ?( `
  7. /* The input data are not inverted */' L% S0 p8 Q! g& E2 e
  8. CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;
    2 w2 u. ]/ m  Z0 \3 V
  9. /* The output data are not inverted */
    / o& [# t( z1 k
  10. CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLED;/ P/ a& Q! C0 L; N, O
  11. /* The input data are 32 bits lenght */
    5 k3 H& i6 t) [
  12. CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;
    - ?+ Q# H+ [0 b0 ?( I! v( }1 |
  13. if (HAL_CRC_Init(&CrcHandle) != HAL_OK)
    , r5 ~- a7 K7 T- k, z" l
  14. {
    ) c6 J5 D7 M+ D( e  |
  15. /* Initialization Error */
    : R9 A  _) _% `' G4 w& H% u$ S
  16. Error_Handler();  r! R, E7 j# r9 q! L5 I. X
  17. }
    6 K4 Z- E* J% K5 k: P9 I
  18. pdata = (uint32_t*)ROM_START;
    . n" ~! O, E7 X- J
  19. /*##-2- Compute the CRC of "aDataBuffer" ###################################*/
    7 Y" l9 D( o) W7 W
  20. uwCRCValue = HAL_CRC_Calculate(&CrcHandle, pdata, ROM_SIZEinWORDS);
复制代码
7 M) \7 Z. K. ]2 i! c% `
IAR v6.4 及以上版本的参考配置如下:+ C& L3 ~; D7 d+ q

  n; S9 Z3 o4 X; c: h. X4 L PT0S@71OR})6P`OVG{G8PWU.png
2 o5 t1 p& s- M0 @/ {
9 ~" \# O6 O' L0 u5 }" N/ y6 ]2 I在实验的过程发现, ”Alignment ”似乎对计算出的 CRC 值没有影响。但“Reverse byte order within word ”与“Checksum unit size ”这两项的配置有一定关系。如果后者选择 32-bit,则不能勾选前者;反之如果后者选择 8-bit,则一定要勾选上“ Reverse byte order within word ”。
, o, x  a$ e& l- b" K1 `也就是说,对 checksum 页面参数的配置也可以参考下面这张图:% v/ r" {. a7 ^- |0 t. y3 ?
0 k+ |( l' \2 d3 n
1XR908C17GUIO@T(PR382PX.png
8 `8 y; a( n. f9 S. u4 s, t( j& w( U9 D
IAR v6.4 以下版本,没有”Checksum unit size”选项。参考配置如下4 C" V6 z, F  i1 D

3 S/ b  j6 ~- O% v% L  K
6 s0 ]3 P: p. m2 W, J8 [ SA$U5U7D@B{7IR[X99@0Z.png
& w+ U7 @; _! F8 n
) o2 ^: ], r1 v; V9 B0 F
收藏 评论0 发布时间:2022-2-27 16:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版