forgot 发表于 2025-5-15 11:42

硬件循环冗余校验(CRC)模块

CRC是一种错误检测码,用于检测数据传输或存储中的意外更改。它通过对数据应用特定的算法生成一个固定长度的校验值。这个校验值附加在数据后面,接收方可以重新计算CRC并与接收到的校验值比较,以验证数据完整性。
示例代码(基于库函数)

#include "cw32f030_crc.h"

void CRC_Configuration(void) {
    CRC_InitTypeDef CRC_InitStruct;

    CRC_InitStruct.CRC_Poly = CRC_POLY_32;         // CRC-32多项式
    CRC_InitStruct.CRC_InitValue = 0xFFFFFFFF;   // 初始值
    CRC_InitStruct.CRC_InputReverse = CRC_REVERSE_BYTE; // 字节反转输入
    CRC_InitStruct.CRC_OutputReverse = CRC_REVERSE_BIT; // 输出位反转
    CRC_InitStruct.CRC_XorOut = 0xFFFFFFFF;      // 结果异或值
    CRC_Init(&CRC_InitStruct);
}

uint32_t Calculate_CRC(uint8_t *data, uint32_t len) {
    CRC_Reset(); // 复位CRC计算器
    while (len--) {
      CRC_WriteData(*data++); // 逐字节写入数据
    }
    return CRC_ReadResult(); // 返回最终CRC值
}

int main() {
    CRC_Configuration();
    uint8_t test_data[] = "123456789";
    uint32_t crc = Calculate_CRC(test_data, sizeof(test_data)-1); // 计算CRC
    // 预期结果:0xCBF43926
    while(1);
}

lidi911 发表于 2025-5-15 21:01

现在MCU一般都内置了硬件CRC

huquanz711 发表于 2025-5-17 14:58

硬件CRC比软件计算速率要快得多

szt1993 发表于 2025-5-18 20:34

CRC是一种错误检测码

Sunriver_Yao 发表于 2025-5-19 20:31

能算 ModBus CRC么?

zhouyong77 发表于 2025-5-20 07:53

这个硬件CRC可以选择计算方式嘛?

再见十分钟 发表于 2025-5-21 14:16

避免数据错误还是很有必要的

小小蚂蚁举千斤 发表于 2025-5-22 12:55

数据校验还是非常必要的

AdaMaYun 发表于 2025-5-22 17:35

CRC是一种错误检测码,用于检测数据传输或存储中的意外更改。

梦境摆渡人 发表于 2025-5-23 10:09

这个示例代码提供了一个基本的CRC计算流程,非常适用于嵌入式系统的数据校验。

复古留声机 发表于 2025-5-24 09:19

这个示例代码很好地展示了如何在硬件层面使用CRC校验。对于嵌入式系统来说,这种校验是非常重要的。
页: [1]
查看完整版本: 硬件循环冗余校验(CRC)模块