STM32的CRC32 测试代码
// STM32 CRC32 Test App - sourcer32@gmail.com #include <windows.h> #include <stdio.h> DWORD Crc32( DWORD Crc, DWORD Data ) { int i; Crc = Crc ^ Data; for ( i = 0; i < 32; i++ ) if ( Crc & 0x80000000 ) Crc = ( Crc << 1 ) ^ 0x04C11DB7; // Polynomial used in STM32 else Crc = ( Crc << 1 ); return ( Crc ); } DWORD Crc32Fast( DWORD Crc, DWORD Data ) { static const DWORD CrcTable[ 16 ] = { // Nibble lookup table for 0x04C11DB7 polynomial 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD }; Crc = Crc ^ Data; // Apply all 32-bits // Process 32-bits, 4 at a time, or 8 rounds Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; // Assumes 32-bit reg, masking index to 4-bits Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; // 0x04C11DB7 Polynomial used in STM32 Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; return ( Crc ); } void test( void ) { BYTE vector[ 12 ] = { 0x02, 0x07, 0x02, 0x00, 0x18, 0x8A, 0xD0, 0x23, 0x25, 0x2B, 0x09, 0x00 }; DWORD Crc; int i; for ( i = 0; i < 12; i++ ) printf( "%02X ", vector[ i ] ); putchar( '\n' ); Crc = 0xFFFFFFFF; // Initial state for ( i = 0; i < 12; i += 4 ) { Crc = Crc32Fast( Crc, *( (DWORD *) &vector[ i ] ) ); // 4-bytes at a time } printf( "%08X test\n", Crc ); } int main( int argc, char **argv ) { printf( "%08X\n\n", Crc32( 0xFFFFFFFF, 0x12345678 ) ); // 0xDF8A8A2B printf( "%08X\n\n", Crc32Fast( 0xFFFFFFFF, 0x12345678 ) ); // 0xDF8A8A2B test( ); return ( 1 ); }
// STM32 CRC32 Test App - sourcer32@gmail.com #include <windows.h> #include <stdio.h> #include <stdlib.h> //**************************************************************************** DWORD Crc32( DWORD Crc, DWORD Data ) { int i; Crc = Crc ^ Data; for ( i = 0; i < 32; i++ ) if ( Crc & 0x80000000 ) Crc = ( Crc << 1 ) ^ 0x04C11DB7; // Polynomial used in STM32 else Crc = ( Crc << 1 ); return ( Crc ); } //**************************************************************************** DWORD Crc32Block( DWORD Crc, DWORD Size, DWORD *Buffer ) // 32-bit units { while ( Size-- ) Crc = Crc32( Crc, *Buffer++ ); return ( Crc ); } //**************************************************************************** DWORD Crc32Fast( DWORD Crc, DWORD Data ) { static const DWORD CrcTable[ 16 ] = { // Nibble lookup table for 0x04C11DB7 polynomial 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD }; Crc = Crc ^ Data; // Apply all 32-bits // Process 32-bits, 4 at a time, or 8 rounds Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; // Assumes 32-bit reg, masking index to 4-bits Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; // 0x04C11DB7 Polynomial used in STM32 Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; Crc = ( Crc << 4 ) ^ CrcTable[ Crc >> 28 ]; return ( Crc ); } //**************************************************************************** DWORD Crc32FastBlock( DWORD Crc, DWORD Size, DWORD *Buffer ) // 32-bit units { while ( Size-- ) Crc = Crc32Fast( Crc, *Buffer++ ); return ( Crc ); } //**************************************************************************** void test( void ) { BYTE vector[ 12 ] = { 0x02, 0x07, 0x02, 0x00, 0x18, 0x8A, 0xD0, 0x23, 0x25, 0x2B, 0x09, 0x00 }; // ACD7E298 DWORD Crc; int i; for ( i = 0; i < sizeof( vector ); i++ ) printf( "%02X ", vector[ i ] ); putchar( '\n' ); Crc = 0xFFFFFFFF; // Initial state for ( i = 0; i < sizeof( vector ); i += 4 ) { Crc = Crc32Fast( Crc, *( (DWORD *) &vector[ i ] ) ); // 4-bytes at a time } printf( "%08X %08X test\n", Crc, Crc32FastBlock( 0xFFFFFFFF, sizeof( vector ) / 4, (void *) vector ) ); } //**************************************************************************** void TestFile( char *Filename ) { FILE *f; DWORD Size; BYTE *Buffer; f = fopen( Filename, "rb" ); if ( f ) { fseek( f, 0, SEEK_END ); Size = ftell( f ); fseek( f, 0, SEEK_SET ); if ( Size & 3 ) printf( "WARNING: File must be multiple of 4 bytes (32-bit) for valid results\n" ); Buffer = malloc( Size ); fread( Buffer, Size, 1, f ); fclose( f ); printf( "crc=%08X Slow\n", Crc32Block( 0xFFFFFFFF, Size >> 2, (void *) Buffer ) ); printf( "crc=%08X Fast\n", Crc32FastBlock( 0xFFFFFFFF, Size >> 2, (void *) Buffer ) ); free( Buffer ); } else printf( "ERROR: Unable to open file '%s'\n", Filename ); } //**************************************************************************** int main( int argc, char **argv ) { printf( "STM32CRC Test\n\nUsage: STM32CRC [<file>]\n\n" ); if ( ( Crc32( 0xFFFFFFFF, 0x12345678 ) != 0xDF8A8A2B ) || ( Crc32Fast( 0xFFFFFFFF, 0x12345678 ) != 0xDF8A8A2B ) ) { printf( "ERROR: Internal Sanity Check Failed\n" ); } if ( argc > 1 ) TestFile( argv[ 1 ] ); else test( ); return ( 1 ); } //****************************************************************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2013-06-27 磁盘相关概念以及知识