STM32完全学习——CRC校验

一、STM32F407CRC校验的补充

由于STM32F407的CRC校验,并没有什么配置的选项,就会导致他只能进行32位,且初始值是0XFFFFFFFF,输入和输出都没有反转的CRC校验。为了弥补这些不足点,于是自己编写函数来增加这些功能

cpp 复制代码
//输入反转 函数如果需要输入反转就先调用这个将输入的数据先进行反转 
//每个字节按位反转  注意一个字节是8位 
void Byte_Reversal(uint32_t *buf, uint32_t length)
{
	uint32_t temp = 0;
	uint8_t i = 0, j = 0, k = 0;
	for (i=0; i<length; i++)
	{
		for (j=0; j<=24; j+=8)
		{
			temp = (buf[i] >> j) & 0xff;
			for (k=0; k<8; k++)
			{
				temp |= ((temp & (0x01 << k)) << (15 - 2*k));
			}
			temp >>= 8;
			buf[i] &= ~(0x000000ff << j); 
			buf[i] |= (temp << j);
		}
		
	}

	
}

//也就是CRC校验完成之后输出是否进行反转的函数 整个数据按位反转
//这个函数要在计算结果之后 异或之前进行调用
uint32_t Bits_Reversal(uint32_t buf)
{
	uint32_t temp = 0;
	uint8_t k = 0;
	for (k=0; k<32; k++)
	{	
		temp |= (((buf >> k) & 0x01) << (31 - k));
	}
	return temp;
}

//输出结果异或  这个是最后执行的,放在输出结果反转的后面就行
//yihuo 需要异或的值
uint32_t Result_Xor(uint32_t num, uint32_t yihuo)
{
	
	return (num ^ yihuo);
	
}
cpp 复制代码
Byte_Reversal(buf, 2);               //输入结果反转
result = HAL_CRC_Calculate(&hcrc, buf, 2);   //进行CRC校验
result = Result_Xor(Bits_Reversal(result), 0xffffffff);  //输出结果反转 并进行异或
printf("result = %X\n", result);   
相关推荐
名字不要太长 像我这样就好4 小时前
【iOS】OC源码阅读——alloc源码分析
笔记·学习·macos·ios·objective-c
bloxd yzh5 小时前
简易版2D我的世界C++程序(有点BUG,但是可以玩!!!)
stm32·单片机·嵌入式硬件
conkl5 小时前
如何初入学习编程包含学习流程图
学习·流程图
yt948328 小时前
STM32裸机编程架构与思路
单片机·嵌入式硬件
FAREWELL000758 小时前
C#进阶学习(十六)C#中的迭代器
开发语言·学习·c#·迭代器模式·迭代器
DXM05219 小时前
牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例
开发语言·笔记·学习·arcgis·c#·ae·arcgis engine
qsmyhsgcs10 小时前
Java程序员转人工智能入门学习路线图(2025版)
java·人工智能·学习·机器学习·算法工程师·人工智能入门·ai算法工程师
Humbunklung11 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRectF)
笔记·python·学习·pyqt
每次的天空12 小时前
Android学习总结之Java篇(一)
android·java·学习
夜月yeyue12 小时前
STM32 USB配置详解
stm32·单片机·嵌入式硬件