首先上硬件CRC32校验,测试平台为HC32F4A0,只使用了CRC32校验,由于CRC16校验种类繁多,意义不大,CRC32校验支持一次校验所有数据,以及分段校验(这个很重要),单片机中由于内存不够大,校验的时候需要分段进行校验,以降低内存消耗;

/************************************************************************************************************** 文件名      :   hc32f4a0_crc.c* 功能          :   HC32F4A0 CRC驱动* 作者          :   cp1300@139.com* 创建时间       :   2022-02-16* 最后修改时间  :   2022-02-16* 详细          :   支持crc32校验
*************************************************************************************************************/
#include "hc32f4a0.h"
#include "hc32f4a0_map.h"
#include "system.h"
#include "hc32f4a0_crc.h"/*************************************************************************************************************************
* 函数            :   void HC32CRC_PowerUp(void)
* 功能            :   HC32硬件CRC上电
* 参数            :   无
* 返回            :   无
* 依赖            :   底层
* 作者            :   cp1300@139.com
* 时间            :   2022-02-16
* 最后修改时间    :   2022-02-16
* 说明            :   使用前必须先上电,初始化时钟,使能CRC
*************************************************************************************************************************/
void HC32CRC_PowerUp(void)
{SYS_DeviceClockEnable(DEV_CRC, TRUE);  //使能时钟
}/*************************************************************************************************************************
* 函数            :   void HC32CRC_PowerDown(void)
* 功能            :   HC32硬件CRC掉电
* 参数            :   无
* 返回            :   无
* 依赖            :   底层
* 作者            :   cp1300@139.com
* 时间            :   2022-02-16
* 最后修改时间    :   2022-02-16
* 说明            :   掉电后将不能使用CRC
*************************************************************************************************************************/
void HC32CRC_PowerDown(void)
{SYS_DeviceClockEnable(DEV_CRC, FALSE); //关闭时钟
}/*************************************************************************************************************************
* 函数            :   u32 HC32CRC_CRC32_Check(u8 *pData, u32 DataSize)
* 功能            :   HC32硬件CRC32校验(一次校验完所有)
* 参数            :   pData:待校验数据;DataSize:数据大小
* 返回            :   校验结果
* 依赖            :   底层
* 作者            :   cp1300@139.com
* 时间            :   2022-02-16
* 最后修改时间    :   2022-02-16
* 说明            :   必须先上电
*************************************************************************************************************************/
u32 HC32CRC_CRC32_Check(u8 *pData, u32 DataSize)
{vu8 *pDAT_Reg;if(pData == NULL || DataSize == 0) return 0;CRC->CR |= BIT0;;    //选择crc32CRC->RESTLT = 0xFFFFFFFF;  //写入初值pDAT_Reg = (vu8*)CRC->DAT;while(DataSize --){*pDAT_Reg = *pData ++;}return CRC->RESTLT;
}/*************************************************************************************************************************
* 函数            :   void HC32CRC_CRC32_Start(HC32CRC_HANDLE *pHandle)
* 功能            :   HC32硬件CRC32分段校验开始
* 参数            :   pHandle:句柄
* 返回            :   校验结果
* 依赖            :   底层
* 作者            :   cp1300@139.com
* 时间            :   2022-02-16
* 最后修改时间    :   2022-02-16
* 说明            :   必须先上电
*************************************************************************************************************************/
void HC32CRC_CRC32_Start(HC32CRC_HANDLE *pHandle)
{pHandle->uCRCValue = 0xFFFFFFFF;
}/*************************************************************************************************************************
* 函数            :   u32 HC32CRC_CRC32_ContinueCheck(HC32CRC_HANDLE *pHandle, u8 *pData, u32 DataSize)
* 功能            :   HC32硬件CRC32继续校验(分段)
* 参数            :   pHandle:句柄;pData:待校验数据;DataSize:数据大小
* 返回            :   校验结果
* 依赖            :   底层
* 作者            :   cp1300@139.com
* 时间            :   2022-02-16
* 最后修改时间    :   2022-02-16
* 说明            :   必须先上电,并 HC32CRC_CRC32_Start()
*************************************************************************************************************************/
u32 HC32CRC_CRC32_ContinueCheck(HC32CRC_HANDLE *pHandle, u8 *pData, u32 DataSize)
{vu8 *pDAT_Reg;if(pData == NULL || DataSize == 0) return 0;CRC->CR |= BIT0;                 //选择crc32if(pHandle->uCRCValue == 0xFFFFFFFF){CRC->RESTLT = pHandle->uCRCValue; //写入初值}else{CRC->RESTLT = pHandle->uCRCValue ^ 0xFFFFFFFF;   //中间值在输出的时候进行了异或,此处进行还原}pDAT_Reg = (vu8*)CRC->DAT;while(DataSize --){*pDAT_Reg = *pData ++;}pHandle->uCRCValue = CRC->RESTLT;return pHandle->uCRCValue;
}
/************************************************************************************************************** 文件名      :   hc32f4a0_crc.h* 功能          :   HC32F4A0 CRC驱动* 作者          :   cp1300@139.com* 创建时间       :   2022-02-16* 最后修改时间  :   2022-02-16* 详细          :
*************************************************************************************************************/
#ifndef _HC32F4A0_CRC_H_
#define _HC32F4A0_CRC_H_
#include "hc32f4a0_system.h"void HC32CRC_PowerUp(void);       //HC32硬件CRC上电
void HC32CRC_PowerDown(void);   //HC32硬件CRC掉电
u32 HC32CRC_CRC32_Check(u8 *pData, u32 DataSize);//HC32硬件CRC32校验(一次校验完所有)//硬件CRC校验句柄
typedef struct
{u32 uCRCValue; //初值与中间过程值
}HC32CRC_HANDLE;
void HC32CRC_CRC32_Start(HC32CRC_HANDLE *pHandle);//HC32硬件CRC32分段校验开始
u32 HC32CRC_CRC32_ContinueCheck(HC32CRC_HANDLE *pHandle, u8 *pData, u32 DataSize);//HC32硬件CRC32继续校验(分段)#endif //_HC32F4A0_CRC_H_

