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

【经验分享】STM32的硬件CRC

[复制链接]
STMCU小助手 发布时间:2022-1-31 16:00
简介
基于STM32F105介绍STM32的硬件CRC和使用方法,并记录软件检验实现。
STM32的CRC介绍0 b8 z* V# K# g6 I; a6 k) F
1734400-20200328091944848-1235556479.png & h8 L/ Q4 b& H4 x

! @+ B8 T! N, N: {2 h" X手册中说明STM32的CRC硬件校验使用的是32位CRC校验,多项式为0x04C11DB7;CRC计算时一次性运算32bits,不是按照字节运算;CRC_DR寄存器的复位值为0xFFFFFFFF,即CRC计算的初始值。
STM32的CRC使用
  • STM32的CRC_DR寄存器既作为输入寄存器又作为输出寄存器
  • 作为输入寄存器时直接写入要进行CRC计算的数据
  • 作为输出寄存器时,通过读操作返回上次CRC计算结果
  • 每一次写入数据寄存器的计算结果是前一次计算结果和新计算结果的组合;在新的数据块进行CRC计算之前,需要复位CRC_DR寄存器
    1 q3 N4 {+ [" V8 @4 ]$ s3 `
以STM32F105的标准库为例,介绍CRC计算的步骤
  1. uint32_t buff[4] = {0x01,0x02,0x03,0x04};) ^  `+ N8 J1 c" J% _+ k0 L: y; G2 a) Z
  2. CRC_ResetDR();1 v( y9 Y. A2 m# N) ~0 \' x- W
  3. CRC_CalcBlockCRC(buff,4);/ y& Z& U* ^' _$ E- L+ W0 x
  4. delay(5);
    & x7 A# Z, Y0 j  N! g) @
  5. ret = CRC_GetCRC();
复制代码
0 }4 k$ N5 S- ?$ t) ~+ @' G

; ?0 _1 t6 w( f( W8 F& f% y4 Z8 S0 pSTM32的CRC软件实现
STM32硬件CRC计算出来的结果与常用的CRC32计算出的CRC值不一样,如果通信中用到了STM32的硬件CRC计算值,需要外部实现与硬件CRC一致的计算结果,详细代码如下
  1. uint32_t crc32_st(uint32_t *pbuf, uint32_t size)
    : V: s; b% U6 y
  2. {$ b- a" A. q  T
  3.         const uint32_t st_const_value = 0x04c11db7;, N+ K' d1 s9 Q
  4.         uint32_t        crc_value = 0xffffffff;( E  D& U# ~8 v$ i0 C
  5.         uint32_t        xbit;
    9 c1 f( S2 x4 ^3 ?0 c
  6.         uint32_t         bits;$ g  ~) w, m( V; \6 z- Y
  7.         uint32_t        i;
    6 k( Z7 n1 {( G& `- r+ Y6 {
  8. - C+ J6 B9 [- o4 }+ U5 r) B/ `9 ?
  9.         for (i = 0; i < size; i++)- [' w7 M) F6 \* h2 l( E
  10.         {
    ! P$ W" U& }% N( l" w" b8 W) M' M. N
  11.                 xbit = 0x80000000;  T8 q/ }4 d4 X4 v7 ^  w
  12.                 for (bits = 0; bits < 32; bits++)
      N8 S  |, p3 s) f/ j" u# \9 ~
  13.                 {/ T) R, K1 w3 b1 H7 B, X
  14.                         if (crc_value & 0x80000000)9 f. {! I9 T- `
  15.                         {0 ^" c4 w% i+ b, w! b& ]
  16.                                 crc_value <<= 1;
    + z7 A5 E6 f' N. j# G
  17.                                 crc_value ^= st_const_value;! c: E2 q5 K- l7 d0 Q
  18.                         }. n# B% Q- z9 M3 U. _2 w$ c
  19.                         else
    9 _  f4 b0 t% k/ b) U
  20.                         {
    9 T, ?$ t7 A8 t6 v
  21.                                 crc_value <<= 1;' r& S% }& R2 z9 N& h0 U
  22.                         }
      Z% b9 k0 U+ d' J5 q
  23.                         if (pbuf[i] & xbit)+ z6 W  a( o# P6 `
  24.                         {" }( n' q, P. u7 P
  25.                                 crc_value ^= st_const_value;
    $ m  |9 {; A, A1 h: f6 I
  26.                         }
    - y' q5 y! W1 o" `& E8 w+ r: i
  27.                         xbit >>= 1;/ e1 Z0 t' _6 i7 f" n6 ^
  28.                 }
    5 d) W$ q, {. P
  29.         }
    6 ]* ^, Q) B4 Q* x$ C% \
  30.         return crc_value;6 g  U6 ^* ?$ X6 f" T. a
  31. }
    ; ]6 a  ^7 s+ r  |# e, n" M
复制代码

+ v, X5 I% }, e
0 f7 J+ n9 f/ I5 G总结
其它平台与STM32通信时,如果用到CRC值,可以通过这种软件计算与STM32的CRC保持一致。

; r) }5 r! S" }/ x; p- B  G7 F; ]1 O
赞 收藏 评论0 发布时间:2022-1-31 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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