STM32F407VET6实战:CRC校验

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

步骤实现:

  1. CubeMX配置

c

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

c

cpp 复制代码
// 初始化(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

cpp 复制代码
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

cpp 复制代码
// 当数据源为大端序时:
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
多项式 0x04C11DB7 0xEDB88320
初始值 0xFFFFFFFF 0xFFFFFFFF
结果处理 需取反(~) 直接使用
输入反射
相关推荐
12.=0.12 小时前
【stm32_3】嵌入式软件系统架构
stm32·单片机·嵌入式硬件
会编程的小孩13 小时前
优先级与抢占实验
stm32·单片机
風清掦13 小时前
【江科大STM32学习笔记-10】I2C通信协议 - 10.1 软件I2C读写MPU6050
笔记·stm32·单片机·嵌入式硬件·物联网·学习
无垠的广袤14 小时前
【Titan RA8P1 Board】MNIST 数字识别
人工智能·单片机·瑞萨·mnist·数字识别·ra8p1·ruhmi
无垠的广袤14 小时前
【Titan RA8P1 Board】PyOCD 调试
单片机·嵌入式硬件·调试器
BackCatK Chen15 小时前
STM32保姆级入门教程|第6章:定时器中断原理 + 精准LED闪烁(1s_2s_3s)实战(功能超详细+CubeIDE手把手)
stm32·stm32cubeide·定时器中断·嵌入式入门·tim2·led精准闪烁·中断回调函数
水果里面有苹果15 小时前
24-NT5CC128M16IP-DI DDR3芯片 2Gbit
嵌入式硬件
橙露15 小时前
STM32 定时器与 PWM 输出:电机调速、LED 呼吸灯实战
stm32·单片机·嵌入式硬件
youcans_15 小时前
【FOC-MBD】(19)反 Park 坐标变换链路
stm32·单片机·嵌入式硬件·simulink·代码生成
国科安芯16 小时前
面向商业航天的高可靠电机控制系统:从环境约束到芯片实现
单片机·嵌入式硬件·架构·risc-v·安全性测试