下面是软件CRC32校验,同样支持一次校验与分段校验,代码来自互联网,通过查表方式,浪费1KB flash空间,效率极高,你也可以找到直接计算的crc32,不通过查表方式,可以降低flash消耗,但是效率降低;

/************************************************************************************************************** 文件名      :   CRC32.c* 功能         :   软件CRC32校验* 作者           :   cp1300@139.com* 创建时间       :   2022-02-15* 最后修改时间  :   2022-02-15* 详细          :   支持一次性校验,与逐步分包校验
*************************************************************************************************************/
#include "CRC32.h"
#include "typedef.h"
#include "string.h"#define CRC32_INIT  0xffffffff
#define CRC32_XOROT 0xffffffffstatic const u32 scg_CRC32_Table[256] =
{0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};/*************************************************************************************************************************
* 函数                :   u32 crc32_check(u8* pData, u32 DataSize)
* 功能                :   crc32校验(一次性完成所有数据校验)
* 参数                :   pData:待校验数据缓冲区;DataSize:待校验数据大小
* 返回                :   校验结果
* 依赖                :   底层
* 作者                :   cp1300@139.com
* 时间                :   2022-02-16
* 最后修改时间        :   2022-02-16
* 说明                :
*************************************************************************************************************************/
u32 crc32_check(u8* pData, u32 DataSize)
{unsigned int uCRCValue;if (pData == NULL || DataSize == 0) return 0;/* init the start value */uCRCValue = CRC32_INIT;/* calculate CRC */while (DataSize--){uCRCValue = scg_CRC32_Table[(uCRCValue ^ *pData++) & 0xFF] ^ (uCRCValue >> 8);}/* XOR the output value */return uCRCValue ^ CRC32_XOROT;
}/*************************************************************************************************************************
* 函数                :   void crc32_start(CRC32_HANDLE *pHandle)
* 功能                :   crc32校验分段校验开始(初始化)
* 参数                :   pHandle:CRC32句柄
* 返回                :   校验结果
* 依赖                :   底层
* 作者                :   cp1300@139.com
* 时间                :   2022-02-16
* 最后修改时间        :   2022-02-16
* 说明                :
*************************************************************************************************************************/
void crc32_start(CRC32_HANDLE *pHandle)
{if (pHandle == NULL) return;/* init the start value */pHandle->uCRCValue = CRC32_INIT;
}/*************************************************************************************************************************
* 函数                :   u32 crc32_continue_check(CRC32_HANDLE* pHandle, u8* pData, u32 DataSize)
* 功能                :   crc32分段继续校验(分段校验)
* 参数                :   pHandle:CRC32句柄;pData:待校验数据缓冲区;DataSize:待校验数据大小
* 返回                :   校验结果
* 依赖                :   底层
* 作者                :   cp1300@139.com
* 时间                :   2022-02-16
* 最后修改时间        :   2022-02-16
* 说明                :   开始时需要调用crc32_start()进行初始化
*************************************************************************************************************************/
u32 crc32_continue_check(CRC32_HANDLE* pHandle, u8* pData, u32 DataSize)
{if (pHandle == NULL || pData == NULL || DataSize == 0) return 0;/* calculate CRC */while (DataSize--){pHandle->uCRCValue = scg_CRC32_Table[(pHandle->uCRCValue ^ *pData++) & 0xFF] ^ (pHandle->uCRCValue >> 8);}/* XOR the output value */return pHandle->uCRCValue ^ CRC32_XOROT;
}
/************************************************************************************************************** 文件名      :   CRC32.h* 功能         :   软件CRC32校验* 作者           :   cp1300@139.com* 创建时间       :   2022-02-15* 最后修改时间  :   2022-02-15* 详细          :   支持一次性校验,与逐步分包校验
*************************************************************************************************************/
#ifndef _CRC32_H_
#define _CRC32_H_
#include "typedef.h"//CRC32校验句柄
typedef struct
{u32 uCRCValue; //初值与中间过程值
}CRC32_HANDLE;u32 crc32_check(u8* pData, u32 DataSize);                                 //crc32校验(一次性完成所有数据校验)
void crc32_start(CRC32_HANDLE* pHandle);                                    //crc32校验分段校验开始(初始化)
u32 crc32_continue_check(CRC32_HANDLE* pHandle, u8* pData, u32 DataSize);   //crc32分段继续校验(分段校验)#endif //_CRC32_H_

