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