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

STM32硬件CRC的使用

[复制链接]
攻城狮Melo 发布时间:2022-11-13 16:56
STM32硬件CRC的使用& y% k; z) h2 T  e; J
STM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。
* G( y, _  {- D, y1 ?! }其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。! D) o# F% i0 [$ I7 x
3 H! y' p7 f  v
异同: N3 K) `2 v: X9 u8 F1 y' w8 a
与普通计算方式相同,以CRC32举例,其默认多项式也是
" b2 C, j6 |' P* T& h# y; I( dX32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。5 {0 N( U1 s& \4 p# ^$ ~3 B4 e
计算的初值不同:STM32为0,普通CRC计算为0xffffffff4 e8 m/ t9 j7 N$ b
计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算4 b& y! V# [" @. B4 m
输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。
4 ?( b/ A0 M' r- ~' }! q6 V5 z6 y: i$ M5 i
处理
6 U1 X: u& a! R6 I: [知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图7 e' g0 [7 E6 x4 P. x3 |" a' v

$ F# b" ~, {. H2 |; c. B1 i fb756e0acfbb4756b0a611e1c5e9e77b.png $ K: e0 U1 B) N, [
& h: K! l6 f& D6 |/ K4 ^9 G
编程7 C+ N( t; r3 N4 C: J* M& d( b1 r# r4 g1 t
  1. u8 crc_buf[6] = {0xBE, 0xEF, 0x55, 0xaa, 0xcc, 0xdd};
    : D/ s# |! H9 Z$ [9 j+ {. o3 k1 }
  2.   Q1 H* q& U* j  }  c
  3. u32 calculate_crc32(u8 *pdata, u16 len). T4 o3 B& G' K, C
  4. {
    & C4 H/ w$ T- K! e
  5.   u32 crc=0;
    / d" ]: j! T6 O( D* g7 h3 |
  6. ) b1 a( N0 ?3 ^" M. @; e  i
  7.   //因为主流CRC计算是结果与0xffffffff异或后再输出,而STM32并没有,所以这里要加上异或
    # M- D. Y: W% |5 B% E
  8.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len)^0xffffffff;
    ! q1 z" l9 [5 V4 C1 {/ A/ h  G, T
  9.   return crc;
      |5 N! H4 p- J' J5 v6 Y4 k4 T5 ~3 G
  10. }
复制代码
# L: H6 J* T( k% V; T
验证/ u, r+ e0 T, q  Q2 Z( H; u4 W( b
硬件crc的结果为0x8c9792a5
! n5 M( o5 P+ y  i
! B9 _. P8 e* i, [* S$ V. M 82ef316fe3e644e2ae4e17f1b78f012d.png 5 s7 \9 Z" Y; N5 z& ]5 p, n% b
4 \" K  \6 }" x  B: G
结果相符。6 u) x1 M- i' w1 I; v1 l5 N
# S8 g! o& [9 v: f4 s6 u
CRC16的计算方法又有区别
# }& P! `+ M! Q& V; p- V对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义/ e5 m/ n3 @7 {- I! i& h, O7 V
而且计算方法也和CRC32不同,注意看区别
6 S* r* k* g- M8 ~. d2 f 9474dffe7fdb404bb3fce2495fbd731b.png 5 E7 ?4 p9 X9 l

. C" M" _6 T4 e+ b设置或更改的内容如下:
4 `6 B* ~6 E& U0 }) L; F" w默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X0
4 V! a$ v$ [& f7 y( y+ L默认的初值置0% l' ~6 m: O( B4 p0 Y2 a
输入反转,输出不反。
. c+ V: d0 a( M/ ~! a计算结果不异或。
: O' [( S7 e" F
8 I5 Y( X7 G) q; g3 Z
  1.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len);
复制代码

9 b& C' A; D  ?- g. n8 b' K结果验证:
1 j- ~1 l4 i0 O6 R! E对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D- s3 K2 g" D5 A( a' `. z6 M

  ~; N' x. Q3 w$ y. t# z3 v: Z9 x9 b* i' ?5 O
& w& f4 I( a. V& W5 X7 W
结果相符
2 I4 c! p7 t- ~/ |3 S
: E1 N. l5 y4 l+ @MODBUS( ^, v% y' z! Z; w) c* u
MODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下5 P7 V) C0 i$ ^$ ]8 B  D

2 x  [' ]5 c- ^* ?! M d4726e2f97584323866278a4e934f114.png % ~) ?  f0 H: I$ c9 Q. Y* q1 Q+ p3 r

' g+ ~* `( x( j3 U6 G- f代码如下:/ e# I, @# o- X/ v) ~- \

/ ~( A8 I, l& [; w7 `! m2 z
  1. crc16 = HAL_CRC_Calculate(&hcrc, (u32*)uart2_receive_buf, 6);
复制代码
# }- [2 B% \9 W' d  s+ K' i
fd7a10b3929345f8a346f05c8794c106.png
! l( d+ `" C- Y! G+ s
  P- E6 [) B4 G8 Z  B5 x当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。
. k+ ^: x( t% `" |————————————————
. W. U; o+ G( e8 {* q1 _, s& s版权声明:老李的森林* e4 C/ g" b# M4 u. a
6 f& e( A* ]: k. t1 U

9 y# q' L- `/ _* b% R" N
339e28d69265456fb5c977a90b02f18a.png
7345dae16e534a918d8f42fc115e7568.png
收藏 评论0 发布时间:2022-11-13 16:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

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