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

STM32F407VET6的HAL库使用CRC校验的思路

        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
结果处理需取反(~)直接使用
输入反射
http://www.xdnf.cn/news/483967.html

相关文章:

  • React文件上传组件封装全攻略
  • WEB安全--Java安全--shiro550反序列化漏洞
  • Linux——UDP/TCP协议理论
  • 利用Python高效整理猫狗数据集训练集与验证集(附源码讲解)
  • 技术书籍推荐(001)
  • 硬件中的OID是什么?SNMP如何通过OID获取信息?——用“图书馆”比喻彻底讲清底层原理-优雅草卓伊凡|小无
  • makefile细节说明
  • 在 VSCode 中运行 Vue.js 项目
  • 抛物线运动路径动画实现
  • Android framework 中间件开发(三)
  • 高效管理嵌套Git仓库:三合一脚本解决方案
  • 【AI】CUDA 是如何成功的?(AI 计算的民主化,第 3 部分)
  • MOS管、三极管与IGBT管的原理与应用全面对比
  • 如何解决Move to iOS 不起作用的问题?
  • Yocto Project 快速构建
  • 将单链表反转【数据结构练习题】
  • 机器学习入门之KNN算法和交叉验证与超参数搜索(三)
  • 如何在一台环境中同时安装ragflow和ragflow-plus
  • PCL 绘制二次曲面
  • Golang基于反射的ioctl实现
  • 鸿蒙5.0项目开发——鸿蒙天气项目的实现(主页2)
  • HarmonyOS 开发之 —— 合理使用动画与转场
  • userfaultfd内核线程D状态问题排查
  • 数学实验(Matlab编程基础)
  • Flutter - 集成三方库:日志(logger)
  • 【深度学习】#11 优化算法
  • 麒麟服务器操作系统安装 MySQL 8 实战指南
  • EC800X_DP-DTU-Q600R 系列开发板介绍
  • QML 动画控制、顺序动画与并行动画
  • 25考研经验贴(11408)