打印

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

[复制链接]
3461|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pltczw666|  楼主 | 2024-3-22 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32F303CCT6与PC通讯,打算使用GD32F303CCT6自带的硬件CRC对数据块校验,PC端对应的算法是怎样的?

使用特权

评论回复
沙发
guijial511| | 2024-3-22 20:09 | 只看该作者
CRC校验是标准的算法,看看别人封装好的实现代码。

使用特权

评论回复
板凳
原来是wjc| | 2024-5-31 23:45 | 只看该作者
本帖最后由 原来是wjc 于 2024-6-1 03:10 编辑

CRC 算法的参数(例如多项式、初始值、最终 XOR 值等)需要与 GD32F303CCT6 的硬件 CRC 配置相匹配。

使用特权

评论回复
地板
iyoum| | 2024-6-4 09:34 | 只看该作者
CRC是一种用于检测数据传输或存储中错误的技术。

使用特权

评论回复
5
vivilyly| | 2024-6-4 10:20 | 只看该作者
#include "gd32f30x.h"

uint32_t crc32_table[256];

void generate_crc32_table(void) {
    uint32_t i, j, crc;
    for (i = 0; i < 256; i++) {
        crc = i;
        for (j = 0; j < 8; j++) {
            if (crc & 1) {
                crc = (crc >> 1) ^ 0xEDB88320;
            } else {
                crc >>= 1;
            }
        }
        crc32_table[i] = crc;
    }
}

uint32_t calculate_crc32(uint8_t *data, uint32_t length) {
    uint32_t crc = 0xFFFFFFFF;
    uint32_t i;
    for (i = 0; i < length; i++) {
        crc = (crc >> 8) ^ crc32_table[(crc ^ data[i]) & 0xFF];
    }
    return crc ^ 0xFFFFFFFF;
}

int main(void) {
    // 初始化CRC32表
    generate_crc32_table();

    // 待计算CRC的数据和长度
    uint8_t data[] = {0x01, 0x02, 0x03, 0x04, 0x05};
    uint32_t length = sizeof(data);

    // 计算CRC32值
    uint32_t crc32 = calculate_crc32(data, length);

    // 输出结果
    printf("CRC32: 0x%08X\n", crc32);

    return 0;
}

使用特权

评论回复
6
backlugin| | 2024-6-4 11:53 | 只看该作者
#include "gd32f30x_crc.h"

void crc32_hw_init(void)
{
    // 开启CRC时钟
    rcu_periph_clock_enable(RCU_CRC);

    // 复位并初始化CRC控制器
    crc_reset();
   
    // 根据需要配置CRC多项式,GD32F303默认支持多项式0x04C11DB7 (CRC-32/ISO-HDLC)
    // 注意:大部分情况下不需要手动配置多项式,除非你需要使用非标准算法
}

uint32_t calculate_crc32(const uint8_t *data, uint32_t length)
{
    // 计算数据的CRC32校验值
    uint32_t crc_value = 0;
   
    // 确保CRC模块处于待处理状态
    crc_enable();
   
    // 逐个字节或按需分块处理数据,更新CRC值
    for(uint32_t i = 0; i < length; i++)
    {
        crc_value = crc_data_byte(crc_value, data[i]);
    }
   
    // 关闭CRC模块(如果不再需要连续计算)
    // crc_disable();
   
    return crc_value;
}

使用特权

评论回复
7
maudlu| | 2024-6-4 14:57 | 只看该作者
在GD32系列芯片中,CRC计算通常使用外设CRC控制器(CRC Unit)来实现。该控制器支持多种CRC算法,包括CRC32。

使用特权

评论回复
8
jtracy3| | 2024-6-5 15:05 | 只看该作者
GD32F303的CRC模块支持多种CRC算法,包括CRC32、CRC16、CRC8等。在使用CRC模块时,可以根据需要选择合适的CRC算法。

使用特权

评论回复
9
averyleigh| | 2024-6-5 20:34 | 只看该作者
如何使用GD32F303的硬件CRC模块,可以通过配置相关寄存器来实现。

使用特权

评论回复
10
uptown| | 2024-6-7 10:31 | 只看该作者
#include "gd32f30x_crc.h"

void CRC_Init(void)
{
    /* Enable the CRC clock */
    rcu_periph_clock_enable(RCU_CRC);

    /* Reset the CRC module */
    crc_deinit();

    /* Set the polynomial to use for the CRC calculation */
    crc_polynomial_set(CRC_POLYNOMIAL_X32); // Assuming this is the polynomial you want to use

    /* Set the initial value of the CRC register */
    crc_data_in(0xFFFFFFFF);
}

uint32_t CalculateCRC32(uint8_t *data, uint32_t length)
{
    CRC_Init();

    for (uint32_t i = 0; i < length; i++)
    {
        crc_value_in(*data++);
    }

    return crc_value_out();
}

使用特权

评论回复
11
nomomy| | 2024-6-7 14:02 | 只看该作者
GD32F303是一款基于Cortex-M4内核的32位微控制器,它内置了CRC(循环冗余校验)模块,可以用于计算CRC32校验和

使用特权

评论回复
12
deliahouse887| | 2024-6-7 17:12 | 只看该作者
crc32_calculate函数接受一个数据指针、数据长度和初始CRC值,然后计算出CRC-32校验码。初始CRC值通常设置为0xFFFFFFFF,计算完成后,需要将结果与0xFFFFFFFF进行异或,以得到最终的CRC值

使用特权

评论回复
13
benjaminka| | 2024-6-7 20:18 | 只看该作者
要使用GD32F303的CRC32算法,你需要通过硬件外设的API来操作。

使用特权

评论回复
14
earlmax| | 2024-6-8 10:14 | 只看该作者
配置CRC模式和 polynomial。
初始化CRC单元,并将其设置为所需的操作模式。
将数据通过CRC单元,可以是直接操作寄存器,也可以是通过特定的外设接口(如ADC)来触发CRC计算。
获取CRC计算结果。

使用特权

评论回复
15
houjiakai| | 2024-6-8 13:29 | 只看该作者
#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);

使用特权

评论回复
16
yangxiaor520| | 2024-6-9 17:02 | 只看该作者
网上很多CRC的C语言代码,学习一下。

使用特权

评论回复
17
pltczw666|  楼主 | 2024-6-16 11:31 | 只看该作者
vivilyly 发表于 2024-6-4 10:20
#include "gd32f30x.h"

uint32_t crc32_table[256];

等不及了只好放弃硬件CRC,改为软件实现,过几天验证一下您的算法。感谢!

使用特权

评论回复
18
pltczw666|  楼主 | 2024-6-16 11:56 | 只看该作者
yangxiaor520 发表于 2024-6-9 17:02
网上很多CRC的C语言代码,学习一下。

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

使用特权

评论回复
19
pltczw666|  楼主 | 2024-6-18 17:15 | 只看该作者
今天把楼上的代码都测试了,没有一个软件CRC代码能与GD32F303CC的硬件CRC相匹配的。GD32F303CC的CRC外设的多项式是固定的,根本不能自由配置。

使用特权

评论回复
20
FranklinUNK| | 2024-6-20 15:46 | 只看该作者
这是纯软件实现的吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

46

帖子

0

粉丝