[软件资料] 硬件循环冗余校验(CRC)模块

[复制链接]
 楼主| forgot 发表于 2025-5-15 11:42 | 显示全部楼层 |阅读模式
CRC是一种错误检测码,用于检测数据传输或存储中的意外更改。它通过对数据应用特定的算法生成一个固定长度的校验值。这个校验值附加在数据后面,接收方可以重新计算CRC并与接收到的校验值比较,以验证数据完整性。
示例代码(基于库函数)

  1. #include "cw32f030_crc.h"

  2. void CRC_Configuration(void) {
  3.     CRC_InitTypeDef CRC_InitStruct;

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

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

  18. int main() {
  19.     CRC_Configuration();
  20.     uint8_t test_data[] = "123456789";
  21.     uint32_t crc = Calculate_CRC(test_data, sizeof(test_data)-1); // 计算CRC
  22.     // 预期结果:0xCBF43926
  23.     while(1);
  24. }
lidi911 发表于 2025-5-15 21:01 来自手机 | 显示全部楼层
现在MCU一般都内置了硬件CRC
huquanz711 发表于 2025-5-17 14:58 来自手机 | 显示全部楼层
硬件CRC比软件计算速率要快得多

评论

有的MCU没有硬件的  发表于 2025-5-19 09:30
szt1993 发表于 2025-5-18 20:34 | 显示全部楼层
CRC是一种错误检测码

评论

保证正确率的  发表于 2025-5-19 09:30
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校验。对于嵌入式系统来说,这种校验是非常重要的。
蚊子的噩梦 发表于 2025-5-24 22:56 | 显示全部楼层
这个示例代码非常实用,它展示了如何在硬件层面使用CRC来确保数据的完整性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2064

主题

14488

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部

2064

主题

14488

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部