下面是软硬件CRC32的测试代码;

u8 buff[32];u8 i;u32 crc32;HC32CRC_HANDLE mHC32CRC_Handle;   //硬件CRC校验句柄CRC32_HANDLE mCRC32_Handle;      //软件CRC32校验句柄for(i = 0;i < 10;i ++){buff[i] = i;}crc32 = crc32_check(buff, 10);uart_printf("软件CRC32结果:0x%X\r\n", crc32);crc32_start(&mCRC32_Handle);                                          //crc32校验分段校验开始(初始化)crc32 = crc32_continue_check(&mCRC32_Handle, &buff[0], 5);             //crc32分段继续校验(分段校验)uart_printf("软件CRC32分段校验1结果:0x%X\r\n", crc32);crc32 = crc32_continue_check(&mCRC32_Handle, &buff[5], 5);              //crc32分段继续校验(分段校验)uart_printf("软件CRC32分段校验2结果:0x%X\r\n", crc32);HC32CRC_PowerUp();       //HC32硬件CRC上电crc32 = HC32CRC_CRC32_Check(buff, 10);//HC32硬件CRC32校验(一次校验完所有)uart_printf("硬件CRC32结果:0x%X\r\n", crc32);//硬件CRC分段校验HC32CRC_CRC32_Start(&mHC32CRC_Handle);//HC32硬件CRC32分段校验开始crc32 = HC32CRC_CRC32_ContinueCheck(&mHC32CRC_Handle, &buff[0], 5);//HC32硬件CRC32继续校验(分段)uart_printf("硬件CRC32分段校验1结果:0x%X\r\n", crc32);crc32 = HC32CRC_CRC32_ContinueCheck(&mHC32CRC_Handle, &buff[5], 5);//HC32硬件CRC32继续校验(分段)uart_printf("硬件CRC32分段校验2结果:0x%X\r\n", crc32);

测试结果

对比

