前言:STM32硬件本身没有问题,只是其中的校验值计算方式跟平常的不太一样

  1. 硬件平台

    1. 我使用的是STM32F103ZET6单片机,用cubeMX新建的工程(使能crc即可加载\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c文件)
    2. CRC特性介绍(文档内容来自STM32中文参考手册)
    3. CRC32详细介绍请查看文档
  2. 软件平台
    1. 方法一:使用cubeMX初始化硬件CRC
    2. 方法二:手动添加文件并初始化硬件CRC
      1. 打开#define HAL_CRC_MODULE_ENABLED,在.\Core\Inc\stm32f1xx_hal_conf.h中第42行
      2. 添加源文件stm32f1xx_hal_crc.c到工程中
      3. 再主函数添加初始化程序
    CRC_HandleTypeDef hcrc;/* CRC32初始化函数 */
    static void MX_CRC_Init(void);/* 软件方式计算CRC32-STM32 */
    uint32_t uiCRC32_STM32(uint32_t *puiInitCRC, uint32_t *pucDataBuff, uint32_t uiLength)
    {uint32_t uiPolynomial = 0x04C11DB7, uiInputCRC = 0xFFFFFFFF, i = 0, xbit = 0x80000000, uiMask = 0, uiDataTemp = 0;if(puiInitCRC != NULL)uiInputCRC = *puiInitCRC;for(i = 0; i < uiLength; ++i){uiDataTemp = *pucDataBuff++;xbit = 0x80000000;for(uiMask = 1; uiMask; uiMask <<= 1){if(uiInputCRC & 0x80000000)uiInputCRC = (uiInputCRC << 1) ^ uiPolynomial;elseuiInputCRC <<= 1;if(uiDataTemp & xbit)uiInputCRC ^= uiPolynomial;xbit >>= 1;}}return uiInputCRC;
    }uint32_t CRC32 = 0, blen = 0, uiCRC32 = 0;
    void HAL_CRC32_Test(void)
    {/* 第一步,必须使能硬件CRC32 */__HAL_RCC_CRC_CLK_ENABLE();/* 第二步,使用硬件CRC计算CRC32值 */char *pbuf = "SET,123456,50,000164,";blen = strlen(pbuf);CRC32 = HAL_CRC_Calculate(&hcrc, (uint32_t *)pbuf, blen);/* 第三步,对比软件方式去计算CRC32 */uiCRC32 = uiCRC32_STM32(NULL, (uint32_t *)pbuf, blen);/* 第四步, 对比CRC32与uiCRC32, 结果发现值相等 */
    }int main(void)
    {...MX_CRC_Init();/* 计算CRC32 */HAL_CRC32_Test():...
    }/*** @brief CRC Initialization Function* @param None* @retval None*/
    static void MX_CRC_Init(void)
    {/* USER CODE BEGIN CRC_Init 0 *//* USER CODE END CRC_Init 0 *//* USER CODE BEGIN CRC_Init 1 *//* USER CODE END CRC_Init 1 */hcrc.Instance = CRC;if (HAL_CRC_Init(&hcrc) != HAL_OK){Error_Handler();}/* USER CODE BEGIN CRC_Init 2 *//* USER CODE END CRC_Init 2 */}

备注:常用CRC32与CRC32-MPEG2.0计算代码如下

/* 常用CRC32校验算法 */
uint32_t uiReflect(uint32_t uiData, uint8_t ucLength)
{uint32_t uiMask = 1 << (ucLength - 1), uiMaskRef = 1, uiDataReturn = 0;for(; uiMask; uiMask >>= 1){if(uiData & uiMask)uiDataReturn |= uiMaskRef;uiMaskRef <<= 1;}return uiDataReturn;
}uint32_t uiCRC32(uint32_t *puiInitCRC, uint8_t *pucDataBuff, uint32_t uiLength)
{uint32_t uiPolynomial = 0x04C11DB7, uiInputCRC = 0xFFFFFFFF, i = 0;uint8_t ucMask = 0;if(puiInitCRC != NULL)uiInputCRC = *puiInitCRC;uiPolynomial = uiReflect(uiPolynomial, 32);for(i = 0; i < uiLength; ++i){uiInputCRC ^= *pucDataBuff++;for(ucMask = 1; ucMask; ucMask <<= 1){if(uiInputCRC & 1)uiInputCRC = (uiInputCRC >> 1) ^ uiPolynomial;elseuiInputCRC >>= 1;}}return ~uiInputCRC;
}
/* CRC32-MPEG2.0校验算法 */
uint32_t uiCRC32_MPEG2(uint32_t *puiInitCRC, uint8_t *pucDataBuff, uint32_t uiLength)
{uint32_t uiPolynomial = 0x04C11DB7, uiInputCRC = 0xFFFFFFFF, i = 0;uint8_t ucMask = 0;if(puiInitCRC != NULL)uiInputCRC = *puiInitCRC;for(i = 0; i < uiLength; ++i){uiInputCRC ^= (uint32_t)(*pucDataBuff++) << 24;for(ucMask = 1; ucMask; ucMask <<= 1){if(uiInputCRC & 0x80000000)uiInputCRC = (uiInputCRC << 1) ^ uiPolynomial;elseuiInputCRC <<= 1;}}return uiInputCRC;
}

