问答

汇集网友智慧,解决技术难题

21ic问答首页 - 大神们,谁知道GD32F303的CRC32的算法代码

GD32F303cct6 pc 代码 GD32F303 CRC

大神们,谁知道GD32F303的CRC32的算法代码

pltczw6662024-03-22
GD32F303CCT6与PC通讯,打算使用GD32F303CCT6自带的硬件CRC对数据块校验,PC端对应的算法是怎样的?
回答 +关注 9
3437人浏览 19人回答问题 分享 举报
19 个回答
  • 这是纯软件实现的吗
  • 今天把楼上的代码都测试了,没有一个软件CRC代码能与GD32F303CC的硬件CRC相匹配的。GD32F303CC的CRC外设的多项式是固定的,根本不能自由配置。
  • yangxiaor520 发表于 2024-6-9 17:02
    网上很多CRC的C语言代码,学习一下。

    CRC的计算原理我清楚,这是是比较神奇的算法,不仅能检错,还能纠错,98年我就做过检纠错。CRC的执行是以bit为单位的,所以除了多项式,初始值,异或值(不一定是0xffffffff)外,还要确定位序(低位先行还是高位先行,当然这也可以归结到多项式上,就像5楼的0xEDB88320 和 6楼的0x04C11DB7,其实是同一个多项式,只是位序是反的)
  • vivilyly 发表于 2024-6-4 10:20
    #include "gd32f30x.h"

    uint32_t crc32_table[256];

    等不及了只好放弃硬件CRC,改为软件实现,过几天验证一下您的算法。感谢!
  • 网上很多CRC的C语言代码,学习一下。
  • #include <stdint.h>

    // CRC-32 (Ethernet) polynomial: 0x4C11DB7
    #define CRC32_POLYNOMIAL 0x04C11DB7

    // Function to calculate the CRC-32 value
    uint32_t crc32_calculate(const uint8_t *data, size_t length, uint32_t crc) {
        while (length--) {
            crc ^= (*data++ << 24);
            for (int i = 0; i < 8; i++) {
                if (crc & 0x80000000) {
                    crc = (crc << 1) ^ CRC32_POLYNOMIAL;
                } else {
                    crc <<= 1;
                }
            }
        }
        return crc;
    }

    // Example usage:
    uint8_t my_data[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
    uint32_t crc_value = crc32_calculate(my_data, sizeof(my_data), 0xFFFFFFFF);
  • 配置CRC模式和 polynomial。
    初始化CRC单元,并将其设置为所需的操作模式。
    将数据通过CRC单元,可以是直接操作寄存器,也可以是通过特定的外设接口(如ADC)来触发CRC计算。
    获取CRC计算结果。
  • 要使用GD32F303的CRC32算法,你需要通过硬件外设的API来操作。
  • crc32_calculate函数接受一个数据指针、数据长度和初始CRC值,然后计算出CRC-32校验码。初始CRC值通常设置为0xFFFFFFFF,计算完成后,需要将结果与0xFFFFFFFF进行异或,以得到最终的CRC值
12下一页

您需要登录后才可以回复 登录 | 注册