HC32F4 CRC32校验(附软件CRC32校验)相关推荐

  1. mysql page校验_MySQL InnoDB离线校验工具innochecksum使用

    innochecksum工具可以打印InnoDB文件的校验值,该工具读取InnoDB表空间文件,计算每个页面的校验值,将计算的校验值与存储的校验值进行比较,并报告指示损坏页面的不匹配.它最初是为了加速 ...

  2. 计算机三种校验方式,三种校验码

    奇偶校验.海明码.CRC循环冗余校验码 三种校验码比较重要,需要牢记,在计算机网络中用处较大 奇偶校验 根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇 ...

  3. 进制转换及如何求校验码(海明校验码及循环冗余校验CRC码)

    文章目录 前言 一.进制转换 1.1 二进制转换为八进制数和十六进制数 1.2 任意进制数转换为十进制数 1.3 十进制转换为任意进制 二.校验码求取 2.1海明校验码 2.2循环冗余校验CRC码 总 ...

  4. [免费专栏] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  5. 一文详解循环冗余校验校验算法(CRC校验)及C语言代码的实现 ---- 以CRC-16/MODBUS为例讲解

    一.概述 现在的产品开发过程中,无论是数据的储存还是传输,都需要确保数据的准确性,所以就需要在数据帧后面附加一串校验码,方便接收方使用校验码校验接收到的数据是否是正确的. 常用的校验方式有奇偶校验.异 ...

  6. 【计算机网络】数据链路层 : 差错控制 ( 纠错编码 | 海明码 | “海明码“ 原理 | “海明码“ 工作流程 | 确定校验啊位数 | 确定校验码和数据位置 | 求校验码值 | 检错纠错 )★

    文章目录 一. "海明码" 工作原理 二. "海明码" 工作流程 三. 确定校验码位数 四. 确定校验码和数据位置 0. 确定校验码位置 1. 引入二进制位 2 ...

  7. element-ui的表单校验;el-form表单校验;el-form表单自定义校验;手机号校验;车牌号校验;车牌号正则校验;

    示例:代码在末尾 可以直接复制使用 一.基本属性认知: 1. required: true 会有 * , 但仅是触发最后点击提交按钮时,校验某一项位必填:与输入事件或者选择或者失焦时候 怎么校验无关 ...

  8. 知云文献翻译打不开_最新版知云文献翻译 | 内附软件安装包

    点击上方蓝字了解更多精彩 免责声明 所有资源全部为免费分享,大部分资源来源于网络,所有资源仅供学习和交流使用,严禁商用,如有侵权,请联系我们删除,谢谢合作. 知云文献翻译 知云文献翻译是一款十分专业且 ...

  9. 计算机组成原理——奇偶校验,海明校验,循环冗余校验

    1.奇偶校验码 奇偶校验就是在原有的二进制数据的基础上加上以为的校验位 奇校验:整个校验码(原有信息+校验位)中的"1"的个数为奇数 偶校验:整个校验码(原有信息+校验位)中的&q ...

  10. 纵向冗余校验计算方法_常见校验算法

    常见校验算法 一.校验算法 奇偶校验 MD5 校验 求校验和 BCC(Block Check Character/ 信息组校验码 ) ,好像也是常说的异或校验方法 CRC(Cyclic Redunda ...

最新文章

  1. 机房收费系统之uml图——初版
  2. Spring.net与Asp.net Mvc结合示例《转载》
  3. 记一次中小公司的研发问题
  4. Spring boot 中pom.xml 各个节点详解
  5. keepalived配置参数官方文档中文翻译版
  6. 数据库语句数据库学习(3)——数据库的创建与删除
  7. IIS7中查看w3wp进程
  8. no such file to load -- bundler/setup
  9. Jenkins 多服务器自动部署,发布到多台服务器
  10. 2022年电工杯B题应急物资配送问题浅析
  11. CAD门窗lisp_门窗CAD大样图
  12. 遇到slideUp Down 问题
  13. tftpd32服务器软件在Windows与linux 下的文件传输
  14. RNN网络对新冠疫情进行预测
  15. Treap(二)——#10144. 「一本通 4.6 练习 1」宠物收养所
  16. Arcgis开发系列2 - 修改arcgis infowindow 放大和缩小的模板
  17. gochat源码解析
  18. 操作系统/LINUX/数据库/算法/设计模式/HR面试题集锦
  19. 进入BeOS的花花世界 系列八
  20. DXP的使用及绘制PCB

热门文章

  1. linux、docker容器缺少tailf命令,解决方案。
  2. ug草图精度怎么设置_UG怎么设置草图尺寸? UG草图尺寸的编辑方法
  3. MISRA C 2004
  4. 调试笔记:BSOD 0xA
  5. Java数字图像处理基础-------图像二值化处理
  6. python生成加密exe_python加密保护-加密exe文件
  7. 数据同步工具oracle goldengate安装与配置
  8. Tensorflow2.0 之 SSD 网络结构
  9. 在阿里云服务器网站添加子域名无法访问的处理
  10. MCS-51单片机总体概述(一)