当前位置: 首页 > news >正文

STM32F407VET6实战:CRC校验

        CRC校验在数据传输快,且量大的时候使用。下面是STM32F407VET6HAL库使用CRC校验的思路。

步骤实现:

  1. CubeMX配置

c

// 在CubeMX中启用CRC模块
// AHB总线时钟自动启用
  1. HAL库代码

c

// 初始化(main函数中)
CRC_HandleTypeDef hcrc;
hcrc.Instance = CRC;
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; // 固定多项式0x04C11DB7
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;  // 初始值0xFFFFFFFF
HAL_CRC_Init(&hcrc);// 数据计算(32位对齐数据)
uint32_t data[] = {0x31323334}; // "1234"的ASCII十六进制形式
uint32_t crc = HAL_CRC_Calculate(&hcrc, data, 1); // 返回0x6F91C7CA// 适配标准CRC32
crc = ~crc; // 取反后得到0x906E3835

关键细节:

  1. 非对齐数据处理

c

uint8_t bytes[] = {1,2,3,4,5};
uint32_t tmp[2] = {0};
memcpy(tmp, bytes, 5); // 自动填充0到8字节
crc = ~HAL_CRC_Calculate(&hcrc, tmp, 2);
  1. 字节序修正

c

// 当数据源为大端序时:
uint32_t data_be = __REV(*(uint32_t*)bytes); // 字节序反转
crc = ~HAL_CRC_Calculate(&hcrc, &data_be, 1);
  1. 验证工具对比

c

// 使用在线CRC计算器验证
// 输入:ASCII "1234",选择CRC32/MPEG-2模式
// 输出:0x906E3835(与代码结果一致)

优化建议:

  • 大数据块采用DMA模式(HAL_CRC_Calculate_DMA)
  • 局部更新用HAL_CRC_Accumulate函数
  • 使用__CRC_DR寄存器直接访问加速计算

差异对照表:

项目STM32硬件CRC标准CRC32
多项式0x04C11DB70xEDB88320
初始值0xFFFFFFFF0xFFFFFFFF
结果处理需取反(~)直接使用
输入反射

相关文章:

  • 编译原理概述
  • [前端] wang 富文本 vue3
  • PCIe Switch 问题点
  • 背包问题详解
  • 蓝牙AVRCP协议概述
  • (网络文件系统)N
  • ACM模式用Scanner和System.out超时的解决方案和原理
  • FC7300 IO 无法正常输出高低电平问题排查
  • Elasticsearch/OpenSearch 中doc_values的作用
  • 统信操作系统自定义快捷键配置音量调节功能指南
  • 第六章 进阶10 实习生的焦虑
  • AI 编程 “幻觉” 风险频发?飞算 JavaAI 硬核技术筑牢安全防线
  • 龙虎榜——20250516
  • 香港 GPU 服务器优势及使用场景解析
  • Python开源项目月排行 2025年4月
  • FC7300 Clock介绍
  • LocaleContextResolver实现多语言切换-笔记
  • MySQL8新特性
  • 通过python安装小智语音服务器端
  • window nvidia-smi命令 Failed to initialize NVML: Unknown Error
  • 李伟任山东省委常委、省纪委书记
  • 乌克兰官员与法德英美四国官员举行会谈
  • 烤肉店从泔水桶内捞出肉串再烤?西安未央区市监局:停业整顿
  • 中方是否计划解除或调整稀土出口管制?外交部回应
  • 泽连斯基:乌代表团已启程,谈判可能于今晚或明天举行
  • 华东政法与复旦上医签署合作框架协议,医学与法学如何交叉融合?