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 = CRC_CalcCRC( reverse_32( *p++ ) );
    len -= 4;
  }
  crc = reverse_32( crc_reg );
  if ( len )
  {
    CRC_CalcCRC( crc_reg );
    switch ( len )
    {
      case 1:
        crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFF ) ^ crc ) >> 24 );
        crc = ( crc >> 8 ) ^ reverse_32( crc_reg );
        break;
      case 2:
        crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFFFF ) ^ crc ) >> 16 );
        crc = ( crc >> 16 ) ^ reverse_32( crc_reg );
        break;
      case 3:
        crc_reg = CRC_CalcCRC( reverse_32( ( *p & 0xFFFFFF ) ^ crc ) >> 8 );
        crc = ( crc >> 24 ) ^ reverse_32( crc_reg );
        break;
    }
  }
  return ~crc;
}
时间: 2024-10-07 08:26:43

STM32的CRC32 实现代码 -- Ether的相关文章

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

STM32的CRC32 软件实现代码

对于STM32的32位CRC,如果假定它的一个主要目的是为了校验往内部FLASH存储数据的可靠性,那么(余数)初值是全1当然是比较合理的.由于STM32的32位CRC是纯32位,即每次必须输入32位的数,所以如果数据不到32位,应该往低位用1来填充比较合理: 另外,如果输入数据是 "1234"-0x31 0x32 0x33 0x34, 那么输入的CRC数据是 0011-0100 0011-0011 0011-0010 0011-0001 :: 0x34333231 由于STM32的32

VB的CRC32校验代码

这几天编写了CRC32的VB代码,经测试于网上的CRC32校验验证结果完全相同. Option Explicit Dim crc32Table(255) As Long Private Sub Command1_Click() Dim strHex As String Dim i As Long Dim buffer() As Byte strHex = "AA 44 12 1C 2A 00 02 20 48 00 00 00 9D B4 29 07 B0 40 F8 20 00 00 10 0

C++的CRC32校验代码

const UINT32 table[] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b9714

STM32的硬件CRC32使用

最近用到STM32的CRC32模块,看一下官网的Lib,感觉用起来十分简单.但是,你会发现直接使用起来会出现,与很多在线CRC32的网站或者PC端的CRC32校验工具计算结果不一致! 简直就是无语...... 搜索了一下,在21IC的论坛上面有关使用STM32的CRC32的大讨论,不过是09年的帖子.主要定论是STM32的CRC32与目前大多数的PC端软件使用的一些数据顺序及方法不一致.这里主要推荐看一下这个链接: STM32内置CRC模块的使用 讨论的很火. 如果真如,那帖子说的那样.那么作为

STM32_IAP详解(有代码,有上位机)

Iap,全名为in applacation programming,即在应用编程,与之相对应的叫做isp,in system programming,在系统编程,两者的不同是isp需要依靠烧写器在单片机复位离线的情况下编程,需要人工的干预,而iap则是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级.在工程应用中经常会出现我们的产品被安装在某个特定的机械结构中,更新程序的时候拆机很不方便,使用ia

stm32串口

STM32的串口是相当丰富的,功能也非常强劲.最多可提供5路串口(MiniSTM32使用的是STM32F103RBT6,具有3个串口),有分数波特率发生器.支持单线光通信和半双工单线通讯.支持LIN.智能卡协议和IrDASIR ENDEC规范(仅串口3支持).具有DMA等. 串口最主要的设置.就是波特率的设置.STM32的串口使用起来还是蛮简单的,仅仅要你开启了串口时钟,并设置对应IO口的模式,然后配置一下波特率,数据位长度.奇偶校验位等信息.就能够使用了.以下,我们就简介下这几个与串口基本配置

关于stm32的内部FLASH的使用

STM32内部分为几个区域,包括了 (1)主存储区,主要存储代码和constant变量; (2)系统存储器区,stm32引导下载的代码; (3)OPT区,一次性编程区,528字节;存储用户数据,写一次永久不能檫除; BOOT的设置: BOOT0 = 0;BOOT1 =0;地址从0x8000000开始运行代码; BOOT0 = 1;BOOT1 =0;进入串口下载模式. 调用FLASH操作函数: #define FLASH_SAVE_ADDR  0X08010000 //设置FLASH 保存地址(必

MODBUS TCP/IP协议规范详细介绍

1.该规范的发展概况 原始版本1997年9月3日作为公共评论的草案. 再版1999年3月29日,即修订版1.0. 没有大的技术改动,仅作了补充说明.增加了附录A和B作为对一些常用执行问题的回应. 该Modbus/TCP规范在万维网上公开发行.它表明开发者的意愿是把它作为工业自动化领域具有互用性的标准. 既然MODBUS和MODBUS/TCP作为事实上的"实际"标准,而且很多生产商已经实现了它的功能,此规范主要是阐述在互连网上具有普遍可用性的基于TCP通讯协议的MODBUS报文的特殊编码