AN1817 Using a Hardware or Software CRC with Enhanced Core PIC16F1XXX in Class B Applications

Similar documents
PIC10(L)F320/322 Product Brief

AN1019 そのような配慮として 下記の基本的ガイドラインに沿って 可能な限り 環境条件または動作条件を制限する必要があります アプリケーションの温度を可能な限り下げる アプリケーションの電圧 ( または EEPROM の VCC 電圧 ) を可能な限り下げる 書き込みバイト数を可能な限り少なくす

ヒント 2: CWG を使ったハーフブリッジまたはフルブリッジ回路の駆動 ハーフブリッジまたはフルブリッジモータ回路を駆動するために多ピンマイクロコントローラは必ずしも必要ではありません PWM モジュールと CWG モジュールを組み合わせると 少ピンデバイスでも駆動できます 図 2: CWG によ

PIC24F Family Reference Manual, Section 9 Watchdog Timer (WDT)

SMSC LAN8700 Datasheet

Manchester Decoder Using the CLC and NCO

a.fm

SMSC LAN8700 Datasheet

DALI App. Note

PICF/LF1847 表 1: デバイス PICF/LF1847 ファミリの各製品 プログラムメモリフラッシュ ( ワード ) データ EEPROM ( バイト ) SRAM ( バイト ) I/O 10 ビット A/D (ch) タイマ 8/ ビット EUSART MSSP CCP/ ECCP

Microchip Capacitive Proximity Design Guide

B MPLAB XC HPA Renewal Instructions.book

USB.mif

AN2754 USB-to-I2C Bridging with USB7002, USB7050, USB7051, and USB7052 Hubs

TB3179 メモリ保護ユニット (MPU) の設定方法 はじめに メモリ保護ユニット (MPU) は Cortex -M7 コアがメモリ保護のために備えているオプションのコンポーネントです MPU はメモリマップを分割し それぞれにアクセス権とルールを設定します 本書では Cortex-M7 ベー

Multi-Tool Design Advisory

Cortex -M キャッシュコントローラを使って決定論的コード性能を達成する方法 TB3186 はじめに マイクロコントローラベース (MCU) の組み込みアプリケーションでは ソフトウェアは不揮発性メモリに保存して実行します この不揮発性メモリとは 通常はフラッシュメモリです フラッシュメモリは

表 1: ファミリの各製品 デバイス (1) プログラムメモリ バイトワード SRAM ( バイト ) データメモリ データ EEPROM ( バイト ) ピン数 I/O 10 ビット A/D チャンネル コンパレータ CCP/ ECCP BOR/LVD CTMU MSSP EUSART タイマ 8

TB3172 Cortex -M7 マイクロコントローラの XDMAC を使ってオーディオアプリケーションにピンポンバッファリングを実装する方法 はじめに オーディオシステムアプリケーションでは リアルタイムシステムに関する代表的なプロデューサ / コンシューマ問題が発生する可能性があります タイミ

Sample Rate Conversion Library for PIC32 User’s Guide

Using RN4020 for Bluetooth Smart Communication.fm

スライド 1

Using L1 Cache on PIC32MZ Devices.recover.fm

MPLAB Code Configurator User’s Guide

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

Notes and Points for TMPR454 Flash memory

スライド 1

スライド 1

ハイサイド MOSFET の損失 どのような MOSFET でも 総損失は伝導損失とスイッチング損失の合計として求まります 低デューティでは コンバータスイッチング損失がハイサイド MOSFET の支配的な損失要因となる傾向にあります 降圧型コンバータのデューティサイクルは下式により表せます ハイサ

実習内容 PIC18C242 のポート B に接続した LED を点滅させます ( 他の実習と同じ内容です ) 8 個の LED に表示される値が +3 ずつインクリメントします MPLAB を使って MPASM アセンブラのソース ファイルをアセンブルします MPLAB とソース ファイルは配布し

TB3177 MPLAB Harmony Configurator (MHC) を使った Hello World アプリケーションの作成 はじめに MPLAB Harmony は互換で相互運用可能なライブラリで構成されたソフトウェアフレームワークであり 周辺モジュールドライバ ミドルウェア システム

