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

关于stm32的硬件CRC32与U盘分区中的CRC32计算方式不同的探索;stm32的硬件CRC32的使用细节;stm32的硬件CRC32的问题;

背景

在我准备使用32对U盘进行格式化时,其中涉及到分区表的CRC32校验值的填写,为了节约时间,我准备使用stm32上自带的CRC32校验单元;

但是在经过Demo测试后,发现32的CRC校验算法并非普通的CRC,而是CRC-32/MPEG-2算法 

这两个算法的区别可以使用下面的网站自行测试

CRC(循环冗余校验)在线计算_ip33.com

发现

这里探索一下他们加密的细节和区别

假设我们校验11223344,即0x44332211

使用网站测试:

CRC-32/MPEG-2网站测试为:        B14257CC

CRC网站测试为:                        77F29DD1

使用stm32测试:

//要校验的数据
uint8_t sector2[4] = {
	0x11, 0x22, 0x33, 0x44,
};

//转换大端32位
  uint32_t sector_uint32;
  sector_uint32 = (sector2[0] << 24) | (sector2[1] << 16) | (sector2[2] << 8) | sector2[3];

  
  //校验
  uint32_t ret = HAL_CRC_Calculate(&hcrc , &sector_uint32, 1);
  //输出查看
  printf("\r\n%02X\r\n", ret);


  printf("\r\n%02X", ((uint8_t*)&ret)[0]);
  printf("\r\n%02X", ((uint8_t*)&ret)[1]);
  printf("\r\n%02X", ((uint8_t*)&ret)[2]);
  printf("\r\n%02X", ((uint8_t*)&ret)[3]);

结果为

B14257CC


CC
57
42
B1

经过对比,可知,在字节数组中11,22,33,44的顺序,需要倒序后才能交给CRC校验处理,处理结果为正常的小端数据。

由此,我们重新对代码修改,将大小端转换优化,使用hal库自带的大小端转换

宏:_REV

此宏即可将32位的数据翻转

置于代码如下
 

uint32_t HAL_CRC_Calculate_Rev(CRC_HandleTypeDef *hcrc, uint32_t pBuffer[], uint32_t BufferLength)
{
    uint32_t index;      /* CRC input data buffer index */
    uint32_t temp = 0U;  /* CRC output (read from hcrc->Instance->DR register) */
 
    /* Change CRC peripheral state */
    hcrc->State = HAL_CRC_STATE_BUSY;
 
    /* Reset CRC Calculation Unit (hcrc->Instance->INIT is
    *  written in hcrc->Instance->DR) */
    __HAL_CRC_DR_RESET(hcrc);
 
    /* Enter 32-bit input data to the CRC calculator */
    for (index = 0U; index < BufferLength; index++)
    {
      hcrc->Instance->DR =__REV( pBuffer[index]);   //添加了__REV将字翻转
    }
    temp = hcrc->Instance->DR;
 
    /* Change CRC peripheral state */
    hcrc->State = HAL_CRC_STATE_READY;
 
    /* Return the CRC computed value */
    return temp;
 
 
}

之后就不需要使用(sector2[0] << 24) | (sector2[1] << 16) | (sector2[2] << 8) | sector2[3];

来翻转了

结论:

虽然探索完了stm32硬件CRC但是这个校验方式与U盘分区的CRC校验完全不符,无法使用

本次作为学习记录

如有错误,敬请指正;


http://www.kler.cn/news/283311.html

相关文章:

  • gin 通过 OpenTelemetry 实现链路追踪
  • 上新!Matlab实现基于QRGRU-Attention分位数回归门控循环单元注意力机制的时间序列区间预测模型
  • 数学基础 -- 线性代数之增广矩阵
  • Redis缓存穿透、缓存击穿与缓存雪崩的详细讲解和案例示范
  • 【WiFi协议的发展学习1】
  • SpringTask定时任务笔记
  • 仿BOSS招聘系统开发:构建高效、智能的在线招聘平台
  • Hadoop集群运维管理
  • OZON新品藏品,OZON收藏品推荐
  • LeetCode - 4 寻找两个正序数组的中位数
  • Pytorch 自动微分注意点讲解
  • 在 MySQL 中使用 `REPLACE` 函数
  • python实现蚁群算法
  • Google 插件推荐 50 个
  • 【数据库】两个集群数据实现同步方案
  • Python配置管理工具库之hydra使用详解
  • 机器学习—线性回归算法(Linear Regression)
  • 图结构与高级数据结构的学习笔记一
  • 语言的数据访问
  • 高性能4G灯杆网关,未来智慧城市的神经中枢
  • 【LeetCode面试150】——54螺旋矩阵
  • React Hooks 的高级用法
  • LuaJit分析(八)LuaJit预编译库函数加载过程
  • 【秋招笔试】8.21华为秋招-三语言题解
  • 算法训练营|图论第4天 110.字符串接龙 105.有向图的完全可达性 106.岛屿的周长
  • 网络原理 TCP与UDP协议
  • 本地构建spotbugs,替换gradle的默认仓库地址。
  • chapter08-面向对象编程——(Object类详解)——day09
  • 【C++ Primer Plus习题】7.5
  • Docker方式部署K8s集群