16
2015 Microchip Technology Inc. DS00001817A_JP - p.1 1.0 はじめに 安全が重視されるアプリケーションでフォルトを検出 するためにマイクロコントローラでクラス B 安全規格 ライブラリ ルーチンを使う機会が増えています。マイ クロコントローラのプログラムメモリのフォルトは、 主に IEC 60730 規格で定義された巡回冗長検査 (CRC) を使って検出します。 CRC を使って周期的なチェックを実行する事により、 プログラムメモリの破損によるアプリケーション フォルトを防止できます。 本書では、クラス B 安全規格ソフトウェア ライブラリ に含まれるソフトウェア CRC と一部のマイクロコント ローラ ( 本書で取り上げるのは PIC16F161X ファミリ ) が内蔵するハードウェア CRC を実装する方法につい て説明します。 本書で紹介するどちらの方法も IEC 60730 規格 H.2.19.3.2 の要件を満たしており、不変メモリのテス トで全ての 1 ビットフォルトを 99.6% の網羅率で検出 できます。 クラス B の詳細と完全なサンプルコードについては、 下記 URL を参照してください。 www.microchip.com/classb CRC アルゴリズムの詳細は『A Painless Guide on CRC Algorithms(Ross N. Williams 著、1993 8 19 ) を参照してください。 1.1 巡回冗長検査 (CRC) CRC は多項式の長除法に似た計算方法を使い、多項 式の長除法での剰余にあたるチェック値を求めます。 除数には CRC 多項式と呼ばれるものを使います。 CRC 多項式には、個々のデータストリームでエラー を最大限検出できるような多項式を選びます。本書で は、2 に示す CRC-16-ANSI CRC 多項式として 使います。これ以外の有名な CRC アルゴリズムとし て、CRC-16-CCITT があります。このアルゴリズムは 主に通信用 CRC として使います。 チェック値をクラス B アプリケーションで使う場合、 最初に CRC を実行し、その後周期的に CRC を実行し てチェック値が変化しない事を確認します。 1.2 CRC の実装 CRC の一般的な実装方法にはいくつか種類があり ます。CRC のハードウェア実装として最も一般的なの は線形帰還シフトレジスタ (LFSR) です。CRC-16-ANSI LFSR 2 に示します。この実装では CRC アル ゴリズムに応じた適切な位置に XOR ゲートを配置し、 データストリームを CRC に入力します。 CRC のソフトウェア実装にはテーブルを使う方法が 一般的です。しかしこの手法は多くのメモリを使うた め、メモリ容量の小さい PIC16 では効率が良くありま せん。クラス B 安全規格ソフトウェア ライブラリで は、ソフトウェア CRC を実行するのに並列計算法を 使っています。これは、複数形態のパリティによって 決まるビットに対して XOR を選択的に実行します。 1.3 CRC エラー検出 CRC 計算に使う多項式は、なるべく多くのビットエ ラーを検出できるものを選びます。 CRC-16-CCITT CRC-16-ANSI 等の一般的な CRC 多項式は、エラー検 出の網羅率が最大となるように設計されています。こ れらの多項式は 1 ビットエラー、2 ビットエラー、奇 数ビットエラー、バーストエラーを全て検出できるよ うに設計されています。 これら以外のエラーに対する有効性についてはまだ結 論が出ておらず、本稿では取り上げません。 1.4 CRC の用語 多項式 – CRC アルゴリズムで使う除数です。CRC は主に多項式の違いで区別します。 初期値 – CRC 計算を開始する値です。エラーを最 大限に検出できるようにするため、ほとんどの CRC アルゴリズムには定義済みの初期値があります。 ゼロ付加 データシーケンスの末尾にゼロを付加 して CRC 計算を行います。 エンディアン – CRC 計算式に入力するビット順を 決定します。MSb ファーストと LSb ファーストが あります。 チェック値 – CRC 計算で求める値で、チェックサ ムまたは剰余とも呼びます。 著者 : Corey Simoncic Microchip Technology Inc. クラス B アプリケーションで拡張コア PIC16F1XXX ハードウェアまたはソフトウェア CRC を使う方法 AN1817 注意 : この日本語版文書は参考資料としてご利用ください。最新情報は必ずオリジ ナルの英語版をご参照願います。

AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

クラス B アプリケーションで拡張コア PIC16F1XXX のハードウェアまたはソフトウェア CRC を使う方法

AN1817

注意 : この日本語版文書は参考資料としてご利用ください。最新情報は必ずオリジナルの英語版をご参照願います。

1.0 はじめに

安全が重視されるアプリケーションでフォルトを検出するためにマイクロコントローラでクラスB安全規格ライブラリ ルーチンを使う機会が増えています。マイクロコントローラのプログラムメモリのフォルトは、主に IEC 60730規格で定義された巡回冗長検査 (CRC)を使って検出します。

