方法 1:使用硬件 CRC 模块(推荐)
c
#include "gd32f30x.h"
uint32_t calculate_crc32(uint8_t *data, uint32_t length) {
// 复位 CRC 计算单元
CRC_CTL = CRC_CTL_RST;
// 逐字节输入数据
for (uint32_t i = 0; i < length; i++) {
CRC_DATA = data[i];
}
// 返回 32 位 CRC 结果
return CRC_FDATA;
}
int main() {
uint8_t id[12] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78};
uint32_t crc32_id = calculate_crc32(id, 12);
while (1);
}
方法 2:软件 CRC-32 计算(无硬件支持时)
c
#include <stdint.h>
uint32_t crc32(const uint8_t *data, uint32_t length) {
uint32_t crc = 0xFFFFFFFF;
for (uint32_t i = 0; i < length; i++) {
crc ^= data[i];
for (uint8_t bit = 0; bit < 8; bit++) {
if (crc & 1) {
crc = (crc >> 1) ^ 0xEDB88320; // 标准 CRC-32 多项式
} else {
crc >>= 1;
}
}
}
return ~crc;
} |