STM32硬件CRC32问题记录
前言:STM32硬件本身没有问题,只是其中的校验值计算方式跟平常的不太一样
- 硬件平台
- 我使用的是STM32F103ZET6单片机,用cubeMX新建的工程(使能crc即可加载\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c文件)
- CRC特性介绍(文档内容来自STM32中文参考手册)
- CRC32详细介绍请查看文档
- 软件平台
- 方法一:使用cubeMX初始化硬件CRC
- 方法二:手动添加文件并初始化硬件CRC
- 打开#define HAL_CRC_MODULE_ENABLED,在.\Core\Inc\stm32f1xx_hal_conf.h中第42行
- 添加源文件stm32f1xx_hal_crc.c到工程中
- 再主函数添加初始化程序
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问题记录相关推荐
- STM32硬件SPI控制TM1638 按键数码管LED显示模块
STM32硬件SPI控制TM1638按键数码管LED显示模块 从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...
- 使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911)
使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911) 初始化代码 /** @brief GT911 初始化程序* @param None* @retval None*/ void GT9 ...
- STM32之QSPI调试记录
STM32之QSPI调试记录 先声明一下,STM32的QSPI外设同样支持单线模式(兼容普通spi),只是相比普通的spi少了一些特性(比如只支持模式0和3.不能LSB发送等),但是用来操作flash ...
- STM32硬件IIC的BUG问题
问题描述 大概是这样,使用STM32硬件IIC作为主机通讯,只要不发送错误的从机地址, 通讯一直都是没问题的,因为验证程序的关系,所以在程序中修改了一下从机地址, 这时候就出现了问题,下面直接看图把 ...
- 12. STM32——硬件IIC驱动OLED屏幕显示
STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...
- stm32 硬件IIC使用方法说明与示例---LIS3DH的IIC通信
有时我们可能需要MCU进行速率较高的IIC总线通信,一般stm32的IIC默认传输速率是100kpbs,最大为400kpbs.现在大部分项目会使用程序IO模拟的IIC,使用方便,具体网上例子很多. 这 ...
- 嵌入式开发-STM32硬件SPI驱动TFT屏
嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...
- 基于stm32硬件IIC的oled显示
一 stm32硬件IIC 硬件IIC特性架构 ①通讯引脚 查看对应开发板芯片的原理图可以查看对应IIC外设引脚的位置 这里代码采用的是stm32f103c8t6,硬件IIC的外设引脚为PB6 PB7, ...
- STM32硬件SPI驱动OLED
文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...
最新文章
- NoneBot2插件——今日人品
- java中高级大公司多线程面试题
- Oracle connet by prior 关键字的简单介绍和用法
- Linux字符界面和图形界面
- javaScript转换日期合格式
- LDAP命令介绍---dsreplication--initialize
- 案例 体检套餐管理系统 需求一览 c# 1614099219
- 遇上放养型导师,论文就业该咋办?
- js delete删除对象属性,delete删除不了变量及原型链中的变量
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
- (转)WebApi发送HTML表单数据:文件上传与多部分MIME
- BUG--tomcat更改目录失败
- JNI新旧两种方式不冲突,可以共存
- python 通达信k线_python日线通达信,通达信 主图默认显示每只股票上市以来所有日线...
- 关于做PDF的FAQ(一)~(四)
- SpringBoot mysql房屋租赁系统4.0 租房系统源码(包远程安装
- JS 判断元素父子关系
- python画太阳花代码
- scl函数C语言,SCL语言基本语法规则:表达式
- 剑网3服务器地理位置,玩家理智分析服务器设置及地域划分
热门文章
- TCPDF:html文件转pdf格式
- Debeaver导入csv文件后处理乱码与数字型转varchar丢失精度问题
- [架构之路-39]:目标系统 - 系统软件 - Linux OS内核进程/线程调度的基本原理
- 工赋开发者社区 | MES/MOM系统的几种主流系统集成方式
- 预备知识---java之泛型的探索
- Hive学习——单机版Hive的安装
- Visual Assist 破解失效的解决方案
- 2022年R1快开门式压力容器操作考试题库及R1快开门式压力容器操作免费试题
- 分片公链之王 - NEAR项目研究报告
- python用tkinter实现qq_Python+Tkinter 密保小工具-阿里云开发者社区