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

STM32硬件CRC的使用

[复制链接]
攻城狮Melo 发布时间:2022-11-13 16:56
STM32硬件CRC的使用* B+ {/ b0 C6 s+ Y( g# e
STM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。7 }0 V" t; }8 ]1 j5 ^+ Q* T# V
其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。% k, M; }; |; y) @4 B

4 u3 Y# D# u( j6 _异同7 J6 s2 f, f8 r1 F. V+ b0 v$ i
与普通计算方式相同,以CRC32举例,其默认多项式也是
+ p' b5 b- @# ^  A- X% G0 VX32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。# k; P- b5 v4 U
计算的初值不同:STM32为0,普通CRC计算为0xffffffff
  @" ^% Z* F- d  g8 a" n' @% H# y计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算" _9 {( X3 v. O8 u; x  w
输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。
: b$ z4 J9 O# n) ~  P  H1 |- \, ~- \! C3 a! N* s
处理
& E. {$ c8 @" Y2 P知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图
, C1 R. E% x3 M+ c$ a: G8 y, u7 S+ _. J. n3 z3 u' A  s
fb756e0acfbb4756b0a611e1c5e9e77b.png " N* ]4 H9 G" l

- ?$ F" A+ }/ c0 j! Y编程# h2 K$ L2 f/ z8 W/ z
  1. u8 crc_buf[6] = {0xBE, 0xEF, 0x55, 0xaa, 0xcc, 0xdd};
    ! E% x% A# X! p' p. b

  2. 0 n0 ?0 W) j. K& H5 y
  3. u32 calculate_crc32(u8 *pdata, u16 len)
    $ ^, E, @4 N7 r0 |
  4. {8 `+ [& w0 f. O1 n. g/ s
  5.   u32 crc=0;- N3 r- T( c1 {  I

  6. - c0 h# W; a4 }7 t3 L4 j
  7.   //因为主流CRC计算是结果与0xffffffff异或后再输出,而STM32并没有,所以这里要加上异或, X) k8 l! r+ r0 [$ g
  8.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len)^0xffffffff;# C  P7 V3 F4 r5 K# k9 a3 W  h7 D! i
  9.   return crc;
    3 b! @5 o8 Y# _( a9 Y- q
  10. }
复制代码

4 S$ a2 f6 m8 b& u验证" Z" w* @4 c- l9 c$ |
硬件crc的结果为0x8c9792a5
0 g8 \; O- Y( b2 {! d, G
* V' m0 G3 j5 T$ r+ W4 m  t% W/ _ 82ef316fe3e644e2ae4e17f1b78f012d.png
9 s" N' q6 f/ T, v: o7 I6 h# M1 U8 n, C) S9 s& f6 l* R2 x
结果相符。
: q+ d$ q0 H2 D; z( r# e0 V5 s0 L5 d! p2 R) _
CRC16的计算方法又有区别  \1 w+ z+ L8 [7 y
对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义4 x% u% e+ p, z6 Q
而且计算方法也和CRC32不同,注意看区别0 S- ?- U- K+ V
9474dffe7fdb404bb3fce2495fbd731b.png $ x9 M3 u1 i+ a; w- N

' W( ^  w: _# t设置或更改的内容如下:
$ P' B4 _! P0 ?默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X0
8 f* f: K( {  b: ^9 l0 {; {0 v默认的初值置0, O: O0 p: }2 H( w# b/ z
输入反转,输出不反。
( u& t5 E; j8 ^! c* N, L3 c: ]计算结果不异或。) M/ P' \$ v, n1 i9 u  R
1 W& a  U) t1 H& }0 ?" Q% {8 g# j
  1.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len);
复制代码
$ e) S  t. s' f- T3 P; X
结果验证:
) X, O9 B! b4 K/ v, x对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D
8 h1 [2 Z/ F8 i& _% J! ]
' _$ a9 e: H, J, h; y: k7 @+ l3 x) M* H% h  W& j2 D1 Y! Z; N6 P! K
1 f0 L- i  N) }
结果相符
% j& B) O. h+ f6 f' y4 m3 c5 F3 F; X" ^' u
MODBUS5 Z6 w3 D$ N3 i; k
MODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下
- X, a/ M3 L0 Q0 T. o/ o- `- b7 J+ h! {9 R
d4726e2f97584323866278a4e934f114.png
8 l1 m0 b$ C- o# p' M+ }( b# o& X% U4 t
代码如下:5 P; X. p4 `( ^2 t

: }2 W% ~. W  h" _  R" s
  1. crc16 = HAL_CRC_Calculate(&hcrc, (u32*)uart2_receive_buf, 6);
复制代码
' `6 ?9 D" Z) b/ y+ y0 D! a1 v, @$ x
fd7a10b3929345f8a346f05c8794c106.png
- i4 v7 o" ?$ N# o2 X/ O! N8 P1 h6 t4 N3 I7 F# Y, l! |
当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。
) p( g; w4 Z# F1 f# @) \————————————————
, o0 P$ P- T0 u5 V2 i2 M版权声明:老李的森林2 Z5 r! }4 \, ]( E

# L( m  J3 E% u* x- R6 L8 t# ]4 }. s! P/ p* N; U
339e28d69265456fb5c977a90b02f18a.png
7345dae16e534a918d8f42fc115e7568.png
赞 收藏 评论0 发布时间:2022-11-13 16:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

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