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

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

[复制链接]
STMCU小助手 发布时间:2022-2-27 16:29
前言
/ z! E) R4 M) L- b9 _7 P( RSTM32 全系列产品都具有 CRC 外设,对 CRC 的计算提供硬件支持,为应用程序节省了代码空间。CRC 校验值可以用于数据传输中的数据正确性的验证,也可用于数据存储时的完整性检查。在 IEC60335 中,也接受通过 CRC 校验对 FLASH 的完整性进行检查。在对 FLASH 完整性检查的应用中,需要事先计算出整个 FLASH 的 CRC 校验值(不包括最后保存 CRC 值的字节),放在 FLASH 的末尾。在程序启动或者运行的过程中重新用同样的方法计算整个 FLASH 的 CRC 校验值,然后与保存在 FLASH 末尾的 CRC 值进行比较。5 m% [. n6 G! L/ S, U
EWARM 从 v5.5 版本之后开始支持 STM32 芯片的 CRC 计算。前面所说的计算整个 FLASH 的 CRC 校验值并保存在 FLASH末尾的过程,可以在 IAR 中完成。通过配置 EWARM 的 CRC 计算参数,自动对整个 FLASH 空间进行 CRC 计算,并将计算结果放到 FLASH 的末尾。本文中将介绍的就是如何配置 IAR 的 CRC 参数,使之与 STM32 的 CRC 硬件模块保持一致。本文中的例子都基于 STM32F072 进行。, t% m* U- `2 l, t: l
7 I* l- A. z. E6 m
STM32 的 CRC 外设) }& d* H* F6 F7 ^% P
CRC 校验值的计算采用多项式除法,可以通过除数和被除数进行异或运算实现。这种方法非常适合通过硬件电路来实现。使用 STM32CRC 外设时,你要考虑的内容包括:采用哪个 CRC 生成多项式,输入数据(要进行校验的数据)和初始值。1 R1 r0 J2 P. s
' k: M7 v# W+ m! ^' ]. v
1.生成多项式) G7 f0 q" z: O
默认使用 CRC32 多项式:0x4C11DB7  H' G$ ]# s1 @& _8 ]
—— X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1
: ^) H3 Q( K$ B! J6 U% J部分芯片支持可编程的多项式,比如 STM32F3,STM32F0,STM32L08 }; B& N' K/ A" f3 P, z  W2 n. _

, f& x* _$ L$ q0 L: e2.初始值
& |  z8 P+ z3 ?, s# ?' \5 c7 M: iSTM32 的 CRC 初始值默认为 0xFFFFFFFF,STM32F3,STM32F0,STM32L0 系列可以修改初始值
6 N3 v3 V/ M0 T# h3.输入/输出数据的反转! G& p1 E7 R+ V- ^" L& x
STM32F3,STM32F0,STM32L0 系列还提供了对输入/输出数据进行反转的功能。
& {$ ~8 }( K7 `- D默认不对输入数据和输出数据进行位反转
! f) Z3 p3 L9 O# P/ Q7 G+ X$ N* ?对输入数据的位反转操作可以设置为按字节/半字 /字为单元进行操作。例如输入数据为 0x1A2B3C4D,0 z6 n- A* e# c; N
o 每个字节内逐位反转,结果是 0x58D43CB2
6 }) b7 C0 ~( F7 do 每半字内逐位反转,结果是 0xD458B23C0 U4 A, W4 o$ j$ f: }
o 每个字长内逐位反转,结果是 0xB23CD458& u# ?. |( s* |6 c0 p/ c9 D( c
对输出数据的位反转。* P& I& ~* W% h' ?
o 例如输出数据为 0x11223344,反转后为 0x22CC4488* X# x! I: O; e& b. u4 s1 p2 s

