- /*
" h" R5 {* y2 y% B8 o# a0 k
) D' n1 }3 V( E. R4 @7 ^- The CRC calculation unit mainly consists of a single 32-bit data register, which:, g1 K" f2 T# \! J1 l# t
- is used as an input register to enter new data in the CRC calculator+ U) L, @( O3 j; F9 A d% C5 E
- (when writing into the register) holds the result of the previous CRC calculation
k( P* k9 @9 b+ Q" [- h) ^ - (when reading the register)
: l8 Y" k% A1 S5 m+ q- W- V |* _
3 h+ n* v- c+ [* o; i/ O" k; s* T& Z- Each write operation into the data register creates a combination of4 `5 Y7 T, S; Y3 n) K
- the previous CRC value and the new one t4 a2 [% B5 ` K# j2 e2 @
- (CRC computation is done on the whole 32-bit data word, and not byte per byte).% O ]* q3 F2 ]1 O0 b
- ; B: x; n3 d* C
- The CPU is stalled during the computation, thus allowing back-to-back write accesses or
" K8 o, ^" b1 |; b - consecutive write and read accesses, without having to insert software wait cycles.9 f' i/ C! h, X) x0 i1 ^
- The CRC calculator can be reset to FFFF FFFFh with the RESET control bit in the CRC_CR register.
0 ~4 y; C% b/ m3 y' J, V+ B - This operation does not affect the contents of the CRC_IDR register
. c" S% S$ f J8 c( N. r: T - POLY_USED_IN_STM32 0x04C11DB7
9 U' ~/ K4 R2 D* a1 K! \8 r - #define CRC_INITIALVALUE 0xFFFFFFFF
, r6 m9 c2 J6 I% X, R- ? - 1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); /* Enable CRC clock */
" p" A: {4 {4 {% ^ - 2.1 _8 n: q3 g: {) `# t4 z, X% q
- // 00 01 02 03 --> 0x03020100
: r) D, Y" g4 ]6 \& X) S8 Z, e - // 00 01 02 03 04 --> 0x03020100, 0x04000000* v$ O$ V% m$ ?. Z1 R- q
- // 00 01 02 03 04 05 --> 0x03020100, 0x05040000" q/ a3 A' B+ T5 V3 E. e( \ B
- // 00 01 02 03 04 05 06 --> 0x03020100, 0x06050400, R ?/ j& v/ M1 R' O1 X
- //
. g, C* Q3 L+ d* t* K, u/ O - uint32_t stm32_hw_crc32(uint32_t crc32, uint8_t pBuffer[], uint32_t NumOfByte)' E9 O3 Z$ k9 Y
- {- T: q7 u* b5 c e# g' u
- uint32_t last_data;- x5 Y! u4 s3 _* i
- uint32_t NumOfDWord = NumOfByte>>2;
2 D1 s7 f0 S( E V3 ^2 R. d - uint32_t NumOfTailByte = NumOfByte & 3 ;% d4 _4 K/ H& H2 H
! g6 m: ^- N, r- CRC_ResetDR();
) R) ]1 }2 @: d# c8 H3 l - crc32 = CRC_CalcBlockCRC( (uint32_t *)pBuffer, NumOfDWord );
9 }: E, m1 f. c# D" F - + T1 V: j% W6 k) a# l# |
- switch ( NumOfTailByte )- O/ ?; T( p# K( e" u3 }9 M
- {, }) e. u4 O/ C" {( o6 _5 S% ^" y3 N
- case 0:
; O _% F9 Y2 h. f! t - return crc32;
2 t4 O# S5 U( J, ?/ Z" i - case 1:
0 ]8 Q3 B% O, R9 | - last_data = pBuffer[NumOfByte-1] << 24; U5 k. S! _7 V( i- m3 I
- break;
; Z% U/ ]* {3 V% n& S+ b/ ~ - case 2:
% G, C z4 s" v1 Q3 L& C8 m$ n - last_data = *( (uint16_t *)(&pBuffer[NumOfByte-2]) );' z8 K8 f' h+ r7 @
- last_data <<= 16;
& b( r* u( g) Z0 b7 [" Z6 U - break;
; A, F) p% Y# z2 Q j - case 3:
c7 L6 ?% G( `, h- f' y - last_data = *( (uint16_t *)(&pBuffer[NumOfByte-3]) );/ B; Z J. {4 I" J2 [- l
- last_data <<= 8;
0 r& o6 }/ F, q! N - last_data += pBuffer[NumOfByte-1]<<24;
+ I+ X: Y3 B+ z7 ~3 W - break;
' U( H0 ~6 ~; b0 Q - }- V. u9 I: ]6 H2 M
- return CRC_CalcCRC( last_data );
0 q, @* }! H' R! s( C1 w - }* s% t8 W) A& c7 ~7 A& M
- ' a& B8 ?# K; G' G2 N
! o4 {. B, s# [" H1 }- + [) E( s7 I r) B
- uint32_t stm32_sw_crc32_by_bit(uint32_t crc32, uint8_t pBuffer[], uint32_t NumOfByte)
( v& Q. a* E: h" ~. } - {
, f( Y4 B1 C# r2 g - uint32_t last_data;
/ ^/ `5 j3 h# X2 [6 w/ B- z - uint32_t NumOfDWord = NumOfByte>>2;
, L' z3 H" s: R7 P+ E - uint32_t NumOfTailByte = NumOfByte & 3 ;7 y, w1 ]+ O$ k3 c- w% Q
- * S/ L% C B$ |1 p+ u( i. T
- while(NumOfDWord--)+ X0 k6 V1 L8 N! A6 x) q5 Z I& a/ l
- {
, U+ X9 `' t: \) c$ L - crc32 = crc32 ^ *((unsigned long *)pBuffer);
( n" S% o/ i! a m - pBuffer += 4;
) Z" B) D0 Y' H9 J - # w/ z. L& n! ?$ `2 h
- for(int i=0; i<32; i++)
8 t- h" g; ^) C% V' a M - {
+ l o4 |% b# C. i/ V0 [. s* V8 Z: C - if (crc32 & 0x80000000)
0 T. O/ ?; C1 P+ d2 d5 q - crc32 = (crc32 << 1) ^ POLY_USED_IN_STM32;
7 h5 n5 G: h2 x; H0 m9 J) I3 m - else% S' @! J' T7 H8 Q
- crc32 = (crc32 << 1);2 S# ^+ g" b) ?: ]
- }6 h9 m* {! y# o+ U
- }
8 p5 e1 k9 G) G: f5 N; |9 `7 J - 9 Y/ L+ N" h$ r" x' G6 F
- switch ( NumOfTailByte )
% V* {% S* r h/ P; L - {# F( _. R0 p. o' P4 R
- case 0:2 W2 h6 v, \/ D0 l4 w
- return crc32; / _, C4 Z' z. R3 M% I1 k* a* V5 g
- case 1:
- M, ?1 R7 N9 w/ v) V7 x - last_data = pBuffer[0] << 24;
- E! g5 h# B1 g. S6 T0 W3 _ - break;) [. }5 f2 c6 q
- case 2: R1 t [% H0 \; r/ X. U$ v5 j
- last_data = *( (uint16_t *)(&pBuffer[0]) );
- i" j0 z2 v4 B- h- R - last_data <<= 16;
# i& f% I! [9 N( t5 a6 n* p. k% y1 E - 0 G9 @ g+ u' T8 _
- break;9 k- p2 `0 Y9 L5 q3 w: f
- case 3:
T) V4 C1 y3 D% |+ e2 G1 h - last_data = *( (uint16_t *)(&pBuffer[0]) );
' C! z1 @- W/ {8 }& T - last_data <<= 8;' T1 i3 A6 k! Y
- last_data += pBuffer[2]<<24;: g0 J. a# O, e/ `+ t9 }# Q
- break;
& E: _7 Z8 y, A( x- R - }
0 _0 W) v+ J; `$ E, G5 S - crc32 = stm32_sw_crc32_by_bit( crc32, (uint8_t *)&last_data, 4);
\, e( }% o; ^, X, [$ t( m9 ` - return crc32;
, \, a$ {1 @1 @' O, M - }1 b- \ p3 j. ]; W; L) U
5 T' R' `! B9 Y2 h/ M- % s6 ?6 u7 K% t& l2 z: n
- // Nibble lookup table for 0x04C11DB7 polynomial
6 Y$ w6 W2 \7 L* M0 L6 I - const unsigned long sw_crc32_by_nibble_table[16] = {& M/ @7 I; N3 K( o
- 0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,
+ }/ X' b3 Y2 z4 ^" y - 0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
% }7 ]3 ?. Q @ - 0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,
4 N/ {* \2 j. H0 u9 T - 0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD; {+ z$ ^: V2 c# @
- };+ O6 k: p% D: J5 \& N/ o0 Z
- 7 ]( o: a/ _/ R4 s0 ]- e
- uint32_t stm32_sw_crc32_by_nibble(uint32_t crc32, uint8_t pBuffer[], uint32_t NumOfByte)
; _$ X' m' v' H: u- A. U3 g - {: V$ d( M8 z2 |1 m# j$ a
- uint32_t last_data;
: C u" T( o# k1 S" t; k" { - uint32_t NumOfDWord = NumOfByte>>2;8 A$ L4 m$ Q& z1 H
- uint32_t NumOfTailByte = NumOfByte & 3 ;3 ^8 T4 Q3 c" F$ l- r
- . [/ q% u% R' E' ^+ N8 N
- while(NumOfDWord--)% A( } e6 R: m
- {0 p9 s" E9 f3 _1 e2 ]5 O$ C
- crc32 = crc32 ^ *((unsigned long *)pBuffer);
1 W. y% ~% H2 z; A; i) b - pBuffer += 4;
' z, ]$ j: q6 ]# `- f5 e - crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];6 F, J4 Q: |: v# K
- crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];: W4 ?7 i$ @ d5 P# q: |
- crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];
# w' Q4 a* c" C - crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];+ ` W. L* h/ H' v9 `2 @! X3 z( m
- crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];& x' o8 R3 j3 m5 ]
- crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];0 X" I+ r3 b) ^* c: o+ [/ H' V
- crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];
% ?# \! h; y/ d% s. m$ D* V5 ~ - crc32 = (crc32 << 4) ^ sw_crc32_by_nibble_table[crc32 >> 28];
9 h& t5 K% S/ b# r6 p" f - }+ W* @ p; X; Y" M5 a2 E
-
g+ U0 k+ i! v - switch ( NumOfTailByte )
; E' N! Q3 P4 |9 V - {
- e2 z0 J, I0 _5 _- W8 F - case 0:
Y6 o: b; M- I1 a - return crc32; " a( j! V) Q) Y$ e9 d8 D9 [4 e
- case 1:. R) }( S. N2 |6 ]: \1 Q3 V
- last_data = pBuffer[0] << 24;
' L/ r9 E# Z+ e: \! J4 Z0 T( O - break;
0 @& D, r$ N6 u: f: L# p& } - case 2:
. t! s1 V, u3 N- ^2 K P5 x - last_data = *( (uint16_t *)(&pBuffer[0]) );
6 ?* B) \- w, v7 r - last_data <<= 16;
4 Z; Z8 R3 ^( N, c -
$ M/ \% G7 ~6 m; N) I( R2 n - break;4 P9 i. [9 G( g Z3 o! m# I/ o
- case 3:
( r5 W1 M, I# g% E: S. S* k - last_data = *( (uint16_t *)(&pBuffer[0]) );
. i9 V( u9 W& s# u - last_data <<= 8;6 G! C4 E: u4 g; N7 v8 a! N
- last_data += pBuffer[2]<<24;
: u' r& ~7 E& t9 [! Z( t; }0 O! k# j - break;1 S' a; {: ?; b/ L; j6 ^: }
- }* e* z9 x( U( ~2 N7 w" x5 s! F2 y
- crc32 = stm32_sw_crc32_by_nibble( crc32, (uint8_t *)&last_data, 4);
" Z7 r- J% u) R, E - return crc32;- F+ P& U! V% J [: P+ i
- }
# P+ `1 G3 ]* V1 `) [& l - 0 v3 K" R3 m8 I) J S% f+ r
- unsigned long sw_crc32_by_byte_table[256] =$ C$ B. B/ p! R$ q- v" t* g, A
- {
' O+ s3 J# w" G - 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, // 0..3- [! `0 ?; C* P8 T# z, C
- 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, // 4..7
% v5 v# ^; {* N, ~; y - 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, // 8..B; L8 j4 B9 p2 {4 l7 Z
- 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, // C..F
; ]1 h: e7 t* b/ K8 Z2 G: ? -
, I9 Z5 |& i0 r4 \" U& r: m - 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
5 ~/ A X; l1 l! p - 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,# Y% p) B' }4 m, l4 ?$ H
- 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
3 ?9 D) \" m9 b - 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
. @8 y- D) K% X* y& i$ b: J" [% \ - 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,4 f8 h: K6 b' E$ ?7 R- P
- 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
* [% s+ a9 O+ B9 x" A - 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
) c9 f8 L6 F1 a8 K$ D - 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,+ E/ r! ^& k1 H( a& D
- 0xd4326d90, 0xd0f37027, 0**b056fe, 0xd9714b49,
$ O2 n1 v% r4 {; l# _* ~ - 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
/ m% v" j1 Y- s" S( b5 u. J - 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
4 ]' H% z- B/ [ - 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,8 L& p& w, H: c( m5 q ?
- 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
+ h5 \8 P3 G- b( k8 _1 O# {5 O - 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
" v' }% W$ \, ` - 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,% R3 L6 \% v) W) P0 ^
- 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,- J' u. D( f$ F0 O* L3 U
- 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
2 O3 E8 Y- U9 X - 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02," Z) e# K! B4 ~
- 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,! S) v) j! p0 [( o' i+ ~
- 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,4 g1 X: F/ H7 D
- 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
2 G- I7 T: { W, o7 K; q - 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
e. r0 q/ A! g/ V' n3 x0 E - 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
# H B) X/ j! h2 A% h - 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
( E/ V) Y3 l4 i; Y) } - 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
) g. o' q% P2 d& D+ m - 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+ D6 B% a2 L) o \( ` - 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
3 e( x$ g' C l1 ~ v# I& T - 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
& O( H. B4 ?1 O' z - 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
, x9 e8 o- q1 q; I - 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
3 m* y4 V$ G9 R/ a! i' } - 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,1 A0 J9 h: Y" t9 {/ f
- 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,& y% D ^: c; V8 l
- 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,/ c8 {6 q3 K" L. W8 Y
- 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,& j" C0 U% M& `* B
- 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
1 W" j0 k0 K% { - 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
0 F/ s- B) \/ `3 m' l' F - 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,+ b6 P$ w/ W. H# f2 L( S l8 c5 W
- 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
2 a; w& M9 C' q* L( h" }# ` - 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
0 v: X& n/ u7 `" _8 y7 a! f9 r; W - 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
. r, c0 s( ? r, q - 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,% d9 l! h; r& ]8 ^0 P( [
- 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
( [0 y/ E: m2 c. A6 L - 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,; M$ e$ _5 C: O+ E$ k) s
- 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,( Z& |7 a( |/ q# q9 c/ e
- 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,8 ?5 _/ Y' w! O+ k* L4 Q
- 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
# i( e, S; z9 E! i* B9 Z - 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,- ? h% l$ A, X) [& H
- 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,; g- k7 m) |$ S+ ?( j
- 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
W$ f8 I! U7 ^, L6 S N5 x- ] - 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,4 u6 A8 W- @6 Q% X
- 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
0 ?' W1 _9 M q8 W& V, E9 w F - 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
& o& T8 U) t: X - 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,7 X6 N; E( g# H) V0 t
- 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
% l4 A* i; u x! a$ [ - 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,+ s x- v+ \7 P4 \2 c9 O
- 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
w% o$ |$ }; v6 d - 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,# T0 P# ` @6 N
- 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c," h* c y- D( A% n- C
- 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668," n3 q7 A2 B( V O% D$ W
- 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4, O! L& a! r, Y* Q+ Z4 ~
- };
8 T+ m0 w/ ~9 P0 t, y6 v* j - uint32_t stm32_sw_crc32_by_byte(uint32_t crc32, uint8_t pBuffer[], uint32_t NumOfByte)
N+ Y( U g$ q" A - {3 `8 A" H1 w) R. _" t
- uint32_t last_data;
" z/ i8 T/ @" C8 P$ t# A* w - uint32_t NumOfDWord = NumOfByte>>2;
: b: }8 m2 ^. A# F: I/ s9 G - uint32_t NumOfTailByte = NumOfByte & 3 ;
' w o& m7 S- G& M0 l - , p9 z! L5 f+ x# q
- while(NumOfDWord--)
, @- c3 A8 {$ u" J/ a9 ?, z% ^% d - {
% j/ Y, q* Y( @( s# t - crc32 = crc32 ^ *((unsigned long *)pBuffer);
. C- r3 ^; H! {- V7 k - pBuffer += 4;: W8 ~" n) W; N" C' \
- crc32 = (crc32 << 8) ^ sw_crc32_by_byte_table[crc32 >> 24];9 u4 c! M9 E' M6 t! P& a
- crc32 = (crc32 << 8) ^ sw_crc32_by_byte_table[crc32 >> 24];
3 K/ @2 K/ c2 S! V; A - crc32 = (crc32 << 8) ^ sw_crc32_by_byte_table[crc32 >> 24];" e+ D/ }3 c/ G9 K
- crc32 = (crc32 << 8) ^ sw_crc32_by_byte_table[crc32 >> 24];
$ V2 P9 n( i" H+ }/ {3 F( Z - }
# Q- `9 P: v: ?5 ^1 u - , K" [( L; }. Q; {3 _
- switch ( NumOfTailByte )- ]7 _% @4 l- U- {
- {% V: G# O/ Z0 V4 f* F
- case 0:
% d# u, H8 m# [2 B% k% s' B - return crc32;
0 f2 Z! d7 L; p" L) C - case 1:. _& J7 r" h8 b$ l! P1 r
- last_data = pBuffer[0] << 24;
' A3 G6 o! k% a4 [' w - break;
+ \" y9 j! L! Z$ h5 o) p+ f! Z* b - case 2:7 ^% a2 r$ j/ W9 m- R, ]
- last_data = *( (uint16_t *)(&pBuffer[0]) );/ Z4 V: v% I0 D0 f ?
- last_data <<= 16;' S6 T+ S& _. K
- ; g4 [: y* P* C3 m
- break;
) H9 Z( W8 r4 _( [ - case 3:2 h; ~- e7 v. X8 r5 Y/ j6 H
- last_data = *( (uint16_t *)(&pBuffer[0]) );
9 k( g, p9 ?; } e$ H - last_data <<= 8;3 Y. ]' |! D$ c/ V1 v: y
- last_data += pBuffer[2]<<24;
' r3 Z9 H6 @7 E1 W. c1 _ - break;" L, R' V8 `% q8 Z7 c/ p# {
- }) ]" h) G+ d( z9 T
- crc32 = stm32_sw_crc32_by_byte( crc32, (uint8_t *)&last_data, 4);9 y/ H+ G- u( V' s' a4 D
- return crc32;' e3 v' }! J/ K9 T: K! A* H
- }
复制代码- unit uCRC32;
" J% k) F/ {! u4 h2 K3 n! k - interface
% p. Z* X5 W( l" X; s, b5 A* {; g - uses1 k3 h. e" L0 s3 S
- Windows;% D6 P5 @- w, {' }: s( |
- function stm32_sw_crc32_by_byte(crc32 : DWORD;
, @5 d# t1 i3 O/ o0 ^ - pBuffer : pbyte; NumOfByte : DWORD) : DWORD;+ F* R; [. |4 z8 T4 _3 I& {
- function uCrc32_Demo : DWORD;; F4 S+ v4 b2 P7 c
- implementation) m N* {" K% G2 \
- const
1 g$ }4 G( A2 \; [! n( q - sw_crc32_by_byte_table : array[0..255] of DWORD =
! G) P- i8 F% B! j% f1 v) y7 y/ G - (/ c( Y) |; m8 E& h, I
- $00000000, $04c11db7, $09823b6e, $0d4326d9, // 0..3
" j0 W4 H9 l8 I B$ B. { - $130476dc, $17c56b6b, $1a864db2, $1e475005, // 4..7. ]6 d: `% l4 i; J4 N+ U+ V
- $2608edb8, $22c9f00f, $2f8ad6d6, $2b4bcb61, // 8..B
3 X3 }, Y9 {, x" z - $350c9b64, $31cd86d3, $3c8ea00a, $384fbdbd, // C..F
3 o, ~4 ^+ N8 E# X3 o - $4c11db70, $48d0c6c7, $4593e01e, $4152fda9, A1 F; p/ @& A+ o2 f3 W, p/ j& \8 q
- $5f15adac, $5bd4b01b, $569796c2, $52568b75,
4 Y; s/ ^& D! B! `! } - $6a1936c8, $6ed82b7f, $639b0da6, $675a1011,
* t# s" i2 }6 T& ~5 G! W( @ - $791d4014, $7ddc5da3, $709f7b7a, $745e66cd,9 O. |8 Z# ]* r/ m" r7 n2 W* N) i
- $9823b6e0, $9ce2ab57, $91a18d8e, $95609039,8 y" X: X( I) k$ j: `) a
- $8b27c03c, $8fe6dd8b, $82a5fb52, $8664e6e5,
5 T% [# }5 Q& c2 r. E6 G - $be2b5b58, $baea46ef, $b7a96036, $b3687d81,( ^) B( q' x+ S7 t4 G* @
- $ad2f2d84, $a9ee3033, $a4ad16ea, $a06c0b5d,
5 X/ W. z' i z- w; u - $d4326d90, $d0f37027, $ddb056fe, $d9714b49,( X. Z( m! P6 t l' z7 l
- $c7361b4c, $c3f706fb, $ceb42022, $ca753d95,
) R7 n i: z+ v - $f23a8028, $f6fb9d9f, $fbb8bb46, $ff79a6f1,
9 Q3 K! @# M8 ? - $e13ef6f4, $e5ffeb43, $e8bccd9a, $ec7dd02d,
. _* @( }+ \" c) P3 I: V7 ^ - $34867077, $30476dc0, $3d044b19, $39c556ae,* \& x: `, g* ^% @2 y; x5 T# S' n
- $278206ab, $23431b1c, $2e003dc5, $2ac12072,5 E* c% R6 a8 v
- $128e9dcf, $164f8078, $1b0ca6a1, $1fcdbb16,( S9 h* u, G/ y8 i9 ~* f8 z
- $018aeb13, $054bf6a4, $0808d07d, $0cc9cdca,& _0 Z9 a7 x9 [) E* j: Y
- $7897ab07, $7c56b6b0, $71159069, $75d48dde,
$ n) }: C& X: G) u# R& {* o - $6b93dddb, $6f52c06c, $6211e6b5, $66d0fb02,
% x' [2 v+ ?7 w# ` k# h5 C - $5e9f46bf, $5a5e5b08, $571d7dd1, $53dc6066,
, b$ ?" H( p0 q - $4d9b3063, $495a2dd4, $44190b0d, $40d816ba,
! [ n/ E* b, f5 g - $aca5c697, $a864db20, $a527fdf9, $a1e6e04e,
, j5 ~6 \6 }$ T2 M$ x, f- e3 k! A4 A. l - $bfa1b04b, $bb60adfc, $b6238b25, $b2e29692,; G7 B. s; n- ^- Y$ ~
- $8aad2b2f, $8e6c3698, $832f1041, $87ee0df6,
* r4 s$ k1 J% h& G/ a - $99a95df3, $9d684044, $902b669d, $94ea7b2a,+ y9 ~. J& V H- \: f9 H
- $e0b41de7, $e4750050, $e9362689, $edf73b3e,' S, E8 o7 p l
- $f3b06b3b, $f771768c, $fa325055, $fef34de2,
D- s' ]& c! H4 ]; G% f; i9 K - $c6bcf05f, $c27dede8, $cf3ecb31, $cbffd686,+ K( a/ X+ ^ x5 ^
- $d5b88683, $d1799b34, $dc3abded, $d8fba05a,
: x" E) w- t! e; Q - $690ce0ee, $6dcdfd59, $608edb80, $644fc637,
0 ?* \- }. p# U; C9 g" E - $7a089632, $7ec98b85, $738aad5c, $774bb0eb,( ?% v3 G% F2 ~/ G5 k
- $4f040d56, $4bc510e1, $46863638, $42472b8f,
! P/ V" g- s% P! \ - $5c007b8a, $58c1663d, $558240e4, $51435d53,
* J5 k3 b5 n4 Q, T [! O. O - $251d3b9e, $21dc2629, $2c9f00f0, $285e1d47,$ B, V9 \$ Y' P
- $36194d42, $32d850f5, $3f9b762c, $3b5a6b9b,1 |; p! S$ M2 r( @! k% {3 w9 U
- $0315d626, $07d4cb91, $0a97ed48, $0e56f0ff,# K5 h" w9 `+ `, d$ c3 W! p
- $1011a0fa, $14d0bd4d, $19939b94, $1d528623,6 D8 X6 W7 T4 q
- $f12f560e, $f5ee4bb9, $f8ad6d60, $fc6c70d7,
; ?/ r, A- J! _( T8 b, I& Y( Z - $e22b20d2, $e6ea3d65, $eba91bbc, $ef68060b,
) @# I2 v+ v% a' v M8 ~& ^3 l - $d727bbb6, $d3e6a601, $dea580d8, $da649d6f,
2 q, j2 p1 J6 |2 N- y - $c423cd6a, $c0e2d0dd, $cda1f604, $c960ebb3,
0 Y& T& ^5 \ K3 l- d - $bd3e8d7e, $b9ff90c9, $b4bcb610, $b07daba7,
" P: P. [7 F r, j - $ae3afba2, $aafbe615, $a7b8c0cc, $a379dd7b,
X/ k" X) r) l+ s8 j* u! u - $9b3660c6, $9ff77d71, $92b45ba8, $9675461f,
- U$ U5 X6 G, y0 V% d - $8832161a, $8cf30bad, $81b02d74, $857130c3,+ t L; x8 t2 E. Y" o
- $5d8a9099, $594b8d2e, $5408abf7, $50c9b640,* h. o _0 G3 q; B5 M
- $4e8ee645, $4a4ffbf2, $470cdd2b, $43cdc09c,9 Z. O& O% I8 z( }: x+ j6 ^1 Z
- $7b827d21, $7f436096, $7200464f, $76c15bf8,4 Q R8 s8 ^$ H- h1 M$ l Q6 J5 d
- $68860bfd, $6c47164a, $61043093, $65c52d24,6 ^' O: c8 E6 ~ `) z$ U
- $119b4be9, $155a565e, $18197087, $1cd86d30, s; Z" V* X- f# v: y; ^
- $029f3d35, $065e2082, $0b1d065b, $0fdc1bec,
/ V# T# }" E/ ^ - $3793a651, $3352bbe6, $3e119d3f, $3ad08088,
4 m2 u2 P% m; Q1 Z- {! `7 R3 S - $2497d08d, $2056cd3a, $2d15ebe3, $29d4f654,: ^% h. l7 Y) G/ Y/ F
- $c5a92679, $c1683bce, $cc2b1d17, $c8ea00a0,: J P. Y3 ^, P u# Q& A8 N3 T
- $d6ad50a5, $d26c4d12, $df2f6bcb, $dbee767c,2 \5 X/ [# y/ ?* o0 @5 m5 F- X
- $e3a1cbc1, $e760d676, $ea23f0af, $eee2ed18,7 s; j) p: z- t
- $f0a5bd1d, $f464a0aa, $f9278673, $fde69bc4,
; J6 B4 O4 \3 X5 d3 ]+ e - $89b8fd09, $8d79e0be, $803ac667, $84fbdbd0,1 b4 E0 w% W4 `0 D6 [
- $9abc8bd5, $9e7d9662, $933eb0bb, $97ffad0c,
# a5 \- f; A; n6 ]+ E2 T - $afb010b1, $ab710d06, $a6322bdf, $a2f33668,3 e& M1 a2 s3 ]
- $bcb4666d, $b8757bda, $b5365d03, $b1f740b4
. |, \5 e5 B9 H2 N- J - );0 i7 f# E9 t3 x( x& h% G3 E) E% n+ Z
- // 00 01 02 03 --> 0x03020100
7 ~) ^$ v0 p" k - // 00 01 02 03 04 --> 0x03020100, 0x04000000# ]5 I6 Y& E- y$ D! b' K" o
- // 00 01 02 03 04 05 --> 0x03020100, 0x050400008 I+ f* S, x; O- m
- // 00 01 02 03 04 05 06 --> 0x03020100, 0x06050400% @6 T5 F0 Y3 {. |
- //
: T& E% U8 I, W9 t& K - function stm32_sw_crc32_by_byte(crc32 : DWORD;
" m3 h6 q! l6 C# u6 g - pBuffer : pbyte; NumOfByte : DWORD) : DWORD;
: h' h$ P( X2 C$ j. Q+ y i1 a - var
! \: H; a; T- s - i : DWORD;5 S6 o4 v! |' W$ m
- last_data : array[0..3] of byte;
/ b6 H" C7 q' {" _ - NumOfDWord : DWORD;
6 K% Y1 [' ?) o# @2 T - NumOfTailByte : DWORD;2 d+ T& R5 U6 B8 c! [
- begin
# Y# e9 l- M- r- p( S" Z8 c4 ~ - NumOfDWord := NumOfByte shr 2;& g) K9 R6 G/ P
- NumOfTailByte := NumOfByte and 3 ;$ u7 J+ Y- x$ u% A: Y3 D# L6 y$ i
- for i := 0 to NumOfDWord-1 do
. X2 T% r6 c/ ?0 O* j2 O, t - begin
W! s3 Z0 b C" ?/ ]7 f - crc32 := crc32 xor ( PDWORD( pbuffer ) )^;
) \. o! C- G& x; v - Inc( pbuffer, 4);1 F. L) E8 {$ R& v- c2 m, \
- crc32 := (crc32 shl 8) xor sw_crc32_by_byte_table[crc32 shr 24];$ b4 r( x- s; I1 O
- crc32 := (crc32 shl 8) xor sw_crc32_by_byte_table[crc32 shr 24];% {- A [, v: q
- crc32 := (crc32 shl 8) xor sw_crc32_by_byte_table[crc32 shr 24];: G c9 ?, _: V- {0 n5 {
- crc32 := (crc32 shl 8) xor sw_crc32_by_byte_table[crc32 shr 24];) M* q* X" }7 w. j
- end;
5 m, K6 j0 o* d% o - if NumOfTailByte <> 0 then
; C9 }) @% b- {2 m - begin+ {6 _5 B: M' Y9 S q/ H: v2 D
- for i := 0 to 3 do( b/ o }; N0 ~. p' ^
- last_data[i] := 0;
* X3 @3 l% N/ J8 ?6 w& \ - if NumOfTailByte = 1 then. ^; m+ ~0 l4 L0 |8 v
- begin( p$ M, |' l, |5 E; A+ y8 y
- last_data[3] := pBuffer^;4 t4 `0 U( p. [# @. H8 B
- end
1 B: B% `+ ]% c; ?) r& N - else if NumOfTailByte = 2 then
* `: c% y, C' ]% h" V( Y6 ^ V - begin
* ~3 L5 J0 ] N$ g - last_data[2] := pBuffer^;8 M6 \" S; [+ P" E7 G: L$ Q- x
- Inc( pBuffer ); d) R- t! E; ^
- last_data[3] := pBuffer^;# W# v/ M- D5 D9 ^/ f5 M6 V
- end
! S3 U. e7 j! m Q - else. q8 a- \, f% W: ]3 A
- begin, j! n2 P) {* I
- last_data[1] := pBuffer^;' L$ i+ Z9 P5 w8 n2 L
- Inc( pBuffer );
k. ^& V0 U7 z- I) S9 @5 P - last_data[2] := pBuffer^;
1 w W- B5 K5 n2 u, E - Inc( pBuffer );
- ~/ o d2 u7 x' B - last_data[3] := pBuffer^;
0 h% L1 z/ Q0 k ^# G: } - end;+ s/ ]$ [. r+ _
- crc32 := stm32_sw_crc32_by_byte( crc32, @last_data, 4 );# g; w: j5 }- A2 K+ k
- end;* W/ a8 o. b- ?( J. W7 b
- result := crc32;/ S7 V% @& d7 z4 s5 l* q6 j
- end;/ O! o/ M( B/ X/ d: m
- function uCrc32_Demo : DWORD;
5 W' ^+ s2 j+ O& ~4 N: x' a - var
6 B7 |( Z, d; R - crc32 : DWORD;+ N7 l0 b6 P7 [7 U8 G0 B# G0 L8 h1 t! N
- buffer : array[0..3] of DWORD;
3 i/ n$ H+ @/ H( | - begin7 W8 H# Z- i' `
- buffer[0] := $12345678;
# U6 ` e/ v8 Y6 W4 ]0 P2 X) }( e* z - buffer[1] := $00000000;
2 [) ?& r, P* _9 |6 ]& w. m# Z/ F - buffer[2] := $12345678;2 \( Y* O' o" ~# M" C
- crc32 := stm32_sw_crc32_by_byte( $FFFFFFFF, @buffer, 12 );& V. C/ b8 y$ z6 g
- buffer[3] := crc32;
! O6 ?. S: X3 h* _6 c- o - crc32 := stm32_sw_crc32_by_byte( $FFFFFFFF, @buffer, 16 );
- I2 H( [7 c/ k) _. Z# h - result := crc32;
, W/ a- k+ J5 I/ ^. C# t$ ] - end;
复制代码 ! n! K. O9 Z7 u7 W# k- L
/ y7 S# o5 y0 p4 X
|