STM32的CRC检验函数

#include "crc_cfg.h"
 
//---CRC32表
const UINT32_T  crc32Tab[256] =
{
	0x00000000,0x04C11DB7,0x09823B6E,0x0D4326D9,0x130476DC,0x17C56B6B,0x1A864DB2,0x1E475005,
	0x2608EDB8,0x22C9F00F,0x2F8AD6D6,0x2B4BCB61,0x350C9B64,0x31CD86D3,0x3C8EA00A,0x384FBDBD,
	0x4C11DB70,0x48D0C6C7,0x4593E01E,0x4152FDA9,0x5F15ADAC,0x5BD4B01B,0x569796C2,0x52568B75,
	0x6A1936C8,0x6ED82B7F,0x639B0DA6,0x675A1011,0x791D4014,0x7DDC5DA3,0x709F7B7A,0x745E66CD,
	0x9823B6E0,0x9CE2AB57,0x91A18D8E,0x95609039,0x8B27C03C,0x8FE6DD8B,0x82A5FB52,0x8664E6E5,
	0xBE2B5B58,0xBAEA46EF,0xB7A96036,0xB3687D81,0xAD2F2D84,0xA9EE3033,0xA4AD16EA,0xA06C0B5D,
	0xD4326D90,0xD0F37027,0xDDB056FE,0xD9714B49,0xC7361B4C,0xC3F706FB,0xCEB42022,0xCA753D95,
	0xF23A8028,0xF6FB9D9F,0xFBB8BB46,0xFF79A6F1,0xE13EF6F4,0xE5FFEB43,0xE8BCCD9A,0xEC7DD02D,
	0x34867077,0x30476DC0,0x3D044B19,0x39C556AE,0x278206AB,0x23431B1C,0x2E003DC5,0x2AC12072,
	0x128E9DCF,0x164F8078,0x1B0CA6A1,0x1FCDBB16,0x018AEB13,0x054BF6A4,0x0808D07D,0x0CC9CDCA,
	0x7897AB07,0x7C56B6B0,0x71159069,0x75D48DDE,0x6B93DDDB,0x6F52C06C,0x6211E6B5,0x66D0FB02,
	0x5E9F46BF,0x5A5E5B08,0x571D7DD1,0x53DC6066,0x4D9B3063,0x495A2DD4,0x44190B0D,0x40D816BA,
	0xACA5C697,0xA864DB20,0xA527FDF9,0xA1E6E04E,0xBFA1B04B,0xBB60ADFC,0xB6238B25,0xB2E29692,
	0x8AAD2B2F,0x8E6C3698,0x832F1041,0x87EE0DF6,0x99A95DF3,0x9D684044,0x902B669D,0x94EA7B2A,
	0xE0B41DE7,0xE4750050,0xE9362689,0xEDF73B3E,0xF3B06B3B,0xF771768C,0xFA325055,0xFEF34DE2,
	0xC6BCF05F,0xC27DEDE8,0xCF3ECB31,0xCBFFD686,0xD5B88683,0xD1799B34,0xDC3ABDED,0xD8FBA05A,
	0x690CE0EE,0x6DCDFD59,0x608EDB80,0x644FC637,0x7A089632,0x7EC98B85,0x738AAD5C,0x774BB0EB,
	0x4F040D56,0x4BC510E1,0x46863638,0x42472B8F,0x5C007B8A,0x58C1663D,0x558240E4,0x51435D53,
	0x251D3B9E,0x21DC2629,0x2C9F00F0,0x285E1D47,0x36194D42,0x32D850F5,0x3F9B762C,0x3B5A6B9B,
	0x0315D626,0x07D4CB91,0x0A97ED48,0x0E56F0FF,0x1011A0FA,0x14D0BD4D,0x19939B94,0x1D528623,
	0xF12F560E,0xF5EE4BB9,0xF8AD6D60,0xFC6C70D7,0xE22B20D2,0xE6EA3D65,0xEBA91BBC,0xEF68060B,
	0xD727BBB6,0xD3E6A601,0xDEA580D8,0xDA649D6F,0xC423CD6A,0xC0E2D0DD,0xCDA1F604,0xC960EBB3,
	0xBD3E8D7E,0xB9FF90C9,0xB4BCB610,0xB07DABA7,0xAE3AFBA2,0xAAFBE615,0xA7B8C0CC,0xA379DD7B,
	0x9B3660C6,0x9FF77D71,0x92B45BA8,0x9675461F,0x8832161A,0x8CF30BAD,0x81B02D74,0x857130C3,
	0x5D8A9099,0x594B8D2E,0x5408ABF7,0x50C9B640,0x4E8EE645,0x4A4FFBF2,0x470CDD2B,0x43CDC09C,
	0x7B827D21,0x7F436096,0x7200464F,0x76C15BF8,0x68860BFD,0x6C47164A,0x61043093,0x65C52D24,
	0x119B4BE9,0x155A565E,0x18197087,0x1CD86D30,0x029F3D35,0x065E2082,0x0B1D065B,0x0FDC1BEC,
	0x3793A651,0x3352BBE6,0x3E119D3F,0x3AD08088,0x2497D08D,0x2056CD3A,0x2D15EBE3,0x29D4F654,
	0xC5A92679,0xC1683BCE,0xCC2B1D17,0xC8EA00A0,0xD6AD50A5,0xD26C4D12,0xDF2F6BCB,0xDBEE767C,
	0xE3A1CBC1,0xE760D676,0xEA23F0AF,0xEEE2ED18,0xF0A5BD1D,0xF464A0AA,0xF9278673,0xFDE69BC4,
	0x89B8FD09,0x8D79E0BE,0x803AC667,0x84FBDBD0,0x9ABC8BD5,0x9E7D9662,0x933EB0BB,0x97FFAD0C,
	0xAFB010B1,0xAB710D06,0xA6322BDF,0xA2F33668,0xBCB4666D,0xB8757BDA,0xB5365D03,0xB1F740B4
};
 
