STM 32 CRCハードウェアユニット
2996 ワード
STM 32 CRCハードウェアユニット
STM 32が採用するCRCチェックモジュールで使用するチェックアルゴリズムは主流のCRC 32チェックアルゴリズムとは異なる.
次はCRCオンラインチェックサイトです.http://www.ip33.com/crc.html
主流の32ビット検査アルゴリズムはCRC-32とCRC-32/MPEG-2の2種類を含むが、STM 32が採用する検査アルゴリズムはいずれも異なり、形式的にはCRC-32/MPEG-2に似ているが、STM 32は32がビット単位で計算され、主流のアルゴリズムはバイト単位で計算される.
STM 32 CRCの重み値は0 x 4 C 11 DB 7、初期値は0 xFFFFFFFF、入力値と出力値は反転する必要はなく、出力値は異論演算を必要とせず、形式はCRC-32/MPEG-2と同じであるが、計算結果は異なる.
以下は、公式文書に記載されているCRC計算ユニットのC言語の説明です.
以下はC#のCRC-32/MPEG-2アルゴリズムです.
このコードは、上記URLのCRC-32/MPEG-2計算と一致しています.
以下は筆者がSTM 32公式CRCユニットC言語コードから変更したC#コードである.
計算結果はSTM 32計算結果と一致する.STM 32 F 10 x、FL 1 x、F 2 x、F 4 xシリーズCRCモジュールは、公式ライブラリの関数を呼び出すだけで簡単に使用できます.
STM 32 F 0 x、F 30 x、F 37 xシリーズは複雑で、CRCチェック多項式を変更することができます.
筆者はC#CRCアルゴリズムとSTM 32 F 103ハードウェアCRCユニットに基づいて上位機と下位機の通信を構成し,検証結果は同じである.
STM 32が採用するCRCチェックモジュールで使用するチェックアルゴリズムは主流のCRC 32チェックアルゴリズムとは異なる.
次はCRCオンラインチェックサイトです.http://www.ip33.com/crc.html
主流の32ビット検査アルゴリズムはCRC-32とCRC-32/MPEG-2の2種類を含むが、STM 32が採用する検査アルゴリズムはいずれも異なり、形式的にはCRC-32/MPEG-2に似ているが、STM 32は32がビット単位で計算され、主流のアルゴリズムはバイト単位で計算される.
STM 32 CRCの重み値は0 x 4 C 11 DB 7、初期値は0 xFFFFFFFF、入力値と出力値は反転する必要はなく、出力値は異論演算を必要とせず、形式はCRC-32/MPEG-2と同じであるが、計算結果は異なる.
以下は、公式文書に記載されているCRC計算ユニットのC言語の説明です.
DWORD dwPolynomial= 0x04c11db7;
DWORD cal_crc(DWORD *ptr, int len)
{
DWORD xbit;
DWORD data;
DWORD CRC= 0xFFFFFFFF; // init
while (len--)
{
xbit=1 << 31;
data= *ptr++;
for (int bits= 0; bits< 32; bits++)
{
if(CRC & 0x80000000)
{
CRC <<= 1;
CRC ^= dwPolynomial;
}
else
CRC <<= 1;
if (data & xbit)
CRC ^= dwPolynomial;
xbit >>= 1;
}
}
return CR;
}
以下はC#のCRC-32/MPEG-2アルゴリズムです.
private UInt32 CRC32_MPEG_2(uint[] data, int length)
{
uint i;
UInt32 crc = 0xffffffff, j = 0;
while ((length--) != 0)
{
crc ^= (UInt32)data[j] << 24;
j++;
for (i = 0; i < 8; ++i)
{
if ((crc & 0x80000000) != 0)
crc = (crc << 1) ^ 0x04C11DB7;
else
crc <<= 1;
}
}
return crc;
}
このコードは、上記URLのCRC-32/MPEG-2計算と一致しています.
以下は筆者がSTM 32公式CRCユニットC言語コードから変更したC#コードである.
UInt32 cal_crc(byte []ptr)
{
UInt32 data1 = 1;
UInt32 xbit;
UInt32 data;
UInt32 CRC = 0xffffffff;
uint[] CRC32_Data;
int len = ptr.Length;
CRC32_Data = new uint[len];
for (int i = 0; i < len; i++)
CRC32_Data[i] = ptr[i];
for (int i = 0; i < len; i++)
{
xbit = data1 << 31;
data = CRC32_Data[i];
for (int bits = 0; bits < 32; bits++)
{
if ((CRC & 0x80000000) != 0)
{
CRC = (CRC << 1) ^ 0x04C11DB7;
}
else
{
CRC = CRC << 1;
}
if ((data & xbit) != 0)
{
CRC = CRC ^ 0x04C11DB7;
}
xbit >>= 1;
}
}
return CRC;
}
計算結果はSTM 32計算結果と一致する.STM 32 F 10 x、FL 1 x、F 2 x、F 4 xシリーズCRCモジュールは、公式ライブラリの関数を呼び出すだけで簡単に使用できます.
// CRC
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
// CRC
CRC_ResetDR();
// data32 CRC
CRC1 = CRC_CalcBlockCRC(data, length);
// 32 CRC
x=CRC_CalcCRC(Data);
STM 32 F 0 x、F 30 x、F 37 xシリーズは複雑で、CRCチェック多項式を変更することができます.
筆者はC#CRCアルゴリズムとSTM 32 F 103ハードウェアCRCユニットに基づいて上位機と下位機の通信を構成し,検証結果は同じである.