使用内部硬件实现无初始值的CRC校验
This commit is contained in:
parent
f13e600b96
commit
ba6500e60d
37
Sys.cpp
37
Sys.cpp
|
@ -421,23 +421,54 @@ static const uint c_CRCTable[ 256 ] =
|
||||||
0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
|
0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668, 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
|
||||||
};
|
};
|
||||||
|
|
||||||
uint TSys::Crc(const byte* buf, uint len, uint crc)
|
uint TSys::Crc(const void* buf, uint len, uint crc)
|
||||||
{
|
{
|
||||||
|
byte* ptr = (byte*)buf;
|
||||||
while(len-- > 0)
|
while(len-- > 0)
|
||||||
{
|
{
|
||||||
crc = c_CRCTable[ ((crc >> 24) ^ (*buf++)) & 0xFF ] ^ (crc << 8);
|
crc = c_CRCTable[ ((crc >> 24) ^ (*ptr++)) & 0xFF ] ^ (crc << 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
return crc;
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 硬件实现的Crc
|
||||||
|
uint TSys::Crc(const void* buf, uint len)
|
||||||
|
{
|
||||||
|
#ifdef STM32F4
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, ENABLE);
|
||||||
|
#else
|
||||||
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CRC_ResetDR();
|
||||||
|
// STM32的初值是0xFFFFFFFF,而软Crc初值是0
|
||||||
|
//CRC->DR = __REV(crc ^ 0xFFFFFFFF);
|
||||||
|
//CRC->DR = 0xFFFFFFFF;
|
||||||
|
uint* ptr = (uint*)buf;
|
||||||
|
len >>= 2;
|
||||||
|
while(len-- > 0)
|
||||||
|
{
|
||||||
|
CRC->DR =__REV(*ptr++); // 字节顺序倒过来,注意不是位序,不是用__RBIT指令
|
||||||
|
}
|
||||||
|
uint crc = CRC->DR;
|
||||||
|
|
||||||
|
#ifdef STM32F4
|
||||||
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_CRC, DISABLE);
|
||||||
|
#else
|
||||||
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, DISABLE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
static const ushort c_CRC16Table[] =
|
static const ushort c_CRC16Table[] =
|
||||||
{
|
{
|
||||||
0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
|
0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
|
||||||
0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400,
|
0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400,
|
||||||
};
|
};
|
||||||
|
|
||||||
ushort TSys::Crc16(const byte* buf, uint len, ushort crc)
|
ushort TSys::Crc16(const void* buf, uint len, ushort crc)
|
||||||
{
|
{
|
||||||
if (!buf || !len) return 0;
|
if (!buf || !len) return 0;
|
||||||
|
|
||||||
|
|
5
Sys.h
5
Sys.h
|
@ -96,8 +96,9 @@ public:
|
||||||
Func OnStop;
|
Func OnStop;
|
||||||
|
|
||||||
// CRC32校验
|
// CRC32校验
|
||||||
uint Crc(const byte* buf, uint len, uint crc = 0);
|
uint Crc(const void* buf, uint len);
|
||||||
ushort Crc16(const byte* buf, uint len, ushort crc = 0xFFFF);
|
uint Crc(const void* buf, uint len, uint crc);
|
||||||
|
ushort Crc16(const void* buf, uint len, ushort crc = 0xFFFF);
|
||||||
|
|
||||||
void ShowHex(byte* buf, uint len, char sep = '\0');// 显示十六进制数据,指定分隔字符
|
void ShowHex(byte* buf, uint len, char sep = '\0');// 显示十六进制数据,指定分隔字符
|
||||||
void ShowString(byte* buf, uint len = 0, bool autoEnd = true); // 显示字符串,不指定长度时自动找\0
|
void ShowString(byte* buf, uint len = 0, bool autoEnd = true); // 显示字符串,不指定长度时自动找\0
|
||||||
|
|
Loading…
Reference in New Issue