C语言CRC-32 STM32格式校验函数

这篇具有很好参考价值的文章主要介绍了C语言CRC-32 STM32格式校验函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言CRC-32 STM32格式校验函数

CRC-32校验产生4个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-32校验算法实现,参考: C语言标准CRC-32校验函数

不同厂家通过对输入数据前处理和输出数据后处理的方式不同,又产生了不同的厂家校验函数,这里介绍STM32硬件CRC对应格式的CRC-32校验函数。STM32格式对输入数据,只有预置值为0XFFFF(当做最初的余数)的前处理。但STM32硬件CRC计算函数需要输入值为32位数组/指针,所以对应的软件CRC实现也需要保证输入数据长度是4字节/32位的倍数。

生成多项式为x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1

由于反向算法更适合于有输入字节倒位序和输出整体数据倒位序的情况,这里只介绍正向算法。实际上,STM32的CRC计算规则基本上与CRC-32 MPEG-2格式校验函数一样,只在每个32位数据内部的字节序顺序不同,所以把CRC-32 MPEG-2格式校验函数介绍的算法中采用32位输入数据的校验函数修改即可得到STM32的CRC-32校验函数。

CRC-32 MPEG-2格式校验函数为:
C语言CRC-32 STM32格式校验函数
相对而言,CRC-32 MPEG-2格式校验函数里做了32位数据内部的字节倒序。而STM32格式校验函数里不做32位数据内部字节倒序。

正向算法

正向算法是符合标准CRC-32的计算理论,从左向右计算,也即计算过程中移位时,向左移出。算法的实现如下:

CRC-32 STM32格式校验函数(32位输入数据格式):

uint32_t PY_CRC_32_T32_STM32(uint32_t *di, uint32_t len)
{
	uint32_t crc_poly = 0x04C11DB7;  //X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1 total 32 effective bits without X^32.
	//uint32_t data_t = 0; //CRC register
	uint32_t data_t = 0xffffffff; //CRC register

    for(uint32_t i = 0; i < len; i++)
    {
    	data_t ^= di[i]; //32-bit data

        for (uint8_t j = 0; j < 32; j++)
        {
            if (data_t & 0x80000000)
            	data_t = (data_t << 1) ^ crc_poly;
            else
            	data_t <<= 1;
        }
    }
    return (data_t);
}

STM32硬件CRC校验

这里以STM32CUBEIDE环境,STM32F401CCU6芯片为例介绍硬件CRC的计算。

首先建立基本工程并配置时钟:
C语言CRC-32 STM32格式校验函数
C语言CRC-32 STM32格式校验函数
打开硬件CRC功能模块:
C语言CRC-32 STM32格式校验函数
保存并生成基本工程:
C语言CRC-32 STM32格式校验函数
在代码里调用硬件CRC-32计算函数即可,其定义为:

/**
  * @brief  Compute the 32-bit CRC value of a 32-bit data buffer
  *         starting with hcrc->Instance->INIT as initialization value.
  * @param  hcrc CRC handle
  * @param  pBuffer pointer to the input data buffer.
  * @param  BufferLength input data buffer length (number of uint32_t words).
  * @retval uint32_t CRC (returned value LSBs for CRC shorter than 32 bits)
  */