CRC を使って周期的なチェックを実行する事により、プログラムメモリの破損によるアプリケーションフォルトを防止できます。

本書では、クラス B 安全規格ソフトウェア ライブラリに含まれるソフトウェアCRCと一部のマイクロコントローラ ( 本書で取り上げるのは PIC16F161X ファミリ )が内蔵するハードウェア CRC を実装する方法について説明します。

本書で紹介するどちらの方法も IEC 60730 規格H.2.19.3.2 の要件を満たしており、不変メモリのテストで全ての1ビットフォルトを99.6%の網羅率で検出できます。

クラス B の詳細と完全なサンプルコードについては、下記 URL を参照してください。

www.microchip.com/classb

CRCアルゴリズムの詳細は『A Painless Guide on CRCAlgorithms』(Ross N. Williams 著、1993 年 8 月 19 日 )を参照してください。

1.1 巡回冗長検査 (CRC)

CRC は多項式の長除法に似た計算方法を使い、多項式の長除法での剰余にあたるチェック値を求めます。除数には CRC 多項式と呼ばれるものを使います。CRC 多項式には、個々のデータストリームでエラーを最大限検出できるような多項式を選びます。本書では、図 2 に示す CRC-16-ANSI を CRC 多項式として使います。これ以外の有名な CRC アルゴリズムとして、CRC-16-CCITT があります。このアルゴリズムは主に通信用 CRC として使います。

チェック値をクラス B アプリケーションで使う場合、最初に CRC を実行し、その後周期的に CRC を実行してチェック値が変化しない事を確認します。

1.2 CRC の実装

CRC の一般的な実装方法にはいくつか種類があります。CRC のハードウェア実装として最も一般的なのは線形帰還シフトレジスタ (LFSR) です。CRC-16-ANSIの LFSR を図 2 に示します。この実装では CRC アルゴリズムに応じた適切な位置にXORゲートを配置し、データストリームを CRC に入力します。

CRC のソフトウェア実装にはテーブルを使う方法が一般的です。しかしこの手法は多くのメモリを使うため、メモリ容量の小さい PIC16 では効率が良くありません。クラス B 安全規格ソフトウェア ライブラリでは、ソフトウェア CRC を実行するのに並列計算法を使っています。これは、複数形態のパリティによって決まるビットに対して XOR を選択的に実行します。

1.3 CRC エラー検出

CRC 計算に使う多項式は、なるべく多くのビットエラーを検出できるものを選びます。CRC-16-CCITT やCRC-16-ANSI 等の一般的な CRC 多項式は、エラー検出の網羅率が最大となるように設計されています。これらの多項式は 1 ビットエラー、2 ビットエラー、奇数ビットエラー、バーストエラーを全て検出できるように設計されています。

これら以外のエラーに対する有効性についてはまだ結論が出ておらず、本稿では取り上げません。

1.4 CRC の用語

• 多項式 – CRC アルゴリズムで使う除数です。CRCは主に多項式の違いで区別します。

• 初期値 – CRC 計算を開始する値です。エラーを最大限に検出できるようにするため、ほとんどの CRCアルゴリズムには定義済みの初期値があります。

• ゼロ付加 – データシーケンスの末尾にゼロを付加して CRC 計算を行います。

• エンディアン – CRC 計算式に入力するビット順を決定します。MSb ファーストと LSb ファーストがあります。

• チェック値 – CRC 計算で求める値で、チェックサムまたは剰余とも呼びます。

著者 : Corey SimoncicMicrochip Technology Inc.

2015 Microchip Technology Inc. DS00001817A_JP - p.1

Page 2: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

1.5 クラス B で使う CRC

本書ではCRCで使う用語を以下のように定義します。

• 多項式 : CRC-16-ANSI• 初期値 : 0xFFFF• ゼロ付加 : 使う• エンディアン : MSb ファースト

1.6 クラス B 組み込みアプリケーションでの CRC の利用

PIC16F1613 等を使った組み込みアプリケーションのプログラムメモリを検査する方法として、CRC は高い精度と信頼性を備えます。

図 1 に、代表的なアプリケーションで CRC( およびその他のクラス B テスト ) を使う場合の基本フローを示します。本書と一緒に提供している CRC 計算コードを使ってチェックサムを計算し、デバイスに書き込みます。チェック値はプログラムメモリの最後の 2 つのアドレスに書き込みます。CRC を計算するたびに、このチェック値と比較します。

図 1: クラス B フローチャート

図 2: CRC LFSR

CRC entire Memory Range except last 2

words(1)

Is Check Value

Correct?

No

Yes

CLASS B Start-up Tests

Application Initialization

Is Check Value

Correct?

No

Yes

CLASS B Periodic Tests

Error:Set Application

in controlled state and set appropriate error flags

Application Main Loop

CRC entire Memory Range except last 2

words(1)

