
この例は、PIC18F47Q10マイクロコントローラーでのCRC周辺の使用を示しています。 PICマイクロコントローラーのCRCモジュールは、プログラム可能な多項式で16ビットCRCを計算するハードウェア実装チェックサムジェネレーターです。 CRC計算を高速化するために、メモリスキャナーと組み合わされています。メモリスキャナーは、CRCモジュールにデータを自動的に提供できます。この例では、CRC-16-CCITT標準パラメーターを使用します。このデモは、プログラムメモリのCRCを計算し、デバイスを初めてプログラミングした後、コントローラーのEEPROM領域に保存します。その後のパワーアップでは、デバイスは起動時にフラッシュCRCを計算し、EEPROMエリアに保存されているCRCに対してチェックします。不一致の場合、プログラムの実行はCRCエラーを示します。このCRCチェックは、フラッシュの整合性を確保するために、デバイス操作中に定期的にスケジュールできます。

図1:プログラムフローチャート
完全なプログラムとデバッグ機能により、PIC18F47Q10 Curiosity Nano評価キットは、新しいデザインを完全にサポートしています。キットはMPLAB®XIDEおよびMPLAB®コードコンフィギュレーター(MCC)を使用して、PIC18F47Q10のインテリジェントアナログとコア独立した周辺機器へのアクセスを提供します。

図2:PIC18F47Q10 Curiosity Nano Board
Microchipの無料MPLAB X IDE、コンパイラ、MPLABコードコンフィギュレーター(MCC)グラフィカルコードジェネレーターは、アプリケーションファームウェア開発全体で使用され、簡単で手間のかからないユーザーエクスペリエンスを提供します。このデモアプリケーションに使用されるツールバージョンは次のとおりです。
注:デモを実行するには、インストールされているツールバージョンが同じかそれ以降である必要があります。この例は、以前のバージョンではテストされていません。
新しいプロジェクトを作成し、MCCを開くことから始めます
ハードウェア周辺機器を構成します
[ Project Resources]タブに「System」ドロップダウンメニューの下にあるClock Controlセットアップを開きます。

図3:クロックコントロール
[ Project Resources]タブに「System」ドロップダウンメニューの下にある構成ビットセットアップを開きます。

図4:構成ビット
CRC、UART2、TMR0、およびNVM周辺機器をプロジェクトに追加します。
[ドライバー]ドロップダウンメニューの下に存在する周辺機器を[デバイスリソース]タブに追加してください。

図5:周辺機器
CRC周辺機器を構成します
CRCが有効になっていることを確認します
事前定義された多項式が有効になっていることを確認します
事前に定義された多項式のリストからCRC-16-CCITTを選択します
シード値を0xffffに設定します
0が0で拡張されていないデータに増強モードを設定します
データワード幅(ビット)を16に設定します(フラッシュメモリデータ幅が16ビットです)
スキャナーが有効になっていることを確認します(スキャナーを使用してメモリからデータを取得します)

図6:CRC構成
EEPROM APIの生成が設定されていることを確認します(これらのAPIを使用してEEPROMデータを記述します)

図7:メモリ構成
このデモでは、UART2を使用して、ターミナルウィンドウにデータを送信して、CRCに不一致がある場合に、保存されたCRC値と計算されたCRC値とエラーメッセージを表示します。

図8:UART2構成
このデモでは、プログラムメモリのCRCをチェックするための定期的なイベントを生成するために使用されます。タイマー0期間を調整して、CRC計算頻度を変更できます。

図9:タイマー0構成
デバイスで使用されるピンを構成します
PINマネージャー:グリッドビューを使用して、RE0を出力PINとして設定します。 LEDはピンRE0に接続されています。
eUSART2としてRD0を選択します:TX2出力。
RX2に使用されるRB7。

図10:ピンマネージャー:グリッドビュー
プロジェクトリソース→システム→ピンを使用して、LEDとしてRE0出力ピンにカスタム名を追加します。 LED PIN RE0の「HIGHを開始」チェックボックスをチェックして、LEDをオフにします。

図11:ピンマネージャー
Main.Cファイルを開きます。
MCC生成APIを使用してフラッシュCRCを計算する手順:
CRC_SetScannerAddressLimit(START_ADDRESS, END_ADDRESS);
(このデモで使用されるスタートアドレスは0x00000で、使用されるエンドアドレスは0x7ffeです。したがって、CRC計算に使用されるメモリのブロックサイズは32kbです。)
注:プログラムのサイズが32kbを超える場合、エンドアドレスを変更してブロックサイズを増やします
CRC_StartScanner();
while(CRC_IsCrcBusy() || CRC_IsScannerBusy());
CRC_GetCalculatedResult(false,0x00);

図12:デバイスをプログラムします
//#define ERASE_EEPROM_CRCコードで定義して、CRCを保存するEEPROMの位置を消去します。これにより、以前にその場所に保存されていた計算されたCRC値が正しくないか、以前に計算されたCRC値がないことを確認します。プロジェクトを構築し、デバイスをプログラムします。ターミナルウィンドウに表示されるメッセージを観察します。(MPLAB Data Visualizerなどのターミナルエミュレータを使用できます。ボーレートを9600に設定します。)

図13:Eeprom消去メッセージ
#define ERASE_EEPROM_CRCコメントしてください。プロジェクトを構築し、デバイスをプログラムします。
図14:初めてCRC計算

図15:定期的なCRC
注:図15のCRCは、-0最適化レベルのコンパイラV2.41を使用して計算されます。
CRCモジュールは、プログラム可能な多項式で16ビットCRCを計算できるハードウェア実装チェックサムジェネレーターです。また、CRC計算に自動フラッシュ読み取りを提供するメモリスキャナー機能も使用します。 CRCモジュールの構成は、MCC GUIを使用して簡単です。モジュールの構成とは別に、MCCは、PICマイクロコントローラーのCRCおよびメモリスキャンハードウェア周辺機器を使用して、プログラムメモリのCRCのハスルフリー計算のために、APIを使用する準備ができています。