// 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. Linux - ssh 连接慢解决

    解决 ssh 链接慢 sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config sed -i ...

  2. (AC自动机)C - 病毒侵袭持续中

    题目链接:https://cn.vjudge.net/contest/280743#problem/C 题目大意:中文题 具体思路:首先取ascii码0-130是肯定不行的了,会超时.然后就开始简化, ...

  3. ipython的%matplotlib inline如何改写在Python

    ipython notebook中有一个相当方便的语句: %matplotlib inline,可以实现运行cell即出现结果图像.但是如果想写在Python程序内,貌似直接%matplotlib i ...

  4. linux笔记_day09

    1.运算器.控制器.存储器.输入输出(IO) 地址总线:内存寻址 数据总线:传输数据 控制总线:控制指令 寄存器:cpu暂时存储器 2.系统设定 默认输出设备:标准输出,STDOUT,1(描述符)(显 ...

  5. va_start(),va_end()函数应用【转】

    转自:http://www.cnblogs.com/gogly/articles/2416833.html 原理解释: VA_LIST 是在C语言中解决变参问题的一组宏,在<stdarg.h&g ...

  6. linux驱动---等待队列、工作队列、Tasklets【转】

    转自:https://blog.csdn.net/ezimu/article/details/54851148 概述: 等待队列.工作队列.Tasklet都是linux驱动很重要的API,下面主要从用 ...

  7. 使用maven命令终端构建一个web项目及发布该项目

    构建环境: maven版本:3.3.9 系统平台:Windows7 x64 JDK版本:1.7 构建步骤: 1.打开maven安装目录,在地址栏输入cmd进入命令窗口 2.输入命令mvn archet ...

  8. 不将EF连接字符串写在配置文件的方法

    edmx的构造函数: public DecorationMSEntities() : base(myConfig.DataBaseConnectionString, "DecorationM ...

  9. eclipse中 EAR Libraries 是什么?

    eclipse中 EAR Libraries 是 开发EJB工程所需的库包. 由于新建web工程时,eclipse并不能智能化的判断是否该项目以后会用到ejb, 所以为了全面考虑 就已经帮用户导入了E ...

  10. Android方法引用数超过65535优雅解决

    随着应用不断迭代更新,业务线的扩展,应用越来越大(比如:集成了各种第三方SDK或者公共开源的Library文件.jar文件)这样一来,项目耦合性就很高,重复作用的类就越来越多了,SO:问题就来了.相信 ...