STM32硬件CRC32问题记录相关推荐

  1. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  2. 使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911)

    使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911) 初始化代码 /** @brief GT911 初始化程序* @param None* @retval None*/ void GT9 ...

  3. STM32之QSPI调试记录

    STM32之QSPI调试记录 先声明一下,STM32的QSPI外设同样支持单线模式(兼容普通spi),只是相比普通的spi少了一些特性(比如只支持模式0和3.不能LSB发送等),但是用来操作flash ...

  4. STM32硬件IIC的BUG问题

    问题描述 大概是这样,使用STM32硬件IIC作为主机通讯,只要不发送错误的从机地址, 通讯一直都是没问题的,因为验证程序的关系,所以在程序中修改了一下从机地址, 这时候就出现了问题,下面直接看图把 ...

  5. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

  6. stm32 硬件IIC使用方法说明与示例---LIS3DH的IIC通信

    有时我们可能需要MCU进行速率较高的IIC总线通信,一般stm32的IIC默认传输速率是100kpbs,最大为400kpbs.现在大部分项目会使用程序IO模拟的IIC,使用方便,具体网上例子很多. 这 ...

  7. 嵌入式开发-STM32硬件SPI驱动TFT屏

    嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...

  8. 基于stm32硬件IIC的oled显示

    一 stm32硬件IIC 硬件IIC特性架构 ①通讯引脚 查看对应开发板芯片的原理图可以查看对应IIC外设引脚的位置 这里代码采用的是stm32f103c8t6,硬件IIC的外设引脚为PB6 PB7, ...

  9. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

最新文章

  1. NoneBot2插件——今日人品
  2. java中高级大公司多线程面试题
  3. Oracle connet by prior 关键字的简单介绍和用法
  4. Linux字符界面和图形界面
  5. javaScript转换日期合格式
  6. LDAP命令介绍---dsreplication--initialize
  7. 案例 体检套餐管理系统 需求一览 c# 1614099219
  8. 遇上放养型导师,论文就业该咋办?
  9. js delete删除对象属性,delete删除不了变量及原型链中的变量
  10. ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
  11. (转)WebApi发送HTML表单数据:文件上传与多部分MIME
  12. BUG--tomcat更改目录失败
  13. JNI新旧两种方式不冲突,可以共存
  14. python 通达信k线_python日线通达信,通达信 主图默认显示每只股票上市以来所有日线...
  15. 关于做PDF的FAQ(一)~(四)
  16. SpringBoot mysql房屋租赁系统4.0 租房系统源码(包远程安装
  17. JS 判断元素父子关系
  18. python画太阳花代码
  19. scl函数C语言,SCL语言基本语法规则:表达式
  20. 剑网3服务器地理位置,玩家理智分析服务器设置及地域划分

热门文章

  1. TCPDF:html文件转pdf格式
  2. Debeaver导入csv文件后处理乱码与数字型转varchar丢失精度问题
  3. [架构之路-39]:目标系统 - 系统软件 - Linux OS内核进程/线程调度的基本原理
  4. 工赋开发者社区 | MES/MOM系统的几种主流系统集成方式
  5. 预备知识---java之泛型的探索
  6. Hive学习——单机版Hive的安装
  7. Visual Assist 破解失效的解决方案
  8. 2022年R1快开门式压力容器操作考试题库及R1快开门式压力容器操作免费试题
  9. 分片公链之王 - NEAR项目研究报告
  10. python用tkinter实现qq_Python+Tkinter 密保小工具-阿里云开发者社区