简介 基于STM32F105介绍STM32的硬件CRC和使用方法,并记录软件检验实现。 STM32的CRC介绍
( U* P' G7 {3 \
/ J- h2 [& V1 ?8 k

* }* o4 P& b* P8 ?4 e0 f$ d7 u3 l1 O# G9 P手册中说明STM32的CRC硬件校验使用的是32位CRC校验,多项式为0x04C11DB7;CRC计算时一次性运算32bits,不是按照字节运算;CRC_DR寄存器的复位值为0xFFFFFFFF,即CRC计算的初始值。 STM32的CRC使用- STM32的CRC_DR寄存器既作为输入寄存器又作为输出寄存器
- 作为输入寄存器时直接写入要进行CRC计算的数据
- 作为输出寄存器时,通过读操作返回上次CRC计算结果
- 每一次写入数据寄存器的计算结果是前一次计算结果和新计算结果的组合;在新的数据块进行CRC计算之前,需要复位CRC_DR寄存器0 }3 w4 Y4 D1 N9 o2 N9 L6 }
以STM32F105的标准库为例,介绍CRC计算的步骤 - uint32_t buff[4] = {0x01,0x02,0x03,0x04};
/ B( k6 J" S2 w; a( g" o4 _/ U - CRC_ResetDR();+ t+ T# \# ^; X" S8 U
- CRC_CalcBlockCRC(buff,4);
) x6 e/ W0 H4 g3 P7 x) F) h5 } - delay(5);
[0 x, e3 J- p( Z - ret = CRC_GetCRC();
复制代码 t6 _# ?" o4 h( W
8 W9 g; J$ \- j- {; B6 N9 Z
STM32的CRC软件实现STM32硬件CRC计算出来的结果与常用的CRC32计算出的CRC值不一样,如果通信中用到了STM32的硬件CRC计算值,需要外部实现与硬件CRC一致的计算结果,详细代码如下 - uint32_t crc32_st(uint32_t *pbuf, uint32_t size)
+ w/ V" a$ g1 @ L# `# z& o - {
# k0 c, \# Q7 S - const uint32_t st_const_value = 0x04c11db7;) z. T8 g; U+ o
- uint32_t crc_value = 0xffffffff;
; M0 Q* p" g$ b+ l3 U! { - uint32_t xbit;
) B3 u% g+ e/ M - uint32_t bits;6 g H1 h$ t# J6 V9 R
- uint32_t i;
' M: M' Y3 n9 i; N: n: ^
' O# r8 C' {5 ? W# z- for (i = 0; i < size; i++)
0 t, M+ I* C8 e7 X6 \ - {
0 n8 }% `4 A8 _, N/ {& X7 A - xbit = 0x80000000;
4 W) O3 ~: n k" ? - for (bits = 0; bits < 32; bits++), z) f" D( D9 F9 r t; N( ?
- {
5 K" I: F. L$ ]; a& B - if (crc_value & 0x80000000)
; K: o% U; l. V$ \& f' o$ l - { u$ y: s8 C* T. i6 e/ D
- crc_value <<= 1;, J; e: c1 B# Q6 G5 v2 U/ N% f8 x3 j6 a
- crc_value ^= st_const_value;; F) a$ Q! l1 Y0 I' y0 {
- }
1 c. x' J$ _1 }2 W4 I - else7 j( w4 V$ k. B1 n6 d2 _ i
- {% c. e D% q5 B5 u4 X" {
- crc_value <<= 1;
) J9 @+ ^6 ?" n, u - }* _1 W# M7 d. ^5 H( @( l. t
- if (pbuf[i] & xbit)/ L" j$ x# P5 N# w0 B$ V
- { W/ Z, V1 ~4 N5 g% l
- crc_value ^= st_const_value;+ A0 H! X+ b% \; ^1 f' h, ~ m
- }
) Y8 X f+ M# Z! s - xbit >>= 1;/ p4 b4 T# U8 ?! e. n
- }- m* M! Q4 S$ Y, H: [8 {
- }4 G( o0 e. \/ o2 W& P& n
- return crc_value;
4 x0 c5 p6 V: K% g% d! [) w, { - }
5 h3 b6 c( n6 K$ `
复制代码 5 X& l. v; n S% g7 M% f" j6 r
1 b: h- r% ?7 z( d7 _5 @总结其它平台与STM32通信时,如果用到CRC值,可以通过这种软件计算与STM32的CRC保持一致。
3 [8 P) D$ j" T- b l |