始める スタート > 全てのプログラム > Cypress > PSoC Creator 2.0 > PSoC Creator 2.0 をクリックします プロジェクトを作成する / 開く Start Page の "Create New Project" をクリックし 要求されたプロジェクト情報を入

データ移行ツール ユーザーガイド Data Migration Tool User Guide SK kynix Inc Rev 1.01

PowerPoint プレゼンテーション

MS916 バッチ操作ガイド FW バージョン 0.52 向け バッチ操作の基本 MS916 のバッチ操作について バッチ操作では 読取ったバーコードデータはすべて 不揮発性のメモリ (1MB ROM JAN-13 約 50,000 件 ) に保存されます メモリに保存されたデータは任意のタイミング

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

目次 本書の取り扱いについて... 3 事前準備... 4 MultiPoint Server 2011 OEM 版のインストール (OS リカバリー用のディスク領域を使う場合の起動方法 )... 5 MultiPoint Server 2011 OEM 版のインストール (OS リカバリー用のメデ

WAGO / / Modbus/RTU対応 バスカプラ クイックスタートガイド

JPN_SENT 16 FRM.fm

型名 RF007 ラジオコミュニケーションテスタ Radio Communication Tester ソフトウェア開発キット マニュアル アールエフネットワーク株式会社 RFnetworks Corporation RF007SDK-M001 RF007SDK-M001 参考資料 1

QNAP vsphere Client 用プラグイン : ユーザーガイド 2012 年 12 月更新 QNAP Systems, Inc. All Rights Reserved. 1

a.mif

[DS50-N A] BIOS マニュアル BIOS セットアップユーティリティとは BIOS セットアップユーティリティとは BIOS の設定を確認 変更するためのツールです セットアップユーティリティは 本体に内蔵されているマザーボード上のフラッシュメモリーに格納されています このユ

スライド 1

Polycom RealConnect for Microsoft Office 365

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

Silk Central Connect 15.5 リリースノート

スライド 1

スクールCOBOL2002

スライド 1

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

スライド 1

: mxt641td-at/mxt641td-ab 1.0 maxtouch 640 maxtouch 32 X ( ) 20 Y ( ) ( 16:10) ( = 5.5 mm ) ( 16 ) AEC-Q100 Automotive SPICE 3 CISPR-25 Out-C

DS01149C_JP

世界最高水準の 8/16 ビット PIC マイクロコントローラの伝統を継承し PIC32 ファミリ誕生は 32 ビットの性能と大容量のメモリで複雑化を続ける組み込みシステム設計の課題を解決します 高性能と大容量メモリ RTOS タッチパネル 複雑なアプリケーション向け MHz 1.56 DMIPS

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

MAC アドレス変更ツール MAC アドレスチェンジャー ユーザーズマニュアル User's Manual エレコム株式会社

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ


QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

Flash Loader

AN424 Modbus/TCP クイックスタートガイド CIE-H14

ヤマハDante機器と他社AES67機器の接続ガイド

Office 365監査ログ連携機能アクティブ化手順書

McAfee SaaS Protection 統合ガイド Microsoft Office 365 と Exchange Online の保護

MCP42XXX Evaluation Board User’s Guide

PIC18F23K20/24K20/25K20/26K20/43K20/44K20/45K20/46K20 Data Sheet

XC8 quick start guide.fm

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

スライド 1

FT-450D シリーズ MAIN ファームウェアアップデートマニュアル 本ソフトウェアは FT-450D/FT-450DM/FT-450DS の アップデートファームウェアです FT-450 シリーズのアップデートには使用できません 八重洲無線株式会社

Transcription:

注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います AN1817 クラス B アプリケーションで拡張コア PIC16F1XXX のハードウェアまたはソフトウェア CRC を使う方法 著者 : 1.0 はじめに Corey Simoncic Microchip Technology Inc. 安全が重視されるアプリケーションでフォルトを検出するためにマイクロコントローラでクラス 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 計算で求める値で チェックサムまたは剰余とも呼びます 2015 Microchip Technology Inc. DS00001817A_JP - p.1

1.5 クラス B で使う CRC 図 1: クラス B フローチャート 本書では CRC で使う用語を以下のように定義します 多項式 : CRC-16-ANSI 初期値 : 0xFFFF ゼロ付加 : 使う エンディアン : MSb ファースト 1.6 クラス B 組み込みアプリケーションでの CRC の利用 PIC16F1613 等を使った組み込みアプリケーションのプログラムメモリを検査する方法として CRC は高い精度と信頼性を備えます 図 1 に 代表的なアプリケーションで CRC( およびその他のクラス B テスト ) を使う場合の基本フローを示します 本書と一緒に提供している CRC 計算コードを使ってチェックサムを計算し デバイスに書き込みます チェック値はプログラムメモリの最後の 2 つのアドレスに書き込みます CRC を計算するたびに このチェック値と比較します CLASS B Start-up Tests CRC entire Memory Range except last 2 words (1) Is Check Value Correct? Yes No Application Initialization Application Main Loop CLASS B Periodic Tests CRC entire Memory Range except last 2 words (1) Error: Set Application in controlled state and set appropriate error flags Is Check Value Correct? No Yes Note 1: 最後の 2 つのアドレスにチェック値を格納します 図 2: CRC LFSR Data in Linear Feedback Shift Register for CRC-16-ANSI x 16 + x 15 + x 2 + 1 Augmentation Mode ON b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 Augmentation Mode OFF Data in b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 DS00001817A_JP - p.2 2015 Microchip Technology Inc.

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

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.

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

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]>[Import File] を選択します ( 図 7 参照 ) 上で保存したファイルを選択すると MPLAB X IDE プロジェクトからコピーしたオペコードが [Data] 列に入力されます DS00001817A_JP - p.6 2015 Microchip Technology Inc.