Note 1: 最後の2つのアドレスにチェック値を格

納します。

Data in

b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15

Linear Feedback Shift Register for CRC-16-ANSI

x16 + x15 + x2 + 1

b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15

Data inAugmentation Mode OFF

Augmentation Mode ON

DS00001817A_JP - p.2 2015 Microchip Technology Inc.

Page 3: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

2.0 クラス B アプリケーションでのCRC モジュールの使い方

PIC16F161X ファミリはハードウェア CRC モジュールを内蔵しています。このセクションでは、クラス BアプリケーションでCRCモジュールを使う方法を、サンプルコードを示しながら手順を追って説明します。

PIC16F161X の CRC モジュールはメモリスキャナを備えています。このメモリスキャナを使うと、デバイスのフラッシュ プログラムメモリから CRC モジュールに直接データを書き込めます。

PIC16F1613 のハードウェア CRC を使うには、まずCRC とメモリスキャナのレジスタを設定する必要があります。詳細は PIC16F1613 のデータシート(DS40001737)、セクション 11.0 を参照してください。

2.1 CRC モジュールの設定

CRC-16 の多項式 :

CRCXORH = 0b10000000;

CRCXORL = 0b00000101;

最上位ビットは必ず「1」であるため、モジュールが自動的に実装します。

初期値 :

CRCACCH = 0b11111111;

CRCACCL = 0b11111111;

ゼロ付加有効 :

CRCCON0bits.ACCM = 1;

エンディアン (MSb から順にシフト ):

CRCCON0bits.SHIFTM = 0;

この CRC モジュールは、多項式の種類とデータストリングの長さを幅広くサポートする柔軟な設計を採用しています。このため、CRC モジュールで使う多項式の長さとデータ長を設定しておく必要があります。

多項式の長さが 16 ビット :

CRCCON1bits.PLEN = 0b1111;

データ長が 16 ビット :

CRCCON1bits.DLEN = 0b1111;

Note: PIC16F1613 のプログラムメモリの実際のデータ長は 14 ビットです。ここで 16ビットの長さを選択しているのは、チェック値をCRCカリキュレータおよびソフトウェアCRCと比較できるようにするためです。このため、プログラムメモリの各ワードに 0を 2つ追加して 16ビットワードとしています。詳細は例 1 を参照してください。

2015 Microchip Technology Inc. DS00001817A_JP - p.3

Page 4: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

2.2 メモリスキャナの設定

CRC は安全が重視されるタスクであるため、メモリスキャナはバーストモードで使います。つまり、CRC 実行中はCPUの全機能が停止します。例えば8 MHz FOSC

の場合、メモリパネル全体 (2000 プログラムワード ) に対して CRC を実行すると 4.086 ms の間 CPU が停止します。

バーストモード :

SCANCON0bits.MODE = 0b01;

4.086 ms が長過ぎる場合、以下のスキャナ制御ビットをセットすると割り込み中はスキャナが停止します。こうすると、安全に関連する重要な割り込みを処理できます。

オプションの割り込みサービス :

SCANCON0bits.INTM = 1;

メモリスキャナ設定の最後は、開始アドレスと終了アドレスを設定します。SCANLADRH:L レジスタペアがスキャン開始アドレスを格納します。SCANHADRH:Lレジスタペアがスキャン終了アドレスを格納します。スキャン中、SCANLADR レジスタペアがインクリメントして現在取得中のアドレスを示します。例 1 では、最後の 2 つのアドレスに計算で求めたチェック値を格納しています。

開始アドレス :

SCANLADRH = 0x00;

SCANLADRL = 0xFD;

終了アドレス :

SCANHADRH = 0x07;

SCANHADRL = 0xFB;

例 1: CRC モジュールのコード

uint16_t HWCRC (uint16_t lastAddress){ uint16_t HWCRCresult;

CRCACCL = 0xFF; //Seed with 0xFFFF CRCACCH = 0xFF; CRCXORH = 0x80; //using CRC-16-ANSI 0x8005 CRCXORL = 0x05; CRCCON1bits.DLEN = 15; //using 16 bit data length to match the Software CRC //the most-significant 2 bits will be treated as 0. CRCCON1bits.PLEN = 15; //using the maximum 17-bit polynomial (-2) CRCCON0bits.ACCM = 1; //turn on augmented zeros CRCCON0bits.SHIFTM = 0; //MSb-first (normal) SCANCON0bits.MODE = 0b01; //turn on "Burst mode" to stop all //other execution until CRC complete SCANLADRH = 0x00; //set the first address for memory scan SCANLADRL = 0x00; SCANHADRH = lastAddress >> 8; //set the last address for memory scan SCANHADRL = lastAddress; SCANCON0bits.EN = 1; CRCCON0bits.EN = 1; CRCCON0bits.CRCGO = 1; //Turn on the CRC SCANCON0bits.SCANGO = 1; //Turn on the scan to begin the CRC //This should halt CPU Execution until the Scanner is complete and the final //memory location is in the CRC

while(CRCCON0bits.BUSY);

HWCRCresult = ((CRCACCH<<8) | CRCACCL); return HWCRCresult;

}

