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