// 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 = ; i < ; i++ )
if ( Crc & 0x80000000 )
Crc = ( Crc << ) ^ 0x04C11DB7; // Polynomial used in STM32
else
Crc = ( Crc << ); return ( Crc );
} DWORD Crc32Fast( DWORD Crc, DWORD Data )
{
static const DWORD CrcTable[ ] =
{ // 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 << ) ^ CrcTable[ Crc >> ]; // Assumes 32-bit reg, masking index to 4-bits
Crc = ( Crc << ) ^ CrcTable[ Crc >> ]; // 0x04C11DB7 Polynomial used in STM32
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ]; return ( Crc );
} void test( void )
{
BYTE vector[ ] =
{
0x02, 0x07, 0x02, 0x00, 0x18, 0x8A, 0xD0, 0x23, 0x25, 0x2B, 0x09, 0x00 };
DWORD Crc;
int i; for ( i = ; i < ; i++ )
printf( "%02X ", vector[ i ] ); putchar( '\n' ); Crc = 0xFFFFFFFF; // Initial state for ( i = ; i < ; i += )
{
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 ( );
}
// 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 = ; i < ; i++ )
if ( Crc & 0x80000000 )
Crc = ( Crc << ) ^ 0x04C11DB7; // Polynomial used in STM32
else
Crc = ( Crc << ); 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[ ] =
{ // 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 << ) ^ CrcTable[ Crc >> ]; // Assumes 32-bit reg, masking index to 4-bits
Crc = ( Crc << ) ^ CrcTable[ Crc >> ]; // 0x04C11DB7 Polynomial used in STM32
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ];
Crc = ( Crc << ) ^ CrcTable[ Crc >> ]; 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[ ] =
{
0x02, 0x07, 0x02, 0x00, 0x18, 0x8A, 0xD0, 0x23, 0x25, 0x2B, 0x09, 0x00 }; // ACD7E298
DWORD Crc;
int i; for ( i = ; i < sizeof( vector ); i++ )
printf( "%02X ", vector[ i ] ); putchar( '\n' ); Crc = 0xFFFFFFFF; // Initial state for ( i = ; i < sizeof( vector ); i += )
{
Crc = Crc32Fast( Crc, *( (DWORD *) &vector[ i ] ) ); // 4-bytes at a time
} printf( "%08X %08X test\n", Crc,
Crc32FastBlock( 0xFFFFFFFF, sizeof( vector ) / , (void *) vector ) );
} //**************************************************************************** void TestFile( char *Filename )
{
FILE *f;
DWORD Size;
BYTE *Buffer; f = fopen( Filename, "rb" ); if ( f )
{
fseek( f, , SEEK_END ); Size = ftell( f ); fseek( f, , SEEK_SET ); if ( Size & )
printf(
"WARNING: File must be multiple of 4 bytes (32-bit) for valid results\n" ); Buffer = malloc( Size ); fread( Buffer, Size, , f ); fclose( f ); printf( "crc=%08X Slow\n",
Crc32Block( 0xFFFFFFFF, Size >> , (void *) Buffer ) ); printf( "crc=%08X Fast\n",
Crc32FastBlock( 0xFFFFFFFF, Size >> , (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 > )
TestFile( argv[ ] );
else
test( ); return ( );
} //****************************************************************************

STM32的CRC32 测试代码的更多相关文章

  1. STM32的CRC32 实现代码 -- Ether

    uint32_t reverse_32( uint32_t data ) { asm("rbit r0,r0"); return data; } ; uint32_t crc32_ ...

  2. STM32 IAP程序 源码 和测试代码 有详细的中文注释

    http://bbs.21ic.com/forum.php?mod=viewthread&tid=588265&reltid=624002&pre_pos=2&ext= ...

  3. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

  4. mysql锁 实战测试代码

    存储引擎 支持的锁定 MyISAM 表级锁 MEMORY 表级锁 InnoDB 行级锁 BDB 页面锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低.行级锁:开销 ...

  5. 使用Microsoft Fakes隔离测试代码

    在单元测试(Unit Test)中我们遇到的问题之一是:假如被测试组件(类或项目)为A,组件A依赖于组件B,那么在组件A的单元测试ATest中测试A时,也需要依赖于B,在B发生改动后,就可能影响到A的 ...

  6. iOS开发:XCTest单元测试(附上一个单例的测试代码)

    测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编 ...

  7. 在内核中异步请求设备固件firmware的测试代码

    在内核中异步请求设备固件firmware的测试代码 static void ghost_load_firmware_callback(const struct firmware *fw, void * ...

  8. x264测试代码

    建立一个工程,将头文件,库文件加载到工程,测试代码如下:#include <iostream>#include <string>#include "stdint.h& ...

  9. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

随机推荐

  1. object-c 数学计算公式

    1. 三角函数  double sin (double);正弦  double cos (double);余弦  double tan (double);正切  2 .反三角函数  double as ...

  2. [转]python ctypes 探究 ---- python 与 c 的交互

    近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...

  3. python中的*号

    from:https://www.douban.com/note/231603832/ 传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊 ...

  4. python3解析库pyquery

    pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语 ...

  5. js自定制周期函数

    function mySetInterval(fn, milliSec,count){ function interval(){ if(typeof count==='undefined'||coun ...

  6. MVC js动态生成from提交数据然后生成文件下载

    前台: 点击触发下面事件 var turnForm = document.createElement("form"); //一定要加入到body中!! document.body. ...

  7. 用Executors工具类创建线程池

    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 线程池主要用来解决线程生命周期开销问题和资源不足问题.通过对多个任务重用线程,线程创建 ...

  8. PHPStorm 配置本地服务器

    本篇教程为配置 PHPStorm 本地服务器,以方便程序调试. 本地服务器工具:XAMPP for windows 7.1.1-0 / Apache 2.4.25 ( Win32 ) / PHP 7. ...

  9. PHP使用某个键值对二维数组排序

    $arr=[ array( 'name'=>'A', 'age'=>28 ), array( 'name'=>'B', 'age'=>14 ), array( 'name'=& ...

  10. Zookeeper命令行zkCli.sh&zkServer.sh的使用(四)

    上篇博文,我们成功的安装和启动了zookeeper服务器,zookeeper还提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh).还 ...