DS00001817A_JP - p.4 2015 Microchip Technology Inc.

Page 5: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

2.3 CRC の実行

以上で、CRC とスキャナの両方が指定メモリ領域に対して CRC-16-ANSI アルゴリズムを実行できるように設定しました。次に CRC およびスキャナ モジュールを有効にします。

まず CRCGO ビットをセットして CRC を開始し、次に SCANGO ビットをセットします。スキャナがバーストモードに設定されているため、CPU は通常のコード実行を停止します ( ただし前述のように割り込みを有効にした場合を除く )。

CPU は約 4.086 ms の間シャットダウンします。CRCの動作が完了するとCRCCON0レジスタのBUSYビットがハードウェアによってクリアされます。このビットがクリアされていれば最終的なチェック値がCRCACCH:L レジスタペアに格納されています。

2.4 CRC モジュールのタイミング

CRC モジュールのタイミングは、データ幅、FOSC、スキャン対象のアドレスの数で異なります。

16 ビットデータ幅の場合、CRC はプログラムメモリ1 ワードのテストに 4 命令サイクルを必要とします。フラッシュメモリの2046アドレスをテストする場合、2046*4 命令サイクルに加え、呼び出しとリターンのための命令もいくつか必要です。

本書の例では、8 MHz で 8211 命令サイクルを必要とし、4 ms 強かかります。このタイミングは、デバイス内蔵の信号計測タイマ (SMT) を使って求めました。

SMT を使って CRC またはその他のモジュールのタイミングを取得する方法は補遺 B: 「SMT のタイミング」を参照してください。

2015 Microchip Technology Inc. DS00001817A_JP - p.5

Page 6: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

3.0 CRC カリキュレータ

本書では、複数の多項式および CRC モジュールの全機能をサポートした使いやすい CRC カリキュレータも取り上げます。このツールを使って、CRC モジュールとクラスB安全規格ソフトウェア ライブラリによるCRC 計算結果を検証します。

3.1 特長

このCRCカリキュレータはCRCモジュールの全機能を備えています。複数の多項式をサポートし、ゼロ付加モードとエンディアンを変更できる他、オプションでデータとアキュムレータの幅も設定できます。CRCカリキュレータにデータを入力する方法は 2 通りあり

ます。1 つは右側の [Data] 列にデータを手入力する方法です。もう 1 つは、MPLAB X IDE 等から 16 進数値ファイルをインポートする方法です (Section 3.3

「MPLAB® X IDE を使ってデータを 入力する」参照 )。

3.2 CRC-16-ANSI 用の設定

CRCカリキュレータをCRC-16-ANSI向けに設定するには、カリキュレータの設定をいくつか既定値から変える必要があります。まず、[Polynomial] プルダウンメニューで「0xC002/0x8005 ANSI-16 16bits」を選択します。次に、[Accumulator] の下の [F] ボタンを押して初期値を 0xFFFFに設定します。最後に [Data Width]を 16 に設定します。その他は既定値のままとします( 図 3 参照 )。

図 3: CRC-16-ANSI 用の CRC カリキュレータの設定

3.3 MPLAB® X IDE を使ってデータを入力する

MPLAB X IDE のプログラムメモリ表示を使うと CRCカリキュレータの [Data] 列に簡単に入力できます。まず MPLAB X IDE でプログラムメモリ表示を開きます( 図 4 参照 )。次に、必要なオペコードを選択し、コピー (Windows の場合は Ctrl+C) します ( 図 5 参照 )。クリップボードにコピーされたオペコードをテキストファイルにペーストします ( 図 6 参照 )。このファイルを保存し、CRC カリキュレータを開いて [File]>[ImportFile] を選択します ( 図 7 参照 )。上で保存したファイルを選択すると、MPLAB X IDE プロジェクトからコピーしたオペコードが [Data] 列に入力されます。

DS00001817A_JP - p.6 2015 Microchip Technology Inc.

Page 7: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

図 4: プログラムメモリ表示

図 5: プログラムメモリからオペコードをコピー

2015 Microchip Technology Inc. DS00001817A_JP - p.7

Page 8: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

図 6: オペコードリスト

図 7: ファイルのインポート

DS00001817A_JP - p.8 2015 Microchip Technology Inc.

Page 9: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

3.4 チェック値の計算

[Data] 列に必要な情報を入力したら、[Accumulate] ボタンをクリックします。すると [Accumulator (hex)] テキストボックスにチェック値が表示されます。[Values] 欄には、CRC を使って計算した総ワード数が表示されます。[Data Entry] セクションの [Accum] 列は、各データワードを CRC に入力した後のアキュムレータの値を表示します。この情報はデバッグ時に便利です ( 図 8 参照 )。