図 4: プログラムメモリ表示 図 5: プログラムメモリからオペコードをコピー 2015 Microchip Technology Inc. DS00001817A_JP - p.7

図 6: オペコードリスト 図 7: ファイルのインポート DS00001817A_JP - p.8 2015 Microchip Technology Inc.

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

4.0 クラス B 安全規格ソフトウェアライブラリの CRC 関数の使い方 このセクションでは ライブラリからフラッシュプログラムメモリの CRC 関数を実装する方法について説明します クラス B 安全規格ソフトウェアライブラリは フラッシュプログラムメモリと EEPROM をテストするためのソフトウェア実装 CRC 関数を提供しています CRC モジュールとは異なり ソフトウェア CRC は CRC-16-ANSI アルゴリズムのみをサポートします クラスB 安全規格ソフトウェアライブラリの使い方は DS00001799 を参照してください この関数には 3 つの引数 ( テスト開始アドレス テスト長 CRC アルゴリズムのシード値 ) があります CRC モジュールと同じ動作とするため 引数に以下の値を設定します uint16_t FlashAddress = 0x00 uint16_t Flashlength = 0x07FC uint16_t crcseed = 0xFFFF Note: テストの長さは 開始アドレスを含む値を指定します テストの戻り値は 16 ビットのチェック値です 詳細は例 2 を参照してください 4.1 API フラッシュメモリ全体に CRC テストを実行するには 以下の関数を呼び出します CLASSB_CRCFlashTest( ); 例 2: CRC ライブラリのコード uint16_t flashaddress = 0x00; uint16_t flashlength = 0x07FC; uint16_t crcseed = 0xFFFF; uint16_t CRC-libraryResult; CRC_libraryResult = CLASSB_CRCFlashTest(myAddress,length,crcSeed); 4.2 ソフトウェア CRC のタイミング CRC モジュールで 8172 命令サイクルを必要とするメモリ量の場合 ソフトウェア CRC では 216,956 命令サイクルが必要です これは 108.478 ms に相当します DS00001817A_JP - p.10 2015 Microchip Technology Inc.

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 RETLW 0x34 2048 7FF 3412 RETLW 0x12 2015 Microchip Technology Inc. DS00001817A_JP - p.11