uint32_t HAL_CRC_Calculate(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
{
  uint32_t index;      /* CRC input data buffer index */
  uint32_t temp = 0U;  /* CRC output (read from hcrc->Instance->DR register) */

  /* Change CRC peripheral state */
  hcrc->State = HAL_CRC_STATE_BUSY;

  /* Reset CRC Calculation Unit (hcrc->Instance->INIT is
  *  written in hcrc->Instance->DR) */
  __HAL_CRC_DR_RESET(hcrc);

  /* Enter 32-bit input data to the CRC calculator */
  for (index = 0U; index < BufferLength; index++)
  {
    hcrc->Instance->DR = pBuffer[index];
  }
  temp = hcrc->Instance->DR;

  /* Change CRC peripheral state */
  hcrc->State = HAL_CRC_STATE_READY;

  /* Return the CRC computed value */
  return temp;
}

STM32硬件和软件CRC计算效果

通过如下代码定义即可比较硬件CRC和软件CRC计算结果:

uint32_t crc32_rst1 = 0;
uint32_t crc32_rst2 = 0;
crc32_rst1 = HAL_CRC_Calculate(&hcrc, "C-R-C-32", strlen("C-R-C-32")/4);
crc32_rst2 = PY_CRC_32_T32_STM32("C-R-C-32", strlen("C-R-C-32")/4);```

打开STM32CUBEIDE的“”现场表达式功能:
C语言CRC-32 STM32格式校验函数
C语言CRC-32 STM32格式校验函数
并在现场表达式里加入两个变量名crc32_rst1和crc32_rst2.
编译下载并debug代码,在现场表达式里即可看到硬件CRC和软件CRC的计算值相同:
C语言CRC-32 STM32格式校验函数

STM32可配置硬件CRC

一部分STM32芯片如STM32H743支持硬件CRC格式配置,在默认配置下,即和不能配置的硬件CRC格式相同:
C语言CRC-32 STM32格式校验函数

可以根据需要配置和默认CRC校验格式不同的CRC校验格式:

可设置校验多项式,不限于CRC-32
C语言CRC-32 STM32格式校验函数
可设置计算初始值
C语言CRC-32 STM32格式校验函数
可设置输入数据反序
C语言CRC-32 STM32格式校验函数
可设置输出数据反序
C语言CRC-32 STM32格式校验函数
可设置输入数据基本宽度
C语言CRC-32 STM32格式校验函数

对应的软件CRC算法可以从基本原理的CRC校验函数修改实现:
C语言标准CRC-8校验函数
C语言标准CRC-16校验函数
C语言标准CRC-32校验函数

–End-文章来源地址https://www.toymoban.com/news/detail-426636.html

到了这里,关于C语言CRC-32 STM32格式校验函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (python)数据校验-CRC32校验

    目录 前言 数据校验概念 CRC校验算法 CRC计算原理 算法逻辑 流程图 CRC算法种类 代码实现CRC算法 python实现算法① python实现算法② 总结         在二次开发eCan上位机应用时,遇到了采用CRC(全称是循环冗余校验)32算法 校验文件传输完整性 的场景,浅浅地记录一下使用心得.  

    2023年04月16日
    浏览(29)
  • C#: CRC8,CRC16,CRC32 校验代码

    说明:CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似

    2024年01月18日
    浏览(31)
  • CRC校验(2):CRC32查表法详解、代码实现及CRC反转

    对于现在的CPU来说,基本上都在硬件上实现了CRC校验。但我们还是想用软件来实现一下CRC的代码,这样可以更深入地理解里面的原理。所以这一节就来详细地解释如何使用查表法从软件上来实现CRC-32的校验。另外,CRC还有一种反转的情况,实际上反转和不反转没有什么太大的

    2024年02月09日
    浏览(140)
  • 5.0 CRC32校验技术概述

    CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否

    2024年02月08日
    浏览(23)
  • CRC32校验算法原理及计算说明

    本文主要介绍如何使用CRC32校验算法计算得出FCS(Frame Check Sequence帧检验序列). 参考: 1、CRC32加密算法原理 2、CRC多项式对应代码 作用:在远距离数据通信中,为确保高效而无差错地传送数据,对数据进行校验即差错控制。 CRC原理实际上就是在一个K位二进制数据序列之后附

    2023年04月22日
    浏览(32)
  • CRC16/ModBus校验与C语言实现方法

    目录 一、什么是CRC16/Modbus校验 二、CRC16/Modbus校验的计算步骤 三、CRC16/Modbus校验的C语言实现         CRC16/Modbus校验在设备通信时可以验证数据帧的完整性,从而避免错误数据。其应用十分广泛,主要应用于Modbus通信协议等,类似的校验方法还有许多,例如和校验,本文主

    2024年02月07日
    浏览(29)
  • CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    因为前段时间用到CRC校验码,所以在网上找到了很多有关CRC校验码计算原理以及生成CRC校验码的代码实现(包括C语言和Verilog语言的实现)的文章,但关于CRC校验码代码实现的原理未能找到相关文章,于是自己结合C语言和Veirlog语言的实现代码以及CRC校验码的计算原理,对CR

    2023年04月22日
    浏览(87)
  • CRC原理介绍及STM32 CRC外设的使用

    循环冗余校验(英语: Cyclic redundancy check ,简称CRC),由 W. Wesley Peterson 于 1961 年首次提出的一种纠错码理论。 CRC是一种 数据纠错方法 ,主要应用于数据通信或者数据存储的场合,用来检测或校验数据传输或者数据存储后可能出现的错误,特别是擅长检测由传输通道中的噪

    2024年02月09日
    浏览(27)
  • CRC校验码计算,以常用CRC-8为例

    CRC即循环冗余校验码 :是数据通信领域中最常用的一种查错校验码,其 特征是信息字段和校验字段的长度可以任意选定。 CRC校验原理 :在要发送的帧后面附加一个数,生成一个新帧发送给接收端。它要 使所生成的新帧能与发送端和接收端共同选定的某个特定数整除 (注意

    2023年04月14日
    浏览(26)
  • CRC(循环冗余校验码的校验方法)

    5个关键点: 1.信息码:即给出要校验的二进制码 2.生成多项式:一般多项式会给,从最高位的指数位数就可以得到有几个校验码;如果没给多项式,肯定会给个多项式二进制码,根据它来推就行(具体推的规律,下面会讲) 3.校验位:由多项式的最高位指数得出 4.多项式对应

    2024年02月08日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包