図 8: CRC カリキュレータを使った最終チェック値生成

2015 Microchip Technology Inc. DS00001817A_JP - p.9

Page 10: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

4.0 クラス B 安全規格ソフトウェア ライブラリの CRC 関数の使い方

このセクションでは、ライブラリからフラッシュ プログラムメモリの CRC 関数を実装する方法について説明します。

クラス B 安全規格ソフトウェア ライブラリは、フラッシュ プログラムメモリと EEPROM をテストするためのソフトウェア実装 CRC 関数を提供しています。

CRC モジュールとは異なり、ソフトウェア CRC はCRC-16-ANSI アルゴリズムのみをサポートします。

クラスB安全規格ソフトウェア ライブラリの使い方はDS00001799 を参照してください。

4.1 API

フラッシュメモリ全体にCRCテストを実行するには、以下の関数を呼び出します。

CLASSB_CRCFlashTest(…);

この関数には 3 つの引数 ( テスト開始アドレス、テスト長、CRC アルゴリズムのシード値 ) があります。

CRC モジュールと同じ動作とするため、引数に以下の値を設定します。

• uint16_t FlashAddress = 0x00

• uint16_t Flashlength = 0x07FC

• uint16_t crcSeed = 0xFFFF

例 2: CRC ライブラリのコード

4.2 ソフトウェア CRC のタイミング

CRC モジュールで 8172 命令サイクルを必要とするメモリ量の場合、ソフトウェア CRC では 216,956 命令サイクルが必要です。これは 108.478 ms に相当します。

Note: テストの長さは、開始アドレスを含む値を指定します。テストの戻り値は 16 ビットのチェック値です。詳細は例 2 を参照してください。

uint16_t flashAddress = 0x00;uint16_t flashLength = 0x07FC;uint16_t crcSeed = 0xFFFF;uint16_t CRC-libraryResult;

CRC_libraryResult = CLASSB_CRCFlashTest(myAddress,length,crcSeed);

DS00001817A_JP - p.10 2015 Microchip Technology Inc.

Page 11: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

5.0 チェック値を使ったエラーの検出方法

CRC カリキュレータを使うと、参照チェック値をデバイスにプログラミングできます。この参照チェック値を、CRC モジュールまたはクラス B 安全規格ソフトウェア ライブラリの CRC 関数で求めたチェック値と周期的に比較します。これら 2 つの値が一致した場合、プログラムメモリに障害が発生していないと判断できます。これら 2 つの値が一致しなかった場合、メモリが破損した事を意味しており対処が必要です。

校正またはその他のランタイム値がプログラムメモリに格納されていて参照チェック値を使えない場合、2回 CRC を実行して 2 つのチェック値を比較する事もできます。その場合、1 回目のチェック値を PIC® MCUの自己書き込み機能を使ってフラッシュ プログラムメモリまたは SRAM に格納します。

CRC アルゴリズムの性質上、エラー発生箇所は特定できません。アプリケーションに応じて、いくつか対処方法が考えられます。

• エラーフラグをセットして動作を停止する• デバイスをリセット状態に保持する• デバイスを無限ループに移行させてその他全ての動作を停止する

• エラー信号を送信してコンシューマにエラーを通知する

5.1 参照チェック値

CRC カリキュレータを使って求めた参照チェック値(Section 3.0 「CRC カリキュレータ」参照 ) は、プログラミング時にconst変数を使ってプログラムメモリに書き込めます。

例えば、計算で求めた参照チェック値が 0x1234 の場合、以下のように書き込みます。

const uint16_t CRC_checkValue @ 0x7FE =0x1234

これでアドレス 0x7FE に 0x3434、アドレス 0x7FF に0x3412 を書き込みます。MSB に 0x34 が含まれるのは、これが RETLW命令のオペコードであるためです。表 1 にこれを示します。

表 1: プログラムメモリに格納されるチェック値

行番号 アドレス オペコード アセンブリ

2047 7FE 3434 RETLW0x34

2048 7FF 3412 RETLW0x12

2015 Microchip Technology Inc. DS00001817A_JP - p.11

Page 12: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

次に、この参照チェック値とライブラリまたは CRCモジュールを使って計測したチェック値を比較します( 例 3、例 4 参照 )。

例 3: ライブラリを使って計測したチェック値との比較

例 4: CRC モジュールを使って計測したチェック値との比較

if (CRC_checkValue == CRC_libraryResult)

{

// do nothing, check value matches

}

else

{

ErrorMode();

}

if ((CRC_checkValue >> 8) == CRCACCH)

{

if ((CRC_checkValue & 0x00FF) == CRCACCL)

{

// do nothing, check value matches

}

else

{

ErrorMode();

}

}

else

{

ErrorMode();

}