次に この参照チェック値とライブラリまたは CRC モジュールを使って計測したチェック値を比較します ( 例 3 例 4 参照 ) 例 3: ライブラリを使って計測したチェック値との比較 if (CRC_checkValue == CRC_libraryResult) { // do nothing, check value matches } else { ErrorMode(); } 例 4: CRC モジュールを使って計測したチェック値との比較 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.

補遺 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: ウォッチドッグタイマのウィンドウ CLRWDT Instruction (or other WDT reset) Window Period Window Closed Window Open Window Delay (window violation can occur) Time-out Event 2015 Microchip Technology Inc. DS00001817A_JP - p.13

補遺 B: SMT のタイミング 信号計測タイマ (SMT) を使うと PIC16F161X ファミリの周辺モジュールまたはその他のソフトウェアイベントに対して正確なタイミングを取得できます Timer 1 が 16 ビットタイマであるのに対し SMT モジュールは 24 ビットタイマであるため 特に低速なアプリケーションで便利です FOSC/4 クロックを使って動作タイミングを計測する場合の SMT 設定方法は 例 B-1 を参照してください 例 B-1: SMT の初期化 SMT2CON0 = 0b10100000; //SMT enabled, rising edges, prescaler 1:1, //counter will halt at PR SMT2CLKbits.CSEL = 0b001; // Fosc/4 SMTxPR = 0xFFFFFF; 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 のタイミング 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.

Microchip 社製デバイスのコード保護機能に関して以下の点にご注意ください Microchip 社製品は 該当する Microchip 社データシートに記載の仕様を満たしています Microchip 社では 通常の条件ならびに仕様に従って使用した場合 Microchip 社製品のセキュリティレベルは 現在市場に流通している同種製品の中でも最も高度であると考えています しかし コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です 弊社の理解では こうした手法は Microchip 社データシートにある動作仕様書以外の方法で Microchip 社製品を使用する事になります このような行為は知的所有権の侵害に該当する可能性が非常に高いと言えます Microchip 社は コードの保全性に懸念を抱いているお客様と連携し 対応策に取り組んでいきます Microchip 社を含む全ての半導体メーカーで 自社のコードのセキュリティを完全に保証できる企業はありません コード保護機能とは Microchip 社が製品を 解読不能 として保証するものではありません コード保護機能は常に進歩しています Microchip 社では 常に製品のコード保護機能の改善に取り組んでいます Microchip 社のコード保護機能の侵害は デジタルミレニアム著作権法に違反します そのような行為によってソフトウェアまたはその他の著作物に不正なアクセスを受けた場合 デジタルミレニアム著作権法の定めるところにより損害賠償訴訟を起こす権利があります 本書に記載されているデバイスアプリケーション等に関する情報は ユーザの便宜のためにのみ提供されているものであり 更新によって無効とされる事があります お客様のアプリケーションが仕様を満たす事を保証する責任は お客様にあります Microchip 社は 明示的 暗黙的 書面 口頭 法定のいずれであるかを問わず 本書に記載されている情報に関して 状態 品質 性能 商品性 特定目的への適合性をはじめとする いかなる類の表明も保証も行いません Microchip 社は 本書の情報およびその使用に起因する一切の責任を否認します 生命維持装置あるいは生命安全用途に Microchip 社の製品を使用する事は全て購入者のリスクとし また購入者はこれによって発生したあらゆる損害 クレーム 訴訟 費用に関して Microchip 社は擁護され 免責され 損害を受けない事に同意するものとします 暗黙的あるいは明示的を問わず Microchip 社が知的財産権を保有しているライセンスは一切譲渡されません 商標 Microchip 社の名称とロゴ Microchip ロゴ dspic FlashFlex KEELOQ KEELOQ ロゴ MPLAB PIC PICmicro PICSTART PIC 32 ロゴ 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 Microchip 社では Chandler および Tempe ( アリゾナ州 ) Gresham ( オレゴン州 ) の本部 設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザインセンターが ISO/TS-16949: 2009 認証を取得しています Microchip 社の品質システムプロセスおよび手順は PIC MCU および dspic DSC KEELOQ コードホッピングデバイス シリアル EEPROM マイクロペリフェラル 不揮発性メモリ アナログ製品に採用されています さらに 開発システムの設計と製造に関する Microchip 社の品質システムは ISO 9001:2000 認証を取得しています 2015 Microchip Technology Inc. DS00001817A_JP - p.15

各国の営業所とサービス 北米本社 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel: 480-792-7200 Fax: 480-792-7277 技術サポート : http://www.microchip.com/ support URL: www.microchip.com アトランタ Duluth, GA Tel: 678-957-9614 Fax: 678-957-1455 オースティン TX Tel: 512-257-3370 ボストン Westborough, MA Tel: 774-760-0087 Fax: 774-760-0088 シカゴ Itasca, IL Tel: 630-285-0071 Fax: 630-285-0075 クリーブランド Independence, OH Tel: 216-447-0464 Fax: 216-447-0643 ダラス Addison, TX Tel: 972-818-7423 Fax: 972-818-2924 デトロイト Novi, MI Tel: 248-848-4000 ヒューストン TX Tel: 281-894-5983 インディアナポリス Noblesville, IN Tel: 317-773-8323 Fax: 317-773-5453 ロサンゼルス Mission Viejo, CA Tel: 949-462-9523 Fax: 949-462-9608 ニューヨーク NY Tel: 631-435-6000 サンノゼ CA Tel: 408-735-9110 カナダ - トロント Tel: 905-673-0699 Fax: 905-673-6509 アジア / 太平洋アジア太平洋支社 Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel: 852-2943-5100 Fax: 852-2401-3431 オーストラリア - シドニー Tel: 61-2-9868-6733 Fax: 61-2-9868-6755 中国 - 北京 Tel: 86-10-8569-7000 Fax: 86-10-8528-2104 中国 - 成都 Tel: 86-28-8665-5511 Fax: 86-28-8665-7889 中国 - 重慶 Tel: 86-23-8980-9588 Fax: 86-23-8980-9500 中国 - 杭州 Tel: 86-571-8792-8115 Fax: 86-571-8792-8116 中国 - 香港 SAR Tel: 852-2943-5100 Fax: 852-2401-3431 中国 - 南京 Tel: 86-25-8473-2460 Fax: 86-25-8473-2470 中国 - 青島 Tel: 86-532-8502-7355 Fax: 86-532-8502-7205 中国 - 上海 Tel: 86-21-5407-5533 Fax: 86-21-5407-5066 中国 - 瀋陽 Tel: 86-24-2334-2829 Fax: 86-24-2334-2393 中国 - 深圳 Tel: 86-755-8864-2200 Fax: 86-755-8203-1760 中国 - 武漢 Tel: 86-27-5980-5300 Fax: 86-27-5980-5118 中国 - 西安 Tel: 86-29-8833-7252 Fax: 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-8631 Fax: 91-11-4160-8632 インド - プネ Tel: 91-20-3019-1500 日本 - 大阪 Tel: 81-6-6152-7160 Fax: 81-6-6152-9310 日本 - 東京 Tel: 81-3-6880-3770 Fax: 81-3-6880-3771 韓国 - 大邱 Tel: 82-53-744-4301 Fax: 82-53-744-4302 韓国 - ソウル Tel: 82-2-554-7200 Fax: 82-2-558-5932 または 82-2-558-5934 マレーシア - クアラルンプール Tel: 60-3-6201-9857 Fax: 60-3-6201-9859 マレーシア - ペナン Tel: 60-4-227-8870 Fax: 60-4-227-4068 フィリピン - マニラ Tel: 63-2-634-9065 Fax: 63-2-634-9069 シンガポール Tel: 65-6334-8870 Fax: 65-6334-8850 台湾 - 新竹 Tel: 886-3-5778-366 Fax: 886-3-5770-955 台湾 - 高雄 Tel: 886-7-213-7830 台湾 - 台北 Tel: 886-2-2508-8600 Fax: 886-2-2508-0102 タイ - バンコク Tel: 66-2-694-1351 Fax: 66-2-694-1350 ヨーロッパオーストリア - ヴェルス Tel: 43-7242-2244-39 Fax: 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-90 Fax: 34-91-708-08-91 スウェーデン - ストックホルム Tel: 46-8-5090-4654 イギリス - ウォーキンガム Tel: 44-118-921-5800 Fax: 44-118-921-5820 03/25/14 DS00001817A_JP - p.16 2015 Microchip Technology Inc.