//---全局变量定义
CRC_HandlerType  g_CRC;
pCRC_HandlerType pCRC = &g_CRC;
 
///
//函		数: 
//功		能: 
//输入参数: 
//输出参数: 
//说		明: 
//
void CRC32_Init(UINT8_T isHW)
{
	CRC32_DeInit(isHW);
	if (isHW)
	{
		//---使能CRC模块的总线时钟
		LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_CRC);
	}
	else
	{
		//---不使能CRC模块的总线时钟
		LL_AHB1_GRP1_DisableClock(LL_AHB1_GRP1_PERIPH_CRC);
	}
	pCRC->msg8BitsTask = NULL;
	pCRC->msg32BitsTask = NULL;
}
 
///
//函		数: 
//功		能: 
//输入参数: 
//输出参数: 
//说		明: 
//
void CRC32_DeInit(UINT8_T isHW)
{
	if (isHW)
	{
		LL_CRC_DeInit(CRC);
	}
}
 
///
//函		数: 
//功		能: 
//输入参数: 
//输出参数: 
//说		明: 
//
void CRC32_HWReSet(void)
{
	//---复位CRC
	LL_CRC_ResetCRCCalculationUnit(CRC);
}
 
///
//函		数: 
//功		能: 
//输入参数: 
//输出参数: 
//说		明: 
//
UINT32_T CRC32_Revbit(UINT32_T uData)
{
	UINT32_T uRevData = 0, uIndex = 0;
	uRevData |= ((uData >> uIndex) & 0x01);
	for (uIndex = 1;uIndex < 32;uIndex++)
	{
		uRevData <<= 1;
		uRevData |= ((uData >> uIndex) & 0x01);
	}
	return uRevData;
}
 
