GD32VF103之CRC

2023-05-16

在GD32VF103内部有一个CRC(循环冗余校验计算单元),使用它可以对数据的完整性和正确性进行校验,比如固件的完整性和正确性校验、通信数据的校验等。它使用固定的32位多项式:0x4C11DB7: X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1 。该 32 位 CRC 多项式与以太网 CRC 计算多项式相同。

CRC的寄存器只有三个:数据寄存器、独立数据寄存器、控制寄存器

数据寄存器接收输入数据并保存计算结果。

独立数据寄存器是一个独立的数据存储单元,可以作为临时寄存器使用。

控制寄存器用来复位数据寄存器。

第一次使用这个CRC发现它计算的结果跟网上在线计算器算出的结果不一样,目前知道的原因有两个,一是数据反转,有些算法会将输入数据和输出数据反转,而芯片内部的CRC没有这些操作。CRC-32有多种计算方法,这个CRC-32/MPEG-2与本芯片的CRC计算方法是一样的,都没有反转。

 

二是计算顺序,网上的工具对输入的数据计算方向都是从左到右,而芯片内部的计算方向是从32位的高位字节到低位字节(大端)。

所以要得到相同的结果,其中一方必须做出调整。这里以hello world为例来看看计算结果,代码中初始化它是这样的

 

在程序中存储是这样的

计算crc的时候一次放入32位,从高位开始算,最后的计算序列是llehow o\0dlr

将这个序列放到网络计算器计算的确可以得到相同的结果,这里有个字符串结束标志\0,ASCII没有办法输入,所以使用hex方式。

 

对于低于32位的数据,芯片的CRC会在高位补0,而网络计算器计算的时候也必须补足32位。下面是计算字符’!‘得到的结果。

芯片CRC:

网络计算器:

这里不补0是不行的,目前还没有搞清楚网络计算器关于少于32位的数据是怎么计算的,补0和补1都不对。

搞清楚了芯片的CRC怎么算的,那应用起来就没问题了。以后在设计OTA升级或者数据通信的时候就可以用上了。

