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

STM32硬件CRC的使用

[复制链接]
攻城狮Melo 发布时间:2022-11-13 16:56
STM32硬件CRC的使用
* O  O. C/ S9 dSTM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。: n- Z6 k/ f# t4 F3 m  |  B
其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。- @) V4 M* B( z+ U

0 r2 p2 k9 a9 ?% w. c2 ^/ q, h异同# I2 |/ T! r5 \; K
与普通计算方式相同,以CRC32举例,其默认多项式也是
: w" F  f) S( r3 i: C" NX32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。
% D9 p7 K$ k6 C; t4 g  T5 ?- ]* {7 {6 d计算的初值不同:STM32为0,普通CRC计算为0xffffffff1 K+ F. V& ^8 g" E8 Y
计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算
: W3 o( s1 E# U# B: {0 n输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。1 M( i* T$ {( p' e
1 W/ r! L, K7 O' r& N; t
处理
$ Z7 [: D* t5 m3 U1 T* Y# x知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图
+ I9 q  W7 ~" Q( T! @! Z3 h. k+ `# i3 E- c1 |+ p
fb756e0acfbb4756b0a611e1c5e9e77b.png
/ ^  y1 e3 }& H3 L+ F+ y3 t
" q7 u" u/ q# c% V8 z/ j' o2 j$ I  Q编程0 I2 L+ r1 N* T1 F6 m! @6 y
  1. u8 crc_buf[6] = {0xBE, 0xEF, 0x55, 0xaa, 0xcc, 0xdd};8 `& z  \- j9 U3 q3 b

  2. . _1 O# a; t, g( @3 N: V4 X
  3. u32 calculate_crc32(u8 *pdata, u16 len)0 ~# w5 p$ D8 d" Y
  4. {, V1 V" R1 [/ @) S/ i9 U  x. `
  5.   u32 crc=0;; W5 c- \! ?3 Z  I4 V& N
  6. / i6 d5 y) Q' u% s) P
  7.   //因为主流CRC计算是结果与0xffffffff异或后再输出,而STM32并没有,所以这里要加上异或
    6 S: ~% v2 a! {2 @$ ?
  8.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len)^0xffffffff;
    5 d/ g- _  _" U% I% J. w: [% A
  9.   return crc;1 R, s( i  U5 [9 ^
  10. }
复制代码

) ?5 ~5 S$ Y7 ^2 z% R验证
& O: V% R4 k* T6 v( z0 w0 v6 a; V硬件crc的结果为0x8c9792a51 v* ^( z5 K0 [* V6 R
" |% p" p: `2 W, Y1 A; _
82ef316fe3e644e2ae4e17f1b78f012d.png
% r$ U+ r1 o( T) a/ {/ T( M2 f9 n5 P
结果相符。. l$ _9 V7 N; A! O  f+ O. W
% y/ {1 t( P7 Q: C
CRC16的计算方法又有区别% J/ z( n7 ?4 V: u  N
对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义
, x4 |  s" ?3 W3 C# t5 a, w( v+ L- [而且计算方法也和CRC32不同,注意看区别
& e" O2 f! f$ x* D7 R# p 9474dffe7fdb404bb3fce2495fbd731b.png
$ v' E% j# V1 Q* ]2 O9 L1 q% C( p4 G
设置或更改的内容如下:
2 T7 P/ ?4 @. f9 e' v. a: V默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X0/ ^6 Z" [! c' u& C
默认的初值置0
4 {4 ?0 C! T# C9 E% {输入反转,输出不反。/ `6 r9 e/ e' G9 \+ i# [' ]
计算结果不异或。
  q* M( C# ?2 |  n( E2 k& d# V" S3 a+ O* ]8 f3 }, U
  1.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len);
复制代码

% e/ E1 h1 i9 r6 K: F4 d4 I6 x结果验证:
; S/ ]$ o* o5 k对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D0 H8 t. s! q6 ^: G  x

/ H6 J  I" g1 l# U$ s
! l/ r6 S( S3 i$ x: L
% n% X1 O: P" \1 D6 l. U结果相符% d' T3 ?7 v4 S; N
. W# j: O, D' c. q& g+ ?# d7 h
MODBUS; |$ L) ]* H9 v5 R3 z& i  m9 B7 M
MODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下% q2 u) {5 o. D- ]5 `1 W6 y
7 Q& F" A) B( ~8 W0 b4 x+ z& I
d4726e2f97584323866278a4e934f114.png ; L. {/ j$ R. Y4 H! u$ ?5 _. }8 J

7 }8 x) q: O, ]. V0 R4 k& N- Z代码如下:" S& `& s7 n* d4 O) P: S& E
( ?& `) ]0 b1 J  v) ~+ {
  1. crc16 = HAL_CRC_Calculate(&hcrc, (u32*)uart2_receive_buf, 6);
复制代码

! E& l0 Q- H# Z# ~% T7 k1 u4 P fd7a10b3929345f8a346f05c8794c106.png
% r  |- @9 Z, l6 \( h( f0 P9 r4 i5 r" z  w) X
当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。0 m& D: m( i" G
————————————————
6 l! B5 e2 R: z, Z, z5 i版权声明:老李的森林; e/ t# }- T9 `/ _  _, d
- l# n6 ?6 [4 }; J3 }0 j
7 Z# l8 P4 q6 z2 c8 S  _
339e28d69265456fb5c977a90b02f18a.png
7345dae16e534a918d8f42fc115e7568.png
赞 收藏 评论0 发布时间:2022-11-13 16:56

举报

0个回答

所属标签

相似技术帖

官网相关资源

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