DS00001817A_JP - p.12 2015 Microchip Technology Inc.

Page 13: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

補遺 A: ウィンドウ付きウォッチドッグ タイマ (WWDT)

ウィンドウ付きウォッチドッグ タイマはPIC16F161Xファミリが内蔵するモジュールで、通常のウォッチドッグ タイマよりもタイムスロットの監視に適しています。ウィンドウ付きウォッチドッグ タイマは、クロック速度が遅過ぎる場合も早過ぎる場合も検出できます。ウィンドウの前にプログラムがタイマをクリアしようとした場合も、CLRWDT 命令を発行できなかった場合もリセットが発生します。この機能を使うには、実行中のプロセスに正確なタイミングが必要です。CRC モジュールは、正確なタイミングを提供するモジュールの 1 つです (Section 2.4 「CRC モジュールのタイミング」参照 )。

このウィンドウのタイミングを、参照クロック ( この場合は LFINTOSC) の公差に合わせて調整する必要があります。温度と電圧に対する LFINTOSC の仕様上の誤差は +-15% です。つまり、このオシレータ周波数レンジをカバーできるだけのガードバンドをウィンドウに追加する必要があります。

例えばCRCモジュールがPIC16F1613のメモリレンジ全体 (2K ワード ) をテストするには、4 ms が必要です ( バーストモード、8 MHz の場合 )。つまり、CRCモジュールが途中で終了した場合、不正に呼び出された場合、プログラム カウンタに障害が発生した場合にエラーとなるようにウォッチドッグ タイマにウィンドウを追加する必要があります。そのため、WDT 周期を 8 ms として 87.5% のウィンドウを設定します。このようにウィンドウを拡張する事で、LFINTOSC の許容誤差に対して十分なガードバンドを確保しつつ高いエラー検出率を維持できます。

図 A-1: ウォッチドッグ タイマのウィンドウ

Window Period

CLRWDT Instruction (or other WDT reset)

Window Delay(window violation can occur)

Window Closed Window Open

Time-out Event

2015 Microchip Technology Inc. DS00001817A_JP - p.13

Page 14: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

AN1817

補遺 B: SMT のタイミング

信号計測タイマ (SMT) を使うと、PIC16F161X ファミリの周辺モジュールまたはその他のソフトウェア イベントに対して正確なタイミングを取得できます。Timer 1 が 16 ビットタイマであるのに対し、SMT モジュールは 24 ビットタイマであるため、特に低速なアプリケーションで便利です。

FOSC/4 クロックを使って動作タイミングを計測する場合の SMT 設定方法は、例 B-1 を参照してください。

例 B-1: SMT の初期化

PR レジスタを最大値に設定すると SMT の 24 ビットレンジ全体を使う事ができます。STP ビット (bit 5) をセットすると、SMTxPRの値でカウンタが停止します。こうすると、オーバーフローを使わなくてもイベントのタイミングを SMT の 24 ビットレンジに制限できます。

例 B-1 に示した方法で SMT の初期化が完了したら、SMTxCON1レジスタのSMTxGOビットを使ってSMTを有効または無効にできます。イベントのタイミング

情報を取得するにはイベント発生前に SMTxGO ビットをセットし、イベント直後に SMTxGO ビットをクリアします。時間は SMTxTMRU:H:L レジスタに格納されます。格納される値の単位は、命令サイクル(FOSC/4) 数です。例 B-2 に、この CRC サンプルコードを示します。

例 B-2: SMT のタイミング

SMT2CON0 = 0b10100000; //SMT enabled, rising edges, prescaler 1:1,

//counter will halt at PR

SMT2CLKbits.CSEL = 0b001; // Fosc/4

SMTxPR = 0xFFFFFF;

SMT2CON1bits.SMT2GO = 1; // start SMT timing

//start the Hardware CRC check here.

HW_CRC(LASTCRCADDRESS);

SMT2CON1bits.SMT2GO = 0; // finish SMT timing

DS00001817A_JP - p.14 2015 Microchip Technology Inc.

Page 15: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

Microchip 社製デバイスのコード保護機能に関して以下の点にご注意ください。

• Microchip 社製品は、該当する Microchip 社データシートに記載の仕様を満たしています。

• Microchip 社では、通常の条件ならびに仕様に従って使用した場合、Microchip 社製品のセキュリティ レベルは、現在市場に

流通している同種製品の中でも最も高度であると考えています。

• しかし、コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です。弊社の理解では、こうした手法

は Microchip 社データシートにある動作仕様書以外の方法で Microchip 社製品を使用する事になります。このような行為は知

的所有権の侵害に該当する可能性が非常に高いと言えます。

• Microchip 社は、コードの保全性に懸念を抱いているお客様と連携し、対応策に取り組んでいきます。

• Microchip 社を含む全ての半導体メーカーで、自社のコードのセキュリティを完全に保証できる企業はありません。コード保