+ Z9 m' G2 [6 \0 r( ?4 n! K: s  Z" ~5 U+ e- b0 y
IAR 的 CRC 配置
. l! K1 O5 Q* ?+ G+ o5 X1.修改 Link 文件
2 F3 o4 A7 s$ f% l( ?指定 checksum 在 FLASH 中的存储位置,在 Link 文件中增加下面语句。+ @' r! u" V& U" j  T# c
  1. place at end of ROM_region { ro section .checksum };
复制代码

# ^& U! H8 a8 U# X- ?该语句指定将 CRC 的值放在 FLASH 的末尾位置。是整个 FLASH 空间的末尾,不是应用程序的代码末尾。这样,CRC 值的位置就是固定的。不会随代码大小而变化。+ l: t2 }' K  A9 {# R

$ z9 |. C. Q$ C/ T2.配置 Checksum 页面的参数5 n# r# h$ U( G. ^+ T
IAR Checksum 页说明(v6.4 及以上)
  x) u# o1 i- D2 j- j+ E: l( n: i$ P: D) u
}L5GV]%UXDBHZGLO$GZT9.png
& y% y7 S" M9 _) S# E- _
& R% n) Q$ W- e# f. j$ WIAR 的 checksum 页面分为两个部分。
0 I. D# l/ }$ ?4 {! s第一部分,也就是红线圈出的部分。定义了 FLASH 中需要计算 CRC 的范围和空闲字节填充值。
1 C8 I# Y* t+ i! o剩下的部分,就是对 checksum 计算参数的设定部分。
# p2 |  D0 @5 u! ?! f" |- r, FChecksum size :选择 checksum 的大小(字节数)$ [! ]3 o+ \) P$ U4 |0 f, f9 |
Alignment:指定 checksum 的对齐方式。不填的话默认 2 字节对齐。
1 d& o+ ^, h- i2 g" ^7 f9 PAlgorithm:选择 checksum 的算法+ H) X9 b: K" B; k5 v
Complement:是否需要进行补码计算。选择“As is”就是不进行补码计算。8 _$ a/ {4 S7 z# G
Bit order:位输出的顺序。MSB first,每个字节的高位在前。LSB first,每个字节的低位在前。% M6 u$ t/ h( t+ n5 y8 t
Reverse byte order within word: 对于输入数据,在一个字内反转各个字节的顺序。: z' A/ H% k( m: z+ r0 \; l
Initial value: checksum 计算的初始化值
# P0 D7 G/ f1 x4 b+ e' k6 ^1 U: QChecksum unit size :选择进行迭代的单元大小,按 8-bit,16-bit 还是 32-bit 进行迭代。% W! g7 f- |* B8 K

  w8 k$ |8 H( ?3.STM32 CRC 外设使用默认配置时 IAR 的配置
  q8 R; z) V9 s2 {: w' BSTM32CRC 外设的配置:) \0 s7 O  R) n. h
POLY= 0x4C11DB7(CRC32)
6 k1 }! x  t2 z; b( G% B! _; x& `Initial_Crc = 0Xffffffff
( ^8 {" M) b( L  y( X4 y输入/输出数据不反转
8 V( W7 d& \  D5 v4 b4 c输入数据:0x08000000~0x0801FFFB。(最后 4 个字节用来放计算出的 CRC 值)8 `: Z4 u1 ?0 K' W4 I
CRC 外设初始化代码:3 m/ R6 ^* b$ I. T( v! B6 a
  1. /*##-1- Configure the CRC peripheral #######################################*/6 j1 {& M/ e& n" m- s' q9 M
  2. CrcHandle.Instance = CRC;1 o& L- `& n3 d2 b6 X
  3. /* The default polynomial is used */
    2 O& T9 m! U7 h! B4 `1 j
  4. CrcHandle.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;) \7 j$ F5 s  r: ^- O0 ]  x# Q
  5. /* The default init value is used */
    ; j6 m1 w9 M/ P. }
  6. CrcHandle.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;
    " J2 J' H! e% E7 m; W/ K/ E- i! @
  7. /* The input data are not inverted */
      E6 q) l  c8 b( ]8 D/ D
  8. CrcHandle.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;1 V- w5 L" R. r  y1 C8 o
  9. /* The output data are not inverted */
    * [# M% Q3 B5 W% T2 [
  10. CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLED;
    $ w) u4 A* R. i3 W
  11. /* The input data are 32 bits lenght */
    + \2 W7 s' c) y& B; Q  [) y3 n( H9 b
  12. CrcHandle.InputDataFormat = CRC_INPUTDATA_FORMAT_WORDS;7 w7 \/ {+ D' u0 e8 B* d; t+ A
  13. if (HAL_CRC_Init(&CrcHandle) != HAL_OK)3 d; [% U7 t! A( Z  F
  14. {
    $ J) o! v/ y5 a0 K8 y! {4 {
  15. /* Initialization Error */1 W; Y0 V: n7 k5 q$ L
  16. Error_Handler();8 D/ P% `3 u( ?) |9 ~; Y' \
  17. }* O# W/ G0 v5 l1 C- T) ]
  18. pdata = (uint32_t*)ROM_START;
    # I" r( g) i. F& U) A
  19. /*##-2- Compute the CRC of "aDataBuffer" ###################################*// C( W% s7 v) p3 B$ W7 D7 j5 K6 j
  20. uwCRCValue = HAL_CRC_Calculate(&CrcHandle, pdata, ROM_SIZEinWORDS);
复制代码
1 d( C6 z6 W* O
IAR v6.4 及以上版本的参考配置如下:+ i9 \; Y- h8 F& _0 p

0 Q: I8 I9 `$ l PT0S@71OR})6P`OVG{G8PWU.png
6 S) z1 U) R3 l  q% a, u$ `  Z4 G- z
6 f5 J3 M1 v$ v在实验的过程发现, ”Alignment ”似乎对计算出的 CRC 值没有影响。但“Reverse byte order within word ”与“Checksum unit size ”这两项的配置有一定关系。如果后者选择 32-bit,则不能勾选前者;反之如果后者选择 8-bit,则一定要勾选上“ Reverse byte order within word ”。
3 g4 {( x# O* }6 h也就是说,对 checksum 页面参数的配置也可以参考下面这张图:
( \2 ~6 \; h( e' H4 M' q
: r- L8 Z4 A$ k* s4 _- N 1XR908C17GUIO@T(PR382PX.png
! R1 O$ l+ W6 J) U7 h
' ?& x5 e; k9 Z$ p9 N$ ?IAR v6.4 以下版本,没有”Checksum unit size”选项。参考配置如下
  x. b& p' r& O- c7 {5 t) U. }
4 }0 ~5 f/ M4 U* ~) D( u, l" {
7 @- H! l$ ^1 I SA$U5U7D@B{7IR[X99@0Z.png 5 n3 ^$ C4 _/ n! n' ?! \' i
7 u, `* y6 ^0 m8 X2 Y0 K4 l
赞 收藏 评论0 发布时间:2022-2-27 16:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

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