STM 32 CRCハードウェアユニット


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言語の説明です.
    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ユニットに基づいて上位機と下位機の通信を構成し,検証結果は同じである.