護機能とは、Microchip 社が製品を「解読不能」として保証するものではありません。

コード保護機能は常に進歩しています。Microchip 社では、常に製品のコード保護機能の改善に取り組んでいます。Microchip 社の

コード保護機能の侵害は、デジタル ミレニアム著作権法に違反します。そのような行為によってソフトウェアまたはその他の著作

物に不正なアクセスを受けた場合、デジタル ミレニアム著作権法の定めるところにより損害賠償訴訟を起こす権利があります。

本書に記載されているデバイス アプリケーション等に関する

情報は、ユーザの便宜のためにのみ提供されているものであ

り、更新によって無効とされる事があります。お客様のアプ

リケーションが仕様を満たす事を保証する責任は、お客様に

あります。Microchip 社は、明示的、暗黙的、書面、口頭、法

定のいずれであるかを問わず、本書に記載されている情報に

関して、状態、品質、性能、商品性、特定目的への適合性を

はじめとする、いかなる類の表明も保証も行いません。

Microchip 社は、本書の情報およびその使用に起因する一切の

責任を否認します。生命維持装置あるいは生命安全用途に

Microchip 社の製品を使用する事は全て購入者のリスクとし、

また購入者はこれによって発生したあらゆる損害、クレーム、

訴訟、費用に関して、Microchip 社は擁護され、免責され、損

害を受けない事に同意するものとします。暗黙的あるいは明

示的を問わず、Microchip 社が知的財産権を保有しているライ

センスは一切譲渡されません。

2015 Microchip Technology Inc.

商標

Microchip 社の名称とロゴ、Microchipロゴ、dsPIC、FlashFlex、KEELOQ、KEELOQ ロゴ、MPLAB、PIC、PICmicro、PICSTART、PIC32 ロゴ、rfPIC、SST、SST ロゴ、SuperFlash、UNI/O は、米

国およびその他の国におけるMicrochip Technology Incorporatedの登録商標です。

FilterLab、Hampshire、HI-TECH C、Linear Active Thermistor、MTP、SEEVAL、Embedded Control Solutions Company は、

米国におけるMicrochip Technology Incorporatedの登録商標

です。

Silicon Storage Technology は、他の国における Microchip Technology Inc. の登録商標です。

Analog-for-the-Digital Age、Application Maestro、BodyCom、

chipKIT、chipKIT ロゴ、CodeGuard、dsPICDEM、dsPICDEM.net、dsPICworks、dsSPEAK、ECAN、ECONOMONITOR、

FanSense、HI-TIDE、In-Circuit Serial Programming、ICSP、Mindi、MiWi、MPASM、MPF、MPLAB Certified ロゴ、MPLIB、MPLINK、mTouch、Omniscient Code Generation、PICC、

PICC-18、PICDEM、PICDEM.net、PICkit、PICtail、REAL ICE、rfLAB、Select Mode、SQl、Serial Quad I/O、Total Endurance、TSHARC、UniWinDriver、WiperLock、ZENA および Z-Scaleは、米国およびその他の Microchip Technology Incorporatedの商標です。

SQTP は、米国における Microchip Technology Incorporatedのサービスマークです。

GestIC および ULPP は、Microchip Technology Inc. の子会社

である Microchip Technology Germany II GmbH & Co. & KG 社

の他の国における登録商標です。

その他本書に記載されている商標は各社に帰属します。

© 2015, Microchip Technology Incorporated, All Rights Reserved.

ISBN: 978-1-63276-863-6

DS00001817A_JP - p.15

Microchip 社では、Chandler および Tempe ( アリゾナ州 )、Gresham ( オレゴン州 ) の本部、設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザインセンターが ISO/TS-16949:2009 認証を取得しています。Microchip 社の品質システム プロセスおよび手順は、PIC® MCU および dsPIC® DSC、KEELOQ® コード ホッピング デバイス、シリアル EEPROM、マイクロペリフェラル、不揮発性メモリ、アナログ製品に採用されています。さらに、開発システムの設計と製造に関する Microchip 社の品質システムは ISO 9001:2000 認証を取得しています。

Page 16: AN1817 Using a Hardware or Software CRC with Enhanced ...ww1.microchip.com/downloads/jp/AppNotes/00001817A_JP.pdfAN1817 DS00001817A_JP - p.4 2015 Microchip Technology Inc. 2.2 メモリスキャナの設定

DS00001817A_JP - p.16 2015 Microchip Technology Inc.

北米本社2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 480-792-7200 Fax: 480-792-7277技術サポート : http://www.microchip.com/supportURL: www.microchip.com

アトランタDuluth, GA Tel: 678-957-9614 Fax: 678-957-1455

オースティン、TXTel: 512-257-3370

ボストンWestborough, MATel: 774-760-0087 Fax: 774-760-0088

