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

STM32硬件CRC的使用

[复制链接]
攻城狮Melo 发布时间:2022-11-13 16:56
STM32硬件CRC的使用0 C) ^, }8 Q: X" y, B9 \0 s
STM32硬件的CRC不占用MCU的计算资源,和软件查表计算消耗的存储空间。但其结果与平常使用的CRC不一样,导致很多人还是在用软件计算CRC。, Y" |+ Y- Y6 T5 i; y
其实结果的差别,只是由于计算方式导致的,调整计算方式以后也可以输出普通计算的结果。
/ K: Y5 v7 w  X9 G% Y* w( F7 p  l0 }6 }0 B
异同
% ]3 e) a  I1 O' j3 C  M与普通计算方式相同,以CRC32举例,其默认多项式也是: z; u* _. ]5 p/ K3 K1 o- P
X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1,但也可以自定义。2 x3 n% O4 Q8 d& W1 B
计算的初值不同:STM32为0,普通CRC计算为0xffffffff
" {4 o1 a$ U/ H, D% d& ]7 W; t计算的顺序不同:STM32从最低位开始计算,普通CRC从最高位开始计算
6 ]) S# w# H+ Z! W输出结果:最高位到最低位,与普通CRC刚好相反,而且普通CRC的输出结果为计算结果与0xffffffff异或后输出,STM32就少了这个异或。
- D$ h2 q+ o. G8 O* q$ {( _: Y* R# i, |3 v1 B& r( @
处理- {1 \# y- z7 w3 f0 r. _8 G, c
知道了不同之处,接下来的处理就很简单了。在CRC的设置中按下图
! E) m# Z+ T6 Z% U9 p. D
+ e3 R. _+ r/ {5 Z0 Q, U fb756e0acfbb4756b0a611e1c5e9e77b.png
; Y! w4 a! c1 o- E/ |7 V# Y
1 Q3 u, E; M3 V3 n9 j+ c6 a* _编程
! M* x; j3 ?$ O, ]( P! T
  1. u8 crc_buf[6] = {0xBE, 0xEF, 0x55, 0xaa, 0xcc, 0xdd};% [  S8 f& D; s' g6 t* S

  2. 7 }3 v# T  k) R9 f
  3. u32 calculate_crc32(u8 *pdata, u16 len)9 K8 \$ n$ t, H- e; J  ?3 V
  4. {. X  _- @4 h# j& |% Q' i! f& B
  5.   u32 crc=0;
    # B* q9 J; @' ?9 I' t

  6. 7 U7 h2 q- v# V% L
  7.   //因为主流CRC计算是结果与0xffffffff异或后再输出,而STM32并没有,所以这里要加上异或+ _' m& G+ v9 l1 {
  8.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len)^0xffffffff;1 I) K; p- U; `3 f9 t4 D
  9.   return crc;
    0 P+ T9 u. o- D, ~+ N& [4 J
  10. }
复制代码
  m3 k( c6 H! p2 ]7 l9 @
验证  b* D6 T* k: U' S
硬件crc的结果为0x8c9792a5, C( O. h! s& c- ?! N8 ?2 C
$ p$ [* P/ K5 _- O( T) C7 ~% |
82ef316fe3e644e2ae4e17f1b78f012d.png / p+ }: Z2 _- ]4 Q- |( X9 t

# v, H2 K( n/ W& Y" O; c: P$ F1 a( I结果相符。) y2 F5 E2 I) F  [8 R

+ i1 u9 |  t+ ?$ OCRC16的计算方法又有区别
( }. M3 ?5 k. r/ d对于CRC16有些不同,要计算CRC16时,第1个参数选Disable,然后多项式可以自定义
( a, i5 ?4 X+ R& G而且计算方法也和CRC32不同,注意看区别
/ ~1 X$ T3 U7 E$ V/ q' G$ U. Y 9474dffe7fdb404bb3fce2495fbd731b.png 2 g$ Z+ O* R7 q! M/ V8 M
1 i0 H" N/ T( E9 y5 J* G
设置或更改的内容如下:
2 a! n' p/ _9 r9 g/ {  v3 v( G默认的多项式是不对的,常规应该是0x8005,按位设置好就是X15+X2+X07 P1 T2 z7 K- L( K: G; J* Q9 C$ u+ p$ ^
默认的初值置0$ B8 \. z$ t5 V) v# {5 O
输入反转,输出不反。
' j* D3 {6 M+ r  o* c" e! `4 @计算结果不异或。. n, v4 k) W) ?! ~/ O

- {. Q; Y: t1 F/ K6 h' x) c
  1.   crc = HAL_CRC_Calculate(&hcrc, (u32 *)pdata, len);
复制代码
  N& X, x, G/ b  o* d- ~
结果验证:( c& v  j: ^, c; {3 w3 v
对于0x07, 0x02, 0x00, 0x10, 0x00,硬件CRC计算结果为0x9D1D3 Y9 [8 }4 d% b& X9 D" H) J5 w
+ M) k6 `1 a4 s6 K
, M; j! ^& ~1 N6 n
; i% _' e. v) K( i( L* ^
结果相符3 r/ c% I2 k) r$ W" I( g
3 K2 y# P+ d1 j
MODBUS
- Q. q  O1 U; N" J- yMODBUS一般是8个字节,其中CRC16占用最后的2个字节,正文共6个字节,在这里也示例一下
1 p0 l0 T  Y6 W5 B* m0 e! D' s" k
d4726e2f97584323866278a4e934f114.png
; y/ S( @0 J; t$ f
, \4 ]; G1 Y$ P0 @1 e代码如下:& F# p$ ]: a; {6 b
" V" w5 H, n! ^  x: x; I
  1. crc16 = HAL_CRC_Calculate(&hcrc, (u32*)uart2_receive_buf, 6);
复制代码
2 A" P# i  K6 s' ~+ J; k: v8 E
fd7a10b3929345f8a346f05c8794c106.png
5 v% k# q* ?% Z  n! D0 O  H& v! v6 |2 _  H9 s6 v. Z
当然有很多种计算CRC的参数模型,按照上面的方法套一下即可。
7 z# k/ S- \2 j5 A% Y————————————————
; q( |4 K1 c. p0 ]6 S6 f( G3 T* I版权声明:老李的森林* h- _5 A- `/ I( y0 ~
; W. m5 D, _0 S$ a3 q
2 p5 c6 f7 K/ i0 c$ }, |4 f9 K4 }
339e28d69265456fb5c977a90b02f18a.png
7345dae16e534a918d8f42fc115e7568.png
收藏 评论0 发布时间:2022-11-13 16:56

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版