///
//函		数: 
//功		能: 硬件计算CRC的值
//输入参数: 
//输出参数: 
//说		明: 
//
UINT32_T CRC32_HWGetCalc8BitsData(UINT8_T *pVal, UINT32_T length)
{
	UINT32_T uIndex = 0, uData = 0;
	//---复位CRC模块
	CRC32_HWReSet();
	//---计算CRC值
	for (uIndex=0;uIndex<length;uIndex++)
	{
		//---强制转换为4字节数据
		uData = (UINT32_T)pVal[uIndex];
		//---计算CRC
		LL_CRC_FeedData32(CRC, uData);
	}
	//---返回计算结果
	return LL_CRC_ReadData32(CRC);
}
 
///
//函		数: 
//功		能: 
//输入参数: 
//输出参数: 
//说		明: 
//
UINT32_T CRC32_HWGetCalc323BitsData(UINT32_T *pVal, UINT32_T length)
{
	UINT32_T uIndex = 0, uData = 0;
	//---复位CRC模块
	CRC32_HWReSet();
	//---计算CRC值
	for (uIndex = 0;uIndex < length;uIndex++)
	{
		//---强制转换为4字节数据
		uData = pVal[uIndex];
		//---计算CRC
		LL_CRC_FeedData32(CRC, uData);
	}
	//---返回计算结果
	return LL_CRC_ReadData32(CRC);
}
 