bilibili:科G栈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32VF103之CRC 的相关文章

  • CRC计算的简单原理及代码实现(python)

    目录 多项式的获取 CRC计算的示例图 示例代码 多项式的获取 举例如下 xff08 其余的多项式依次类推即可 xff09 xff1a 故最终多项式获取的参与异或计算的数据为 xff1a 1011 CRC计算的示例图 假设原始数据为 xff
  • c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...

    crc校验方法 用c语言实现源代码 CRC checksum method using C language source code crc校验方法 用c语言实现源代码 CRC checksum method using C languag
  • stm32 CRC-16校验代码,单片机ModBUS-CRC16校验

    stm32系列内部均带有硬件CRC 不过为了方便移植 建议使用纯计算的方式 进行CRC 16计算 可用于ModBUS通信 提供两种实现方法的代码 1 实时计算 CRC 16 耗时多 这种方式耗时会比较多 优点是占用Flash RAM小 CR
  • CRC的基本原理详解

    CRC Cyclic Redundancy Check 被广泛用于数据通信过程中的差错检测 具有很强的 检错能力 本文详细介绍了CRC的基本原理 并且按照解释通行的查表算法的由来的思路介绍 了各种具体的实现方法 1 差错检测 数据通信中 接
  • CRC校验关键点说明(内附C语言CRC校验库)

    文章目录 目的 CRC校验关键点 参数模型 计算方式 CRC校验库 源文件 使用测试 总结 目的 CRC即循环冗余校验码 Cyclic Redundancy Check 是数据通信领域中最常用的一种查错校验码 其特征是信息字段和校验字段的长
  • CRC16 校验和:HCS08 与 Kermit 与 XMODEM

    我正在尝试将 CRC16 错误检测添加到 Motorola HCS08 微控制器应用程序 但我的校验和不匹配 一在线CRC计算器提供了我在 PC 程序中看到的结果和我在微型计算机上看到的结果 它将微处理器的结果称为 XModem 将 PC
  • 需要帮助纠正用 Javascript (node.js) 编写的 CRC-ITU 检查方法中的问题

    我们正在尝试在 Javascript 上编写 GPS 设备侦听器代码 在此过程中 我们无法开发正确的 CRC ITU 错误检查脚本 协议文档生成crc码的解释如下 终端或服务器可以使用校验码来区分 接收到的信息是否有误 为了防止错误 数据传
  • _mm_crc32_u8 给出的结果与参考代码不同

    我一直在与内在因素作斗争 特别是使用标准 CRC 计算和据推测等效的英特尔内在函数 我想转而使用 mm crc32 u16 and mm crc32 u32但如果我不能让 8 位操作工作 那就没有意义了 static UINT32 g ui
  • CRC-CCITT 16位Python手动计算

    Problem 我正在为嵌入式设备编写代码 许多 CRC CCITT 16 位计算解决方案都需要库 鉴于使用库几乎是不可能的并且会消耗其资源 因此需要一个函数 可能的解决方案 下面是网上找到的CRC计算 然而 它的实现是不正确的 http
  • 带有 PL/pgSQL 的 CRC32 函数

    如何计算 32 位循环冗余校验 CRC 32 作为 PostgreSQL 中的函数 方法与MySQL http dev mysql com doc refman 5 7 en mathematical functions html func
  • 验证 CRC 校验和是否为零

    我过去接触过 CRC 16 校验和 习惯于通过对我要验证的文件重新计算 CRC 16 校验和 加上 CRC 16 本身的 2 个字节来验证它 如果结果为零 则文件完整性有效 否则无效 这可以非常有效地编码 就像下面的伪 C 一样 if re
  • 如何获得CRC64分布式计算(利用其线性特性)?

    我需要对存储在分布式文件系统上的相当大的文件进行哈希处理 我能够以比整个文件更好的性能处理文件的某些部分 因此我希望能够计算各部分的哈希值 然后对其求和 我在想CRC64作为哈希算法 但我不知道如何使用其理论上的 线性函数 属性 以便我可以
  • 算法 CRC-12

    我正在尝试对 12 位 CRC 和算法执行 crc table 但总是得到错误的结果 你能帮助我吗 要创建 crc 表 我尝试 void crcInit void unsigned short remainder int dividend
  • python套接字在逐行调试时工作正常,但在完整运行时无法工作[重复]

    这个问题在这里已经有答案了 我正在开发一个项目 该项目涉及传输文件 并为文件的每个块进行 CRC 校验和计算 例如此处为 40960 字节 我的问题是 当我逐行调试代码时 一切正常 但当我完全运行代码时 我在接收器端得到不同的 CRC 校验
  • 是否有一种校验和算法也支持从中“减去”数据?

    我有一个包含大约 1 亿个文档的系统 我想跟踪它们在镜像之间的修改 为了有效地交换有关修改的信息 我想按天发送有关修改文档的信息 而不是按每个单独的文档发送 像这样的事情 2012 03 26 cs26 2012 03 25 cs25 20
  • 棘手的 CRC 算法

    我正在尝试找到适用于以下结果的 crc 字节串由 2 个字节组成 即 0xCE1E crc 是单个字节 即 0x03 byte crc CE1E 03 CE20 45 CE22 6F 0000 C0 0001 D4 FFFF 95 有人可以
  • CRC 16 程序计算校验和

    我目前正在编写一个 CRC16 程序 它使用 CRC 16 多项式计算字符的 CRCX 16 X 15 X 2 1 程序应从标准输入读取数据并以十六进制输出 16 位 CRC 尽管如此 当我执行该程序时 我得到了错误的输出值 这是我的代码
  • 如何计算 CRC 中使用的 XOR 余数?

    我试图记住如何计算循环冗余检查中的 XOR 算法的剩余部分以验证网络消息的剩余位 我不应该扔掉那本教科书 这在代码中很容易完成 但是如何手动计算出来呢 我知道它看起来像标准除法算法 但我不记得从那里去哪里获得余数 1010 10110100
  • 将 CRC8 从 C 翻译为 Java

    我收到一段 C 代码 它计算字节数组的 CRC8 值 我需要将其翻译成Java 这里的C Code CRC POLYNOM 0x9c CRC PRESET 0xFF unsigned int CRC CRC PRESET for i 0 i
  • 零填充缓冲区/文件的 CRC32 计算

    如果我想计算大量连续零字节的 CRC32 值 在给定零运行长度的情况下 是否可以使用恒定时间公式 例如 如果我知道我有 1000 个字节全部用零填充 有没有办法避免 1000 次迭代的循环 只是一个例子 对于这个问题 实际的零数量是无限的

随机推荐