STM32的CRC32 测试代码

// STM32 CRC32 Test App - [email protected]

#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 - [email protected]

#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 );
}

//****************************************************************************
时间: 2024-08-05 23:27:36

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

STM32的CRC32 实现代码 -- Ether

uint32_t reverse_32( uint32_t data ) { asm("rbit r0,r0"); return data; } ; uint32_t crc32_ether( char *buf, int len, int clear ) { uint32_t *p = (uint32_t*) buf; uint32_t crc, crc_reg; if ( clear ) CRC_ResetDR( ); while ( len >= 4 ) { crc_reg

测试代码

   编写函数或类时,还可以为其编写测试.通过测试,可确定代码面对各种输入都能够按照要求那样工作. 单元测试和测试用例:   单元测试用于核实蛮熟的某个方面没有问题:测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求. 良好的测试用例考虑到了函数可能收到的各种输入,包含针对这些所有情形的测试. 全覆盖测试用例包含一整套单元测试,涵盖了各种可能的函数使用方式.对于大型项目,要实现覆盖可能很难.所以通常,最初只要针对 代码的重要行为编写测试即可,等项目被广泛使用率再考虑全覆

第4次作业类测试代码+105032014166+张珍珍

第4次作业:准备类测试代码 类测试代码的具体要求如下: (1)设计三角形完整程序 已经完成的方法是:  String triangle(int a,int b,int c) 现在要求继续增加新的功能: 建立界面,至少包含以下元素,但不限于此: 完成面积的方法:float triangleArea(int a,int b,int c) ,完成周长的方法:int perimeter(int a,int b,int c) 要求: 1.        画出类图: 2.        完成界面和相应的功能

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

MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明文是yanzi1225627,得到MD5加密后的字符串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由后面一大串倒推出yanzi1225627.因此可以用来存储用户输入的密码在服务器上.现在下载文件校验文件是否中途被篡改也是用的它,原理参见:http://blog.c

MyPython--&gt;进阶篇--&gt;测试代码

测试函数 要学习测试,得要有测试的代码.下面是一个简单的函数,接受名和姓并返回整洁的姓名 name_function.py def get_allname(x,m): allname = ('%s %s'%(x,m)).title() return allname 编写测试代码 from name_function import get_allname print(get_allname('cc','leo')) import unittest class NameTestCase(unitte

x264测试代码

建立一个工程,将头文件,库文件加载到工程,测试代码如下:#include <iostream>#include <string>#include "stdint.h"  //如果没有,下载地址为:http://download.csdn.net/detail/evsqiezi/7014021extern "C"{#include "x264.h"#include "x264_config.h"};usi

Maven配置插件跳过测试代码的编译和运行

Maven配置插件跳过测试代码的编译和运行: <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</targe

linux下libphenom的测试代码

使用说明:测试使用libphenom库的字符串追加函数,效率是strcat的60多倍.所以在进行大量的字符串累加的时候可以考虑使用libphenom库  依赖库: ck-0.4.5.tar.gz cmake-3.1.2.tar.gz libtap-1.12.0.tar.bz2 libphenom.tar.gz 头文件: #include <phenom/sysutil.h> #include <phenom/string.h> #include <phenom/stream.

国嵌内核驱动进阶班-7-1(Ioctl设备控制)--- 测试代码

驱动内容: 1 #include <linux/module.h> 2 #include <linux/types.h> 3 #include <linux/fs.h> 4 #include <linux/errno.h> 5 #include <linux/mm.h> 6 #include <linux/sched.h> 7 #include <linux/init.h> 8 #include <linux/cde