シカゴItasca, ILTel: 630-285-0071 Fax: 630-285-0075

クリーブランドIndependence, OHTel: 216-447-0464Fax: 216-447-0643

ダラスAddison, TXTel: 972-818-7423 Fax: 972-818-2924

デトロイトNovi, MI Tel: 248-848-4000

ヒューストン、TXTel: 281-894-5983

インディアナポリスNoblesville, INTel: 317-773-8323Fax: 317-773-5453

ロサンゼルスMission Viejo, CATel: 949-462-9523 Fax: 949-462-9608

ニューヨーク、NY Tel: 631-435-6000

サンノゼ、CATel: 408-735-9110

カナダ - トロント

Tel: 905-673-0699 Fax: 905-673-6509

アジア / 太平洋アジア太平洋支社Suites 3707-14, 37th FloorTower 6, The GatewayHarbour City, KowloonHong KongTel: 852-2943-5100Fax: 852-2401-3431

オーストラリア - シドニー

Tel: 61-2-9868-6733Fax: 61-2-9868-6755

中国 - 北京

Tel: 86-10-8569-7000Fax: 86-10-8528-2104

中国 - 成都

Tel: 86-28-8665-5511Fax: 86-28-8665-7889

中国 - 重慶

Tel: 86-23-8980-9588Fax: 86-23-8980-9500

中国 - 杭州

Tel: 86-571-8792-8115Fax: 86-571-8792-8116

中国 - 香港 SARTel: 852-2943-5100 Fax: 852-2401-3431

中国 - 南京

Tel: 86-25-8473-2460Fax: 86-25-8473-2470

中国 - 青島

Tel: 86-532-8502-7355Fax: 86-532-8502-7205

中国 - 上海

Tel: 86-21-5407-5533Fax: 86-21-5407-5066

中国 - 瀋陽

Tel: 86-24-2334-2829Fax: 86-24-2334-2393

中国 - 深圳

Tel: 86-755-8864-2200 Fax: 86-755-8203-1760

中国 - 武漢

Tel: 86-27-5980-5300Fax: 86-27-5980-5118

中国 - 西安

Tel: 86-29-8833-7252Fax: 86-29-8833-7256

中国 - 厦門

Tel: 86-592-2388138 Fax: 86-592-2388130

中国 - 珠海

Tel: 86-756-3210040 Fax: 86-756-3210049

アジア / 太平洋インド - バンガロール

Tel: 91-80-3090-4444 Fax: 91-80-3090-4123

インド - ニューデリー

Tel: 91-11-4160-8631Fax: 91-11-4160-8632

インド - プネ

Tel: 91-20-3019-1500

日本 - 大阪

Tel: 81-6-6152-7160Fax: 81-6-6152-9310

日本 - 東京

Tel: 81-3-6880-3770 Fax: 81-3-6880-3771

韓国 - 大邱

Tel: 82-53-744-4301Fax: 82-53-744-4302

韓国 - ソウル

Tel: 82-2-554-7200Fax: 82-2-558-5932 または

82-2-558-5934

マレーシア - クアラルンプール

Tel: 60-3-6201-9857Fax: 60-3-6201-9859

マレーシア - ペナン

Tel: 60-4-227-8870Fax: 60-4-227-4068

フィリピン - マニラ

Tel: 63-2-634-9065Fax: 63-2-634-9069

シンガポールTel: 65-6334-8870Fax: 65-6334-8850

台湾 - 新竹

Tel: 886-3-5778-366Fax: 886-3-5770-955

台湾 - 高雄

Tel: 886-7-213-7830

台湾 - 台北

Tel: 886-2-2508-8600 Fax: 886-2-2508-0102

タイ - バンコク

Tel: 66-2-694-1351Fax: 66-2-694-1350

ヨーロッパオーストリア - ヴェルス

Tel: 43-7242-2244-39Fax: 43-7242-2244-393

デンマーク - コペンハーゲン

Tel: 45-4450-2828 Fax: 45-4485-2829

フランス - パリ

Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79

ドイツ - デュッセルドルフ

Tel: 49-2129-3766400

ドイツ - ミュンヘン

Tel: 49-89-627-144-0 Fax: 49-89-627-144-44

ドイツ - プフォルツハイム

Tel: 49-7231-424750

イタリア - ミラノ Tel: 39-0331-742611 Fax: 39-0331-466781

イタリア - ヴェニス

Tel: 39-049-7625286

オランダ - ドリューネン

Tel: 31-416-690399 Fax: 31-416-690340

ポーランド - ワルシャワ

Tel: 48-22-3325737

スペイン - マドリッド

Tel: 34-91-708-08-90Fax: 34-91-708-08-91

スウェーデン - ストックホルム

Tel: 46-8-5090-4654

イギリス - ウォーキンガム

Tel: 44-118-921-5800Fax: 44-118-921-5820

各国の営業所とサービス

03/25/14