///
//函		数: 
//功		能: 软件查表进行CRC32计算
//输入参数: 
//输出参数: 
//说		明: 
//
UINT32_T CRC32_SWGetCalc8BitsData(UINT8_T *pVal, UINT32_T length)
{
	UINT32_T nReg= 0xFFFFFFFF;//CRC寄存器
	UINT32_T nTemp = 0;
	UINT32_T byteIndex=0, uIndex=0;
	//---开始计算CRC32的值
	for (uIndex = 0; uIndex < length; uIndex++)
	{
		//---强制转换为4字节数据
		nReg ^= (UINT32_T)pVal[uIndex];
		//---4字节数据计算
		for (byteIndex = 0; byteIndex < 4; byteIndex++)
		{
			//---取一个字节,查表
			nTemp = crc32Tab[((nReg >> 24& 0xFF)]; 
			//---丢掉计算过的头一个BYTE
			nReg <<= 8; 
			//---与前一个BYTE的计算结果异或
			nReg ^= nTemp; 
		}
	}
	return nReg;
}
 
///
//函		数: 
//功		能: 
//输入参数: 
//输出参数: 
//说		明: 
//
UINT32_T CRC32_SWGetCalc32BitsData(UINT32_T *pVal, UINT32_T length)
{
	UINT32_T nReg = 0xFFFFFFFF;//CRC寄存器
	UINT32_T nTemp = 0;
	UINT32_T byteIndex = 0, uIndex = 0;
	//---开始计算CRC32的值
	for (uIndex = 0; uIndex < length; uIndex++)
	{
		//---强制转换为4字节数据
		nReg ^= pVal[uIndex];
		//---4字节数据计算
		for (byteIndex = 0; byteIndex < 4; byteIndex++)
		{
			//---取一个字节,查表
			nTemp = crc32Tab[((nReg >> 24& 0xFF)];
			//---丢掉计算过的头一个BYTE
			nReg <<= 8;
			//---与前一个BYTE的计算结果异或
			nReg ^= nTemp;
		}
	}
	return nReg;
}
 
#ifndef CRC_CFG_H
#define CRC_CFG_H
//
#include "complier_lib.h"
//---消息结构体
typedef struct  _CRC_HandlerType				CRC_HandlerType;
//---指针消息结构体
typedef struct  _CRC_HandlerType				*pCRC_HandlerType;
//---结构定义
struct _CRC_HandlerType
{
	UINT32_T(*msg8BitsTask)(UINT8_T *pVal, UINT32_T length);
	UINT32_T(*msg32BitsTask)(UINT32_T *pVal, UINT32_T length);
};
 
//---提供外部调用的结构
extern CRC_HandlerType g_CRC;
extern pCRC_HandlerType pCRC;
 
//---函数定义
void CRC32_Init(UINT8_T isHW);
void CRC32_DeInit(UINT8_T isHW);
UINT32_T CRC32_HWGetCalc8BitsData(UINT8_T *pVal, UINT32_T length);
UINT32_T CRC32_HWGetCalc323BitsData(UINT32_T *pVal, UINT32_T length);
UINT32_T CRC32_SWGetCalc8BitsData(UINT8_T *pVal, UINT32_T length);
UINT32_T CRC32_SWGetCalc32BitsData(UINT32_T *pVal, UINT32_T length);
//
#endif /* CRC_CFG_H */

### 回答1: STM32是一款基于ARM架构的微控制器系列,该系列支持硬件计算CRC校验。HAL库是STM32系列微控制器的基础库之一,它提供了一组函数库,使开发人员可以更方便地操控STM32的底层硬件。在使用HAL库进行CRC计算时,可以通过以下步骤实现: 1.初始化CRC计算器:首先,需要初始化CRC计算器的参数,包括校验位长度、多项式和初始的校验值等等。可以使用HAL_CRC_Init函数完成初始化。 2.输入待校验数据:将需要进行CRC校验数据输入到计算器中,可以使用HAL_CRC_Accumulate函数对待校验数据逐次进行计算。 3.获取校验结果:使用HAL_CRC_Calculate函数获得校验结果,同时也可以使用HAL_CRC_CalculateBlock函数对连续的一段数据进行校验。 总之,通过使用STM32CRC功能和HAL库,可以快速、准确地完成CRC校验。这是通讯协议以及数据传输领域中十分重要的功能,可以保障数据传输的准确性和稳定性。 ### 回答2: STM32是意法半导体推出的一系列32位微控制器系列,它的独特之处在于它拥有能够为用户提供硬件加速支持的高效的HAL(硬件抽象层)库。 CRC(循环冗余校验)是一种用于检测或校验数据传输的完整性的技术,通常用于网络协议和存储介质。 在STM32 HAL库中,CRC模块提供了兼容不同通信标准(包括CCITT、ISO、IEEE802.3和CRC-32等)的硬件支持。它提供了一组用于通过输入数据计算CRC校验和的API,输出结果可以是16位或32位的校验和值。 使用STM32 HAL库内置的CRC模块可以大大提高数据完整性校验的速度和效率,尤其是在处理大量或频繁的数据时。开发者可以方便地调用库函数来进行CRC校验,避免了手动计算CRC校验和的麻烦。此外,由于CRC模块是由硬件来支持,所以它的效率也远高于软件实现。 总之,借助于STM32 HAL库中内置的CRC模块,开发者可以轻松地实现高效的数据完整性校验,这对于很多应用场景(如通信、存储介质等)都非常重要。 ### 回答3: STM32是一款用于开发嵌入式系统的微控制器。CRC是一种循环冗余校验算法,它可以对数据进行一定的处理,使得数据传输的可靠性更高。而HAL是STM32提供的硬件抽象层,它能够帮助开发人员更方便地使用STM32的硬件资源。 在STM32的HAL中,CRC算法是非常容易实现的。开发人员只需要调用HAL_CRC_Init()函数初始化CRC处理器,并使用HAL_CRC_Accumulate()函数将需要计算的数据传递给CRC处理器即可。最后,调用HAL_CRC_Calculate()函数,CRC处理器会返回计算后的结果。 除了以上提到的函数,HAL还提供了其它的一系列函数,比如:HAL_CRC_Polynomial_Set()用于设置多项式,HAL_CRC_StateTypeDef用于描述CRC处理器的状态等等。 总之,使用STM32的HAL可以让开发人员更加方便地使用STM32的硬件资源,而CRC算法则可以帮助开发人员提高数据传输的可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值