dsPIC33E FRM - Section #. Title

30 

Loading....

Loading....

Loading....

Loading....

Loading....

全文

(1)

デュアル パーティション フラッシュ プログラムメモリ

ハイライト

本書には以下の主要項目を記載しています。 1.0 はじめに ... 2 2.0 プログラムメモリのアーキテクチャ ... 2 3.0 プログラムメモリのパーティション フラッシュ動作 ... 7 4.0 フラッシュメモリのプログラミング ... 13 5.0 PSV と拡張データ空間 (EDS) ... 25 6.0 レジスタマップ ... 26 7.0 関連アプリケーション ノート ... 27 8.0 改訂履歴 ... 28

(2)

1.0

はじめに

全ての PIC24 および dsPIC33 デバイスは、ユーザコードの実行用にプログラマブル フラッシュ アレイを内蔵しています。この高書き換え耐性フラッシュアレイは、長い保持寿命と高い読み 書き耐性を兼ね備え、コードの開発と保存に優れた柔軟性を提供します。 デュアル パーティション フラッシュ プログラムメモリの本バージョンには以下の新機能が追 加されています。 • デュアル パーティション フラッシュ動作 - コードセキュリティを強化する各種オプション により、信頼性の高いブートローダ システムとアプリケーション コードのフェイルセーフ 保存をサポートします。 • ライブアップデート動作 - メイン アプリケーションを実行しながら非アクティブ コードセ グメントを変更あるいは完全に消去する事ができます。 • 実行時直接プログラミング - 実行時にデータ RAM 空間からフラッシュアレイを直接プログ ラミングできます。また、オプションにより、データ RAM イメージの圧縮が可能です。

2.0

プログラムメモリのアーキテクチャ

PIC24F と dsPIC33 は、図 2-1に示すように、4M x 24 ビットのプログラムメモリ アドレス空 間を使います。プログラムメモリ マップはユーザプログラム空間 (000000h ~ 7FFFFFh) とコ ンフィグレーション ( またはテスト ) メモリ空間 (800000h ~ FFFFFFh) に 2 等分されます。 ユーザプログラム空間はリセットベクタ、割り込みベクタテーブル (IVT)、プログラムメモリを 格納します。プログラムメモリ空間には以下の 3 通りの方法でアクセスできます。 1. 23 ビット プログラム カウンタ (PC) を使う 2. テーブル読み出し命令 (TBLRD) とテーブル書き込み命令 (TBLWT) を使う 3. プログラムメモリの任意の 32K バイトセグメントをデータメモリ アドレス空間にマッピン グする 実装されているプログラムメモリ空間は、ベクタ領域 ( リセットベクタと割り込みベクタを格 納 ) とコード領域 ( コードとフラッシュ コンフィグレーション データを格納 ) に分割されます。 ユーザプログラム空間の未実装領域 ( プログラムメモリの実装境界を超える領域 ) にアクセス すると、アドレスエラー トラップが発生します。

2.1

ベクタ領域

ベクタ領域はプログラムメモリ空間の先頭 (000000h) から始まります。この領域はマスター リ セットベクタ、ハードウェア トラップベクタ、割り込みベクタテーブル (IVT) を格納します。 IVT は実装されている全てのハードウェア割り込みに対応します。 ベクタ領域のサイズはデバイスファミリによって異なります ( アーキテクチャと IVT のサイズ が異なるため )。PIC24 のベクタ領域は 000000h ~ 0000FEh です。dsPIC33 のベクタ領域は 000000h ~ 0001FEh です。図 2-2に、これらのデバイスの IVT の違いを示します。デバイス ファミリに関係なく、ハードウェア割り込みベクタは必ず 000014h ( 割り込みベクタ 0) から始 まります。 ベクタ領域は、CodeGuard™ セキュリティ処理系内のベクタセグメント (VS) に概ね対応しま す。セキュリティ設定に応じ、ベクタ領域はブートセグメント (BS) または汎用セグメント (GS) の一部として扱われます。 2.1.1 代替割り込みベクタテーブル

全ての dsPIC33/PIC24 デバイスは、代替 IVT (AIVT) を提供します。AIVT は厳重なコードセ キュリティが求められるアプリケーションで代替例外処理のために使えます。これらのファミ リの以前のデバイスとは異なり、AIVT は固定されたアドレス領域に恒久的に配置されるのでは なく、以下の 2 つの条件が両方とも成立する場合にのみ配置されます。 • CodeGuardセキュリティが 2ページ以上のサイズを持つブートセグメント向けに設定されて いる (FBSLIM コンフィグレーション レジスタで設定 ) • AIVT が有効にされている (AIVTDIS コンフィグレーション ビットに「0」が書き込まれている) 有効にされた AIVT は、BS の最後のページの先頭から始まるアドレス領域に配置されます。各 ベクタは、ページ境界から決められたオフセットで配置されます。AIVT の総サイズと内容 ( ベ クタの順番 ) は IVT と同じです。

(3)

図 2-1: dsPIC33/PIC24 の既定値プログラム空間メモリマップ 凡例 : 上図のメモリ空間の縮尺比は不定です。 Note 1: 正確な境界アドレスは、プログラムメモリの実装サイズによって決まります。 000000h FEFFFEh FFFFFFh 000100h 0000FEh

Configuration Memory Space

U s er Memory Space DEVID (2) Reserved FF0000h 800000h 7FFFFEh Reserved xxxx00h(1) xxxxFEh(1) Unimplemented Read ‘0’

User Flash Program Memory

400000h FBOOT 801xxxh 801xxxh Reserved 000000h FEFFFEh FFFFFFh 000200h 0001FEh FF0000h 800000h 7FFFFEh xxxx00h(1) xxxxFEh(1) 400000h 801xxxh 801xxxh Addresses PIC24 dsPIC33

Flash Configuration Words Vector Area

FF0002h FF0002h

(4)

図 2-2: ベクタ領域の詳細

凡例 : BOA = ベース オフセット アドレス - ブートセグメントの最後のページの開始アドレス ( アドレスは 16 進 表記 )

Note: 上図のベクタ領域の構成は、各アーキテクチャの既定値構成です。デバイスによって異なる場合があります。 詳細は各デバイスのデータシートを参照してください。

Reset – GOTO Instruction 000000

Reset – GOTO Address 000002

Oscillator Fail Trap Vector 000004

Address Error Trap Vector Stack Error Trap Vector Math Error Trap Vector

. . .

Interrupt Vector 0 000014

Interrupt Vector 1 000016

. . .

Interrupt Vector 52 00007C

Interrupt Vector 53 00007E

Interrupt Vector 54 000080

. . .

Interrupt Vector 116 0000FC

Interrupt Vector 117 0000FE

Interrupt Vector Table Interrupt Vector Table Alternate Reserved BOA + 00 Reserved BOA + 02 Reserved BOA + 04

Oscillator Fail Trap Vector Address Error Trap Vector Stack Error Trap Vector Math Error Trap Vector

. . .

Interrupt Vector 0 BOA + 14

Interrupt Vector 1 BOA + 16

. . .

Interrupt Vector 52 BOA + 7C

Interrupt Vector 53 BOA + 7E

Interrupt Vector 54 BOA + 80

. . .

Interrupt Vector 116 BOA + FC

Interrupt Vector 117 BOA + FE

PIC24 Devices

(optional)

Reset – GOTO Instruction 000000

Reset – GOTO Address 000002

Oscillator Fail Trap Vector 000004

Address Error Trap Vector Hard Trap Vector Stack Error Trap Vector Math Error Trap Vector

. . .

Interrupt Vector 0 000014

Interrupt Vector 1 000016

. . .

Interrupt Vector 116 0000FC

Interrupt Vector 117 0000FE

Interrupt Vector 118 000100

. . .

Interrupt Vector 244 0001FC

Interrupt Vector 245 0001FE

Reserved BOA + 00

Reserved BOA + 02

Oscillator Fail Trap Vector BOA + 04

Address Error Trap Vector Hard Trap Vector Stack Error Trap Vector Math Error Trap Vector

. . .

Interrupt Vector 0 BOA + 14

Interrupt Vector 1 BOA + 16

. . .

Interrupt Vector 116 BOA + 0FC

Interrupt Vector 117 BOA + 0FE

Interrupt Vector 118 BOA + 100

. . .

Interrupt Vector 244 BOA + 1FC

Interrupt Vector 245 BOA +1FE

(5)

2.2

コード領域

コード領域は、ユーザのアプリケーション コードを格納するユーザ プログラムメモリの領域 です。コード領域は、ベクタ領域の終端からフラッシュ コンフィグレーション ワードの先頭 までの領域です。ブートセグメントが実装される場合、そのセグメントはベクタ領域の終端か ら始まり、所定の領域分拡張されます。コード領域内のブートセグメントに属さない部分は、 CordGuard セキュリティ システム内の汎用セグメント (GS) に対応します。 実装されているメモリの最後にフラッシュ コンフィグレーション ワードが格納されます。こ のコンフィグレーション ワードを除く全てのコード領域がアプリケーション コード用に使え ます。 2.2.1 フラッシュ コンフィグレーション データ 実装されているフラッシュ プログラムメモリの最後の領域 ( 通常は最後の行 ) は、フラッシュ コンフィグレーション データ用に予約されています。デバイスリセットが発生すると、このコ ンフィグレーション情報が適切なデバイス コンフィグレーション レジスタへコピーされます。 ユーザはこれらのレジスタへ直接アクセスできません。デバイス コンフィグレーション デー タを設定するには、フラッシュ コンフィグレーション ワードに必要な値を書き込む必要があ ります。 コンフィグレーション ビットの個数、順番、構成はデバイス アーキテクチャによって異なり ます。また、アーキテクチャが同じであってもデバイスファミリによって異なります。一部の デバイスは、コンフィグレーション ビットを 16 ビット コンフィグレーション ワードとして構 成します。これらは一般的に機能に基づいてグループ化されます。その他のデバイスは、コン フィグレーション ビットを個々にアドレス指定可能なコンフィグレーション バイトを単位と して構成します。図 2-3に、コンフィグレーション ワードとして構成された領域を示します。 デバイスファミリに固有の情報については、各デバイスのデータシートを参照してください。 デュアル パーティション機能を備えたデバイスの FBTSEQ コンフィグレーション ワードは、 通常、実装されているプログラムメモリの最後から2番目のコンフィグレーション ワードです。 図 2-3: フラッシュ コンフィグレーション ワード 凡例 : 上図のメモリ空間の縮尺比は不定です。 Note 1: 正確な境界アドレスはプログラムメモリの実装サイズによって決まります。 2: 上図は代表例です。フラッシュ コンフィグレーション ワード / バイトの正確な数は、デバイスおよびアー キテクチャによって異なります。全ての位置にコンフィグレーション データが格納されるわけではありま せん。実装されるコンフィグレーション ワード / バイトの正確なアドレスは、実装されているプログラムメ モリのサイズによって決まります。 000000h 000200h Vector Area 7FFFFFh

Flash Configuration Words

xxxx00h(1) xxxxFEh(1) Unimplemented Read ‘0’ User Flash Program Memory . . .(2) xxxxx4 (Configuration Word) xxxxx6 (Configuration Word) xxxxx8

(Configuration Word) xxxxxA

FBTSEQ xxxxxC

(6)

2.3

メモリ構成

プログラムメモリ空間は、ワードアドレス指定が可能なブロックとして構成されます。プログ ラムメモリ空間は 24 ビット幅として扱われますが、各アドレスを下位ワードと上位ワードに 分け、上位ワードの上位バイトが未実装であると考えた方が分かりやすいでしょう。下位ワー ドは常に偶数アドレスで、上位ワードは奇数アドレスです (図 2-4参照 )。 プログラムメモリ アドレスと PC は常に下位ワードを指します ( 従って、それらの最下位ビッ トは常に「0」です )。コード実行中は、アドレスが 2 ずつインクリメントまたはデクリメント します。 図 2-4: プログラムメモリの構成 2.3.1 プログラムメモリのアドレス指定 通常のコード実行では、プログラム カウンタ (PC) が実行のための実効アドレス (EA) を提供し ます。PC は 23 ビット幅を持ち、ユーザプログラム空間内の全てのアドレスを直接指定できま す。プログラム命令のアラインメントを維持するため、PC<0> は常に「0」です。PC は、PC<1> のインクリメントによって次のアドレスへ移動します。つまり、PC の値は 2 ずつ増加します。 テーブル読み書き動作の場合、いずれかの W レジスタからの 16 ビットアドレスと TBLPAG レ ジスタからの 8 ビットアドレスを連結する事によって EA を生成します。これにより、テーブ ル動作はユーザ空間とコンフィグレーション空間の両方へアクセスする事ができます。 4.2.1「テーブル動作におけるアドレスの生成」に、テーブル動作向のアドレス生成に関する詳 細を記載しています。 EDS (拡張データ空間)およびPSV動作の場合、Wレジスタの下位15ビットとDSRPAG/DSWPAG レジスタ (dsPIC33 の場合 ) または PSVPAG レジスタ (PIC24F の場合 ) からの 8 ビットアドレス を連結する事によって EA を生成します。EDS および PSV 動作の詳細は、『dsPIC33/PIC24Family

Reference Manual, Data Memory』(DS70595(dsPIC33 向け ) または DS39717(PIC24 向け )) を

参照してください。 0 8 16 PC Address 000000h 000002h 000004h 000006h 23 00000000 00000000 00000000 00000000 Program Memory ‘Phantom Byte’ (read as ‘0’)

least significant word most significant word

Instruction Width 000001h 000003h 000005h 000007h msw Address (lsw Address)

(7)

3.0

プログラムメモリのパーティション フラッシュ動作

デュアル パーティション フラッシュを備えたデバイスでは、FBOOTF コンフィグレーション ワードの BTMODE<1:0> ビットを設定する事により、デュアル パーティション プログラムメ モリ モードを選択します。他のコンフィグレーション ワードとは異なり、FBOOT はコンフィ グレーション メモリ空間内に配置され、他の全てのフラッシュ コンフィグレーション レジス タから離れています。そのアドレスはアーキテクチャ (PIC24 か dsPIC33 か ) によって異なり、 アーキテクチャが同じであってもデバイスファミリによって異なる場合があります。表 3-1に、 フラッシュ パーティション オプションを示します。これらのオプションについては後で説明 します。 インサーキット シリアル プログラミング ™ (ICSP™) を使ってデバイスを初期プログラミング する際に FBOOT に書き込む事で、適切にデバイスのフラッシュ パーティションモードを設定 する必要があります。実行時自己プログラミング (RTSP) 機能を使って実行時に FBOOT を書 き換える事はできません。FBOOT のビットは ICSP モードで設定する必要があります。なぜ なら、フラッシュ コンフィグレーション ワードの位置は標準パーティション モードとデュア ル パーティション モードで異なるため、予期せぬデバイス動作が生じる可能性があるからで す。 表 3-1: フラッシュ パーティション オプション

3.1

標準 ( シングル パーティション ) モード

標準モード ( シングル パーティション モードまたは標準パーティション モードとも呼ぶ ) は、 プログラムメモリの既定値動作モードです。このモードは、BTMODEx コンフィグレーション ビットが「11」( 未プログラム状態 ) である場合に選択されます。これは、以前の全ての dsPIC33/PIC24 デバイスが備えていたシングル プログラムメモリ動作モードと同じです。 標準モードでは、ユーザ プログラムメモリ全体が 1 つの連続したメモリ空間 (000000h ~実装 されているフラッシュメモリの終端アドレス ) としてマッピングされます。例えば、256K バイ トのフラッシュメモリを実装したデバイスのプログラムメモリのアドレスレンジは000000h~ 02AFFFh であり、これを超えるアドレスは未実装です。実装されているメモリの全域 ( ただし リセットベクタ、IVT、フラッシュ コンフィグレーション ワード用に予約済みの空間を除く ) が、ユーザ アプリケーション用に使えます。セグメント化したコード セキュリティを備える デバイスでは、ブートセグメントも実装される場合があります。

3.2

デュアル パーティション モード

BTMODEx コンフィグレーション ビットに「11」以外の値を書き込むと、デバイスは 3 種類 あるデュアル パーティション モードのいずれかで動作します。これらの全てのモードは、実 装されているフラッシュメモリをアクティブ パーティション(000000h~)と非アクティブ パー ティション (400000h ~ ) に 2 等分します。例えば、256K バイトのフラッシュメモリを実装し たデバイスの場合、フラッシュメモリは 2 つの 128K バイト領域 (000000h ~ 0157FFh と 400000h ~ 4157FFh) として実装されます。これら 2 つの領域の間に位置するアドレスは未実 装です (図 3-1参照 )。 デュアル パーティション モードでは、2 つのフラッシュ パーティションを使って 2 つの独立 したアプリケーションをデバイスにプログラミングできます。これらのパーティションは、パー ティション 1 およびパーティション 2 と呼びます。デバイスを初期化する際に、これらのパー ティションの 1 つがアクティブ パーティションへ動的にマッピングされて実行されます。他方 のパーティションは非アクティブ パーティションへマッピングされます。このパーティション に対しては、プログラミング動作が可能です。どちらのパーティションがアクティブ パーティ ションへマッピングされるかは、各パーティションのコードシグネチャ ( ブートシーケンス番 号と呼ぶ ) によって決まります。実行中にソフトウェア制御によって 2 つのコード パーティ ションのアクティブ / 非アクティブをスワップする事もできます。 BTMODE<1:0> パーティション オプション 11 標準モード ( シングル パーティション、既定値 ) 10 デュアル パーティション モード 01 保護されたデュアル パーティション モード 00 特権デュアル パーティション モード(1) Note 1: このモードは一部のデュアル パーティション デバイスでのみ使えます。

(8)

デュアル パーティション モードでは、アクティブ パーティション内のアプリケーションから 非アクティブ パーティション内のプログラムデータへアクセスする ( 実行はしない ) 事も、非 アクティブ パーティションの内容を書き換える事もできます。非アクティブ パーティション 内のフラッシュメモリへは、CPU のストールを必要とせずに書き込む事ができます。これによ り、重要な制御機能やタイミングが重要な通信を実行しながらアプリケーションを更新するラ イブアップデートが可能になります。特定のデュアル パーティション モードでは、コード セ キュリティと動作信頼性を確保するために処理が制限されます。 非アクティブ パーティション内のコードは実行できません。パーティションはスワップできま すが、アクティブ パーティション内のコードだけが実行可能です。 3.2.1 デュアル パーティション モード これは最も単純なモードです。アクティブ パーティションからは、パーティション 1 または 2 内のコードに対して一切の制限なくプログラミング動作を実行できます。パーティションが異 なるコードセグメント間に関連する制限は、全て拡張セキュリティ機能の設定によって決まり ます。 3.2.2 保護されたデュアル パーティション モード このモードでは、既定値コードセグメント ( パーティション 1) は全てのフラッシュ書き込み / 消去動作から保護されます。このため、フェイルセーフ用のバックアップ イメージをパーティ ション 1 に保存する事で、「工場出荷時の既定値」モードを実装できます。 このモードを使う場合、パーティション 1 が非アクティブ パーティションに割り当てられてい る間は、フラッシュメモリ動作によるパーティション 1 の書き込み / 消去はできません。コン フィグレーション ビットの設定によってパーティション 1 が書き込み保護されている場合、 パーティション 1 は常に書き込み / 消去できません。これに対しパーティション 2 は、どちら のパーティションからでも書き込み / 消去できます。 これにより、パーティション 1 にフェイルセーフ ブートローダとフェイルセーフ バックアッ プ コードイメージを一緒に格納できます。このコードイメージは既定値により実行でき、フ ラッシュの更新に失敗した時にパーティション 2 を書き直すために使えます。 3.2.3 特権デュアル パーティション モード 異なる著者によって書かれた複数のコードセグメントを実装し、その中の 1 つのセグメントの 知的所有権を保護するために高度なセキュリティが必要となるアプリケーションでは、この モードを使って追加のセキュリティ保護機能が実装できます。例えば、大部分のコードがハー ドウェアのアプリケーション開発者によって書かれたシステムで所有権のあるサードパーティ 製ライブラリを使う場合がこれに該当します。このモードは、一部のデバイスが備える拡張セ キュリティ機能を使って機能するよう設計されています。それらの機能を使うと、プログラム メモリ空間内にある各種コードセグメントを選択的に保護できます。 特権デュアル パーティション モードは、両方のパーティションの BSLIMx コンフィグレーショ ン ビットに対して特別な保護を追加するという点で、標準デュアル パーティション モードと異 なります。この保護機能はそれらのビットをロックし、ブートセグメントと汎用セグメントの サイズが変更される事を防ぎます。セキュリティを適切に設定する事で、どちらのセグメント も実行時に予期せず変更されたり読み出されたりしないよう保護する事ができます。 特権デュアル パーティション モードは、デュアル パーティション機能を備えたデバイスの一 部にだけ実装されています。詳細は各デバイスのデータシートを参照してください。

(9)

図 3-1: 標準およびデュアル パーティション モードのユーザメモリ空間マップ

凡例 : 上図のメモリ空間の縮尺比は不定です。

Note 1: 既定値のベクタ領域の境界は 000100h (PIC24) または 000200h (dsPIC33) です。

2: デュアル パーティション モードのメモリ境界値は、標準パーティション モードの 1/2 です。 3: 正確なプログラムメモリ境界は、プログラムメモリの実装サイズによって決まります。

Active Flash Configuration Words

Unimplemented Read ‘0’ Active Flash Program Memory 400000h

Flash Configuration Words Inactive Flash Program Memory Unimplemented Read ‘0’ Inactive FBTSEQ FBTSEQ 000000h 000x00h(1) 000xFEh(1)

Flash Configuration Words

0xxx00h(3) 0xxxFEh(3) Active Flash Program Memory Unimplemented Read ‘0’ Reserved 0xxxFCh(3) Partition Partition

Standard (Single Partition) Mode Dual Partition Modes

Vector Area Vector Area

Vector Area 400x00h(1) 400xFEh(1) 7FFFFEh 0xxx00h(2) 0xxxFEh(2) 0xxxFCh(2) 4xxx00h(2) 4xxxFEh(2) 4xxxFCh(2)

(10)

3.2.4 コード パーティションの選択 デュアル パーティション モードでは、アクティブ パーティションにマッピングして実行する パーティションを 2 通りの方法 ( ブートシーケンス番号を使う方法と BOOTSWP 命令を使う方 法 ) で指定できます。P2ACTIV ステータスビット (NVMCON<10>) は、どちらの物理パーティ ションがアクティブ パーティションなのか示します。P2ACTIV = 1 であればパーティション 2 が アクティブであり、P2ACTIV = 0 であればパーティション 1 がアクティブです。 ブートシーケンス番号は、デバイスリセット時にアクティブ パーティションを自動的に指定す るために使う 12 ビット値です。互いに異なるブートシーケンス番号を各パーティションの FBTSEQ フラッシュ コンフィグレーション ワードに格納する必要があります。 BOOTSWP 命令を使うと、デバイスをリセットせずにアクティブ / 非アクティブ パーティション をスワップできます。 3.2.4.1 ブートシーケンス番号 12 ビットのブートシーケンス番号は FBTSEQ フラッシュ コンフィグレーション ワード内に格 納されます。このコンフィグレーション ワードは、必ずユーザ プログラムメモリの最後 ( 他の フラッシュ コンフィグレーション ワードよりも上位のアドレス ) に置かれます (図 3-2参照 )。 他のコンフィグレーション レジスタはプログラムメモリの下位 16 ビットだけを使いますが、 FBTSEQ は 24 ビット幅の全てを使います。通常の動作条件では、各パーティションの FBTSEQ の値は互いに異なる必要があります。デュアル パーティション モードを使わない場合、 FBTSEQ の値は無視されます。 ブートシーケンス番号の実際の値をビットフィールド BSEQx (FBTSEQ<11:0>) に格納し、そ の補数を IBSEQx ビットフィールド (FBTSEQ<23:12>) に格納します。 デバイスリセット時に ブートシーケンス番号が読み出された時、BSEQx と IBSEQx の値が自動的に比較されます。 こ れらの値が互いに相補的ではない場合、そのブートシーケンス番号は無効であると見なされま す。この補数はハードウェアによって自動的に生成されません。また、書き込まれた値はハー ドウェアによって検証されません。アプリケーションは正しい補数を計算して IBSEQx に書き 込む必要があります。 デバイスリセット時に、両方のパーティションのブートシーケンス番号が比較されます。 BSEQx 値が小さい方のパーティションがアクティブ パーティションへマッピングされ、その コードが実行されます。 どちらかのブートシーケンス番号が無効である場合、ブートシーケン ス番号の大小に関係なく、デバイスは有効なブートシーケンス番号を持つパーティションをア クティブ パーティションとして選択します。 両方のブートシーケンス番号が無効である場合、 既定値により、パーティション 1 がアクティブ パーティションとして選択されます。 実行時に非アクティブ パーティションのブートシーケンス番号を他方より小さな値に書き換 える事により、パーティションのスワップを準備する事ができます。リセットが実行されると、 ブートシーケンス番号が小さい方のパーティションがアクティブになります。非アクティブ パーティションを更新した後にこの方法を使う事で、そのパーティションをリセット後にアク ティブにできます。 FBTSEQ は、その位置のおかげで、チェックサム等によるフラッシュ プログラムメモリの検 証動作から容易に除外できます。FBTSEQ の値は、実行時に ( 他方のパーティションの BSEQx 値に基づいて ) 指定される事がよくあるため、多くの場合、CRC 等のチェックサムに含める事 はできません。 図 3-3の上段のシーケンスに、ブートシーケンス番号が変更された後にデバイスリセットが発 生した場合の 2 つのコード パーティションの関係を示します。 図 3-2: FBTSEQ と他のコンフィグレーション ワードの違い ( デュアル パーティション モードにのみ適用 ) 凡例 : 灰色の領域は未実装であり、常に「0」として読み出されます。 アドレスは、実装されているプログラムメ モリの上位境界での相対位置を反映しています。 Note: FBTSEQ と他のコンフィグレーション ワードは必ずしも隣り合わせではありませんが、上図では比較を容易 にするために隣り合わせにしています。 Configuration Word 0 15 16 23 12 11 BSEQx IBSEQx FBTSEQ

(11)

3.2.4.2 BOOTSWP 命令 BOOTSWP 命令は、dsPIC33/PIC24 命令セットに対する拡張です。この命令は、デバイスリセッ トを必要とせずにコードセグメントのアクティブ / 非アクティブ パーティション間のスワップ を可能にする事により、コードのライブアップデートをサポートします。BOOTSWP 命令による パーティションのスワップは「ソフトスワップ」と呼びます。BOOTSWP 命令を実行するには、 コンフィグレーション ビット BTSWP (FIDC<25>) をクリアする必要があります。BTSWP ビッ トがセットされた状態で BOOTSWP 命令の実行が試みられた場合、NOP 命令が実行されます。 BOOTSWP 命令の直後にPC を書き込むシングルワード命令 (GOTO W、CALL W、BRA W 等) を必ず 実行する必要があります。命令のターゲットは、現在のアドレスから 32K バイト以内である事 が必要です。これらを実行するとアクティブ / 非アクティブ パーティションが入れ換わり、新 たにアクティブになったパーティション内で、GOTO 命令が指定する位置へ PC がジャンプし ます。 BOOTSWP 命令の実行後にSFTSWP ビット (NVMCON<11>) がセットされます。このビットは、 BOOTSWP命令が正しく実行された事、およびデバイスリセットによってではなくBOOTSWP命令 によって現在のアクティブ パーティションへ移行したという事をファームウェアに知らせま す。また、ステータスビット P2ACTIV (NVMCON<10>) を読み出す事で、どちらのパーティ ションがアクティブなのか確認できます。 パーティションをスワップした後も、それまで有効であった全ての周辺モジュールと割り込み は有効なままであるという事に注意が必要です。また、RAM とスタックはスワップ後も状態を 維持します。ソフトスワップを使うアプリケーションは、適切な動作を確保するために、デバ イスを再初期化するルーチンへジャンプさせる事を推奨します。 動作信頼性を確保するため、BOOTSWP 命令を実行する前に、標準的な NVM ロック解除シーケ ンス (NVMKEY レジスタに 55h と AAh を続けて書き込む、詳細は4.1「レジスタ」参照 ) を実 行する必要があります。ロック解除シーケンスを実行する前に、割り込みを無効にしておく事 も重要です。ロック解除シーケンスを実行しないと、BOOTSWP は NOP として実行されます。そ の場合でも BOOTSWP に続く GOTO 命令は実行され、PC はその時点でアクティブなパーティ ション内の指定された位置へジャンプします。同様に、BOOTSWP を標準パーティション モー ドで実行しても効果はありません。 図 3-3の下段のシーケンスに、BOOTSWP 命令が実行された時のパーティション間の関係を示し ます。BOOTSWP はパーティションを一時的にしか変更しないという事に注意が必要です。すな わち、その後でデバイスリセットが発生すると、ブートシーケンス番号が小さい方のパーティ ションが再びアクティブ パーティションへ割り当てられます。 Note: LNK 命令を使って新しいスタックフレームを生成した関数内から BOOTSWP 命令が 実行される場合、BOOTSWP の直後に GOTO ではなく CALL を使う必要があります。 そうしないと、デバイスはスタックエラー トラップを生成します。

(12)

図 3-3: パーティション スワップ方法の比較 Partition 1 FBTSEQ = 10 Partition 2 FBTSEQ = 15 000000h 400000h Partition 1 FBTSEQ = 10 Partition 2 FBTSEQ = 15 000000h 400000h 000000h

BOOTSWP Instruction Reset

400000h Partition 2 FBTSEQ = 15 Partition 1 FBTSEQ = 10 Partition 1 FBTSEQ = 10 Partition 2 FBTSEQ = 15 000000h 400000h Partition 1 FBTSEQ = 10 Partition 2 FBTSEQ = 5 000000h 400000h Partition 1 FBTSEQ = 10 Partition 2 FBTSEQ = 5 000000h 400000h

Reprogram FBTSEQ Reset

BOOTSWP Instruction Reprogramming FBTSEQ

(13)

4.0

フラッシュメモリのプログラミング

PIC24 と dsPIC33 は以下の 3 通りの方法でプログラミングできます。 • 実行時自己プログラミング (RTSP) • インサーキット シリアル プログラミング (ICSP™) • 拡張インサーキット シリアル プログラミング (EICSP) RTSP は実行時にアプリケーション ソフトウェアによって実行するのに対し、ICSP と EICSP はデバイスへのシリアルデータ接続を介して外部プログラマから実行します。ICSP と EICSP によるプログラミングは RTSP に比べて大幅に高速です。 以下では RTSP 方式について説明します。ICSP および EICSP プロトコルは、各デバイスの プ ロ グ ラ ミ ン グ 仕 様 書 で 定 義 さ れ て い ま す。こ の 文 書 は Microchip 社 ウ ェ ブ サ イ ト (www.microchip.com) からダウンロードできます。

4.1

レジスタ

プログラミング動作は 6 個のレジスタを使って制御します。NVMCON および NVMKEY レジス タは、全ての動作の有効化と選択のために使います。残りの 4 個のレジスタはデータおよびア ドレスポインタを定義します。 4.1.1 制御レジスタ NVMCON レジスタ (レジスタ 4-1) は、全てのフラッシュ プログラミング動作を制御します。 NVMOP<3:0> ビット (NVMCOM<3:0>) は、実行する書き込み / 消去動作を選択します。WR ビット (NVMCOM<15>) は選択された動作をトリガします。このビットは、その動作が完了す るまでセットされた状態を維持し、完了後にハードウェアによってクリアされます。WREN ビット (NVMCOM<14>) は、書き込み / 消去動作を有効または無効にします。WREN ビットが クリアされている場合、WR ビットをセットして動作をトリガする事はできません。 NVMKEY は書き込み専用レジスタです。このレジスタは、フラッシュメモリの予期しない書き 込み / 消去を防ぐために使います。このレジスタは、下位バイトだけが実装されます。書き込 み / 消去シーケンスを開始するには、以下のように、このレジスタに対して 2 回の連続した書 き込み ( ロック解除シーケンスと呼ぶ ) を実行する必要があります。 1. 55h を NVMKEY<7:0> に書き込む 2. AAh を NVMKEY<7:0> に書き込む NVMCON レジスタへの書き込みは、このシーケンスを実行した直後の 1 命令サイクルで 1 回 だけ実行できます。 4.1.2 アドレスレジスタ NVMADRL および NVMADRH レジスタは、書き込み動作の開始アドレスポインタを定義しま す。プログラムメモリへの書き込みは、ラッチ方式であっても RAM バッファ方式であっても、 これらのレジスタを使って書き込み先アドレスを設定します。

RAM バッファ方式の場合、NVMSRCADRL および NVMSRCADRH レジスタはデータ RAM 内 のソースデータの開始アドレスを定義します。拡張データ空間 (EDS) を備えたデバイスでは、 NVMSRCADRH レジスタを使って EDS メモリ内のアドレスを指定します。

Note: 一部のデバイスだけがデータ RAMバッファ方式のプログラミング機能を備えてい ます。詳細は各デバイスのデータシートを参照してください。

(14)

レジスタ 4-1: NVMCON: フラッシュ プログラミング制御レジスタ

R/S-0(1) R/C-0 R/C-0 R/W-0 R/C-0 R-0 R/W-0 R/C-0 WR WREN WRERR NVMPIDL(5) SFTSWP P2ACTIV RPDF(2) URERR(2)

bit 15 bit 8

U-0 U-0 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 — — — — NVMOP3 NVMOP2 NVMOP1 NVMOP0

bit 7 bit 0 凡例 : S = セットのみ可能ビット C = クリアのみ可能ビット R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット、「0」として読み出し -n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知 bit 15 WR: 書き込み制御ビット(1) 1 = フラッシュの書き込み / 消去動作を開始する 0 = 書き込み / 消去動作は完了した ( 現在実行中ではない ) bit 14 WREN: 書き込み / 消去イネーブルビット 1 = 書き込み / 消去サイクルを許可する 0 = メモリまたはヒューズ エレメントの書き込み / 消去を禁止する bit 13 WRERR: シーケンスエラー フラグビット 1 = 不正書き込み / 消去動作の停止が発生したか、未実装のプログラミング動作が選択された 0 = 書き込み / 消去動作は実行中または正常に完了した、あるいはまだ開始していない bit 12 NVMPIDL: アイドル時 NVM 給電停止イネーブルビット(5) 1 = デバイスがアイドルに移行した時にフラッシュアレイへの給電を停止する 0 = デバイスがアイドルに移行した時にフラッシュアレイへの給電を継続してスタンバイモードに する bit 11 SFTSWP: ソフトスワップ ステータスビット BTMODE<1:0> = 10 または 0x の場合 : 1 = BOOTSWP 命令によるパーティションのスワップは正常に完了した 0 = BOOTSWP 命令によるパーティションのスワップが正常に完了するのを待機中 BTMODE<1:0> = 11 の場合 : 未実装、「0」として読み出し bit 10 P2ACTIV: デュアル パーティション アクティブ ステータスビット BTMODE<1:0> = 10 または 0x の場合 : 1 = パーティション 2 がアクティブ パーティション 0 = パーティション 1 がアクティブ パーティション BTMODE<1:0> = 11 の場合 : 未実装、「0」として読み出し bit 9 RPDF: RAM バッファ行書き込みデータ フォーマット制御ビット(2) 1 = 圧縮フォーマットの行データを RAM に格納する 0 = 非圧縮フォーマットの行データを RAM に格納する Note 1: このビットは、ブラウンアウト リセット (BOR) 時にもリセットされます。 2: 一部のデバイスでは、RAM バッファ方式の行書き込み動作は使えません。その場合、これらのビットは 未実装であり、「0」として読み出されます。 3: これらのオプションを選択すると WRERR ビットがセットされ、WR ビットはクリアされます。 4: ダブルワード書き込み動作では、隣接する 2 個の命令ワード ( 各 24 ビット ) を 4 命令ワード境界に配置す る必要があります。 5: 一部のデバイスだけが実装しています。詳細は各デバイスのデータシートを参照してください。

(15)

bit 8 URERR: RAM バッファ行書き込みデータ アンダーラン エラーフラグ ビット(2) 1 = データ アンダーラン エラーのためにプログラミング動作が停止した 0 = データ アンダーラン エラーは検出していない bit 7-4 未実装 : 「0」として読み出し bit 3-0 NVMOP<3:0>: NVM 動作選択ビット (WR ビットが次にセットされた時に動作を開始 ) 1xxx = 予約済み(3) 011x = 予約済み(3) 0101 = 予約済み(3) 0100 = 非アクティブ パーティション消去動作 ( 標準パーティション モードでは「予約済み」) 0011 = ページ消去動作 0010 = 行書き込み動作 0001 = ダブルワード書き込み動作(4) 0000 = 予約済み(3) レジスタ 4-1: NVMCON: フラッシュ プログラミング制御レジスタ ( 続き ) Note 1: このビットは、ブラウンアウト リセット (BOR) 時にもリセットされます。 2: 一部のデバイスでは、RAM バッファ方式の行書き込み動作は使えません。その場合、これらのビットは 未実装であり、「0」として読み出されます。 3: これらのオプションを選択すると WRERR ビットがセットされ、WR ビットはクリアされます。 4: ダブルワード書き込み動作では、隣接する 2 個の命令ワード ( 各 24 ビット ) を 4 命令ワード境界に配置す る必要があります。 5: 一部のデバイスだけが実装しています。詳細は各デバイスのデータシートを参照してください。

(16)

4.2

テーブル命令

dsPIC33/PIC24 のプログラムメモリ空間とデータメモリ空間の間でデータを転送するための方 法の 1 つとして、テーブル命令が使えます。以下では、フラッシュ プログラムメモリのプログ ラミング時に使うテーブル命令について説明します。基本的なテーブル命令には以下の 4 つが あります。 • TBLRDL: 下位テーブル読み出し • TBLRDH: 上位テーブル読み出し • TBLWTL: 下位テーブル書き込み • TBLWTH: 上位テーブル書き込み TBLRDL および TBLWTL 命令は、プログラムメモリ空間の bit<15:0> の読み書きに使います。 TBLRDL および TBLWTL 命令は、ワードモードまたはバイトモードでプログラムメモリにアクセ スできます。 TBLRDH および TBLWTH 命は、プログラムメモリ空間の bit<23:16> の読み書きに使います。 TBLRDH および TBLWTH 命令は、ワードモードまたはバイトモードでプログラムメモリにアクセ スできます。TBLRDH および TBLWTH 命令はプログラムメモリの上位バイトにアクセスできま すが、プログラムメモリは 24 ビット幅しかないため、そのようなバイトは実際には存在しま せん。このバイトを「ファントムバイト」と呼びます。ファントムバイトを読み出すと常に 00h が返されます。ファントムバイトへ書き込んでも何も起こりません。 4.2.1 テーブル動作におけるアドレスの生成 24 ビットのプログラムメモリ空間は、同じアドレスレンジを共有する 2 つの隣り合った 16 ビッ ト空間で構成されると考える事ができます。従って、TBLRDL および TBLWTL 命令を使って下 位のプログラムメモリ空間 (PM<15:0>) にアクセスし、TBLRDH および TBLWTH 命令を使って 上位のプログラムメモリ空間 (PM<31:16>) にアクセスします。PM<31:24> に対する読み書き は、実在しないファントムバイトにアクセスします。いずれのテーブル命令も、バイトモード ではテーブルアドレスの LSb をバイト選択ビットとして使います。この LSb により、上位と 下位のどちらのプログラムメモリ空間にアクセスするのかが決まります。 図 4-1に、テーブル命令を使ったプログラムメモリのアドレス指定方法を示します。24 ビット のプログラムメモリ アドレスは、TBLPAG<7:0> ビットと、テーブル命令内で指定された W レ ジスタからの実効アドレス (EA) を連結する事で生成します (図 4-1には、参考のために 24 ビッ ト プログラム カウンタを示しています )。生成された 24 ビット EA の上位 23 ビットを使って プログラムメモリのアドレスを選択します。バイトモードのテーブル命令は、W レジスタ内の EA の LSb を使って、16 ビット プログラムメモリ ワード内のどちらかのバイトを選択します (「1」は bit<15:8> を選択し、「0」は bit<7:0> を選択する )。ワードモードのテーブル命令は、 EA の LSb を無視します。 テーブル命令は、プログラムメモリ アドレスを指定するための W レジスタに加えて、プログ ラムメモリに書き込むデータのソースまたはプログラムメモリから読み出したデータのデス ティネーションとなる W レジスタ ( またはメモリ位置を指す W ポインタ ) も指定します。バ イトモードのテーブル書き込み動作は、ソース W レジスタの bit<15:8> を無視します。 図 4-1: テーブルレジスタのアドレス指定 0 Program Counter 24 Bits Program TBLPAG Reg 8 Bits Working Register EA 16 Bits Using Byte 24-Bit EA 0 1/0 Select Table Instruction Counter Using User/Configuration Space Select

(17)

4.2.2 下位ワードへのアクセス プログラムメモリ データの下位 16 ビットへのアクセスには TBLRDL 命令と TBLWTL 命令を使 います。ワードモードのテーブルアクセスでは、W レジスタアドレスの LSb は無視されます。 バイトモードのテーブルアクセスでは、W レジスタアドレスの LSb を使って、どちらのバイト にアクセスするか指定します。図 4-2に、TBLRDL および TBLWTL 命令がアクセスするプログ ラムメモリ データ領域を示します。 図 4-2: プログラムデータのテーブルアクセス ( 下位ワード ) 4.2.3 上位ワードへのアクセス プログラムメモリ データの上位 8 ビットへのアクセスには TBLRDH 命令と TBLWTH 命令を使 います。直交性のために、これらの命令もワードモードとバイトモードをサポートしますが、 プログラムメモリ データの上位バイトは常に「0」を返します (図 4-3参照 )。 図 4-3: プログラムデータのテーブルアクセス ( 上位ワード ) 4.2.4 プログラムメモリへのデータの保存 ほとんどのアプリケーションは 16 ビット幅でデータを保存するため、プログラムメモリの上 位バイト (PM<23:16>) をデータ用に使う事はほとんどありません。上位バイトに保存されてい るデータを誤って実行してしまわないよう、上位バイトには NOP 命令 (00h または FFh) または 不正オペコード値 (3Fh) を書き込んでおく事を推奨します。TBLRDH および TBLWTH 命令は配 列のプログラム / 検証用の目的や圧縮データの保存をするアプリケーションを主な用途としま す。 4.2.5 プログラムメモリのビット挙動 フラッシュ プログラムメモリ内のビットは、「1」から「0」へ書き換える事と、書き換えたビッ トを消去して「1」へ戻す事しかできません。プログラミング シーケンスを使ってビットをセッ トしようとしても効果はありません。 0 8 16 PC Address 000100h 000102h 000104h 000106h 23 00000000 00000000 00000000 00000000 ‘Phantom Byte’ (Read as ‘0’) TBLRDL.W TBLRDL.B (Wn<0> = 1) TBLRDL.B (Wn<0> = 0) 0 8 16 PC Address 000100h 000102h 000104h 000106h 23 00000000 00000000 00000000 00000000 ‘Phantom Byte’ (Read as ‘0’) TBLRDH.W TBLRDH.B (Wn<0> = 1) TBLRDH.B (Wn<0> = 0)

(18)

4.2.6 テーブル読み出し命令の使い方 テーブル読み出しには 2 つの手順が必要です。すなわち、最初に TBLPAG レジスタと W レジス タの 1 つを使ってアドレスポインタを生成し、次にそのアドレス位置のプログラムメモリの内容 を読み出します。 例 4-1と例 4-2に、テーブル命令を使ってワードモードでプログラムメモリ内の 1 ワードを読 み出すためのサンプルコードを示します。 例 4-1: ワードモードの読み出し ( アセンブリ言語 ) 例 4-2: ワードモードの読み出し (C 言語 )

Note: dsPIC33/PIC24 向けの Microchip 社製アセンブラは、tblpage() および tbloffset() ディレクティブを提供します。これらのディレクティブは、テーブ ル命令向けに、プログラムメモリのアドレス値を生成するための適切な TBLPAG 値と W レジスタ値を選択します。詳細は『MPLAB® Assembler, Linker and

Utilities for PIC24 MCUs and dsPIC® DSCs User’s Guide』 (DS51317) を参照し

てください。

; Set up the address pointer to program space

MOV #tblpage(PROG_ADDR), W0 ; get table page value MOV W0,TBLPAG ; load TBLPAG register MOV #tbloffset(PROG_ADDR), W0 ; load address LS word ; Perform the table writes to load the latch

TBLRDL [W0], W2 TBLRDH [W0], W3

int addrOffset; int varWord1; int varWord2;

TBLPAG = ((PROG_ADDR & 0x7F0000)>>16); addrOffset = (PROG_ADDR & 0x00FFFE); varWord1 = __builtin_tblrdl(addrOffset); varWord2 = __builtin_tblrdh(addrOffset);

(19)

4.2.7 テーブル書き込み保持ラッチ テーブル書き込み命令は、書き込みデータをフラッシュ プログラムアレイに直接書き込むので なく、最初にデータを保持ラッチに格納します。これらのラッチは、コンフィグレーション メ モリ空間内にマッピングされ、通常は FA0000h から始まります。これらのラッチには、テーブ ル書き込み命令によってのみアクセスできます。全ての保持ラッチにデータを格納した後に、 特別な命令シーケンスを実行する事で、実際のメモリ書き込み動作を開始します。 保持ラッチの数はプログラムアレイの構成 ( 行書き込みのサイズとアルゴリズム ) に基づき、デ バイスごとに異なります。詳細は各デバイスのデータシートとプログラミング仕様を参照して ください。 4.2.7.1 ダブルワード書き込みの実行 ワード書き込みは、TBLWTH 命令と TBLWTL 命令のペアを使って、1 度に 2 ワードずつ書き込 みます。例 4-3 ( アセンブリ言語 ) または例 4-4 (C 言語 ) (C 言語 ) のコードシーケンスにより、 ワード書き込みモードを使ってフラッシュに書き込む 2 つの保持ラッチ位置にデータを格納す る事ができます。 例 4-3: ダブルワード書き込みの例 ( アセンブリ言語 ) 例 4-4: ダブルワード書き込みの例 (C 言語 )

; Set up the address pointer to 1st write latch

MOV 0xFA, W0 ; get table page value MOV W0,TBLPAG ; load TBLPAG register MOV 0x0, W0 ; load address LS word ; Load write data into W registers

MOV #PROG_LOW_WORD_1, W2 MOV #PROG_HI_BYTE_1, W3 MOV #PROG_LOW_WORD_2, W4 MOV #PROG_HI_BYTE_2, W5

; Perform the table writes to load the latch TBLWTL W2, [W0] TBLWTH W3, [W0++] TBLWTL W4, [W0] TBLWTH W5, [W0++] int varWord1L = 0xXXXX; int varWord1H = 0x00XX; int varWord2L = 0xXXXX; int varWord2H = 0x00XX; int addrOffset;

int TargetWriteAddressL; // bits<15:0> int TargetWriteAddressH; // bits<22:16>

NVMCON = 0x4001; // Set WREN and word program mode TBLPAG = 0xFA; // write latch upper address

addrOffset = (PROG_ADDR & 0x00FFFE); // ensure address is properly aligned NVMADRL = TargetWriteAddressL; // set target write address

NVMADRH = TargetWriteAddressH;

__builtin_tblwtl(0,varWord1L); // load write latches __builtin_tblwth(0,varWord1H);

__builtin_tblwtl(0x2,varWord2L); __builtin_tblwth(0x2,varWord2H);

__builtin_disi(5); // Disable interrupts for NVM unlock sequence

(20)

4.3

実行時自己プログラミング (RTSP)

RTSP を使うと、ユーザコードからフラッシュ プログラムメモリの内容を書き換える事ができ ます。RTSP には、TBLRD ( テーブル読み出し ) および TBLWT ( テーブル書き込み ) 命令と NVM 制御レジスタを使います。dsPIC33/PIC24 は以下のフラッシュ プログラミング動作をサポート します。 • フラッシュ ページ消去 • 行書き込み ( ラッチ方式または RAM バッファ方式 ) • ワード書き込み RTSP によるフラッシュ プログラミングは、「行」と呼ぶメモリのブロックまたはフラッシュ メモリの 2 ワードで実行します。書き込み動作を実行する前に、メモリ位置を消去する必要が ありあす。消去動作は、「ページ」と呼ぶメモリのブロック ( 複数の「行」を含む ) に対して実 行されます。1 行のサイズはデバイスごとに異なります。詳細はデバイスのデータシートを参 照してください。通常、dsPIC33/PIC24 の 1 ページは 8 行として定義されます。本書では、例 として行あたり 64 命令 ( ページあたり 512 命令 ) とします。 4.3.1 書き込み保持ラッチを使った行書き込み 4.2.7「テーブル書き込み保持ラッチ」で説明したように、ラッチ方式の行書き込み機能を実装 したデバイスは、書き込みデータを格納するための保持ラッチを備えます。実際の書き込み動 作の前に、TBLWT 命令によって、書き込みデータを順番にラッチに格納する必要があります。 行書き込みを実行する場合、命令ワードは完全な 1 行としてラッチに格納する必要があります。 RTSP プログラミングの基本シーケンスは、テーブルポインタを設定してから、一連の TBLWT 命令を実行してバッファにデータを書き込みます。その後に、NVMCON レジスタ内の制御ビッ トをセットする事により、プログラミング動作を開始します。例として、行あたり 64 命令の デバイスの場合、TBLWTL 命令と TBLWTH 命令を 64 回ずつ実行して保持ラッチにデータを格 納した後に、NVMCON のロックを解除するためのプログラミング シーケンスを実行し、WR ビットをセットします。例 4-5に、このプロセスの例を示します。 例 4-5: 保持ラッチを使った行書き込み (C 言語 ) int varWordL[64]; int varWordH[64];

int targetWriteAddressL; // bits<15:0> int targetWriteAddressH; // bits<22:16> int i;

NVMCON = 0x4002; // Set WREN and row program mode TBLPAG = 0xFA;

NVMADRL = targetWriteAddressH; // set target write address NVMADRH = targetWriteAddressL;

for(i=0; i<=63; i++) // load write latches with data

{ // to be written

__builtin_tblwtl(i, varWordL[i]); __builtin_tblwth((i * 2), varWordH[i]); }

__builtin_disi(5); // Disable interrupts for NVM unlock sequence

(21)

4.3.2 RAMバ ッファを使った行書き込み dsPIC33/PIC24 の一部のデバイスでは、TBLWT 命令を使って保持ラッチ経由でデータを転送す る代わりに、データ RAM 内のバッファ空間から行書き込みを直接実行できます。RAM バッ ファの位置は NVMSRCADR レジスタによって決まります。このレジスタには、フラッシュに 書き込むデータの先頭ワードのデータ RAM アドレスを格納します。 書き込み動作を実行する前に、フラッシュに書き込むデータの行を RAM 内のバッファ空間に格 納する必要があります。RAM には圧縮 ( パック ) フォーマットまたは非圧縮フォーマットで格納 できます。圧縮フォーマットは、フラッシュに書き込む隣り合う 2 つのプログラム データワード の最上位バイト (MSB) を RAM 内の 1 つのデータワードに格納します。非圧縮フォーマットは、 フラッシュに書き込む各データワードに RAM 内の 2 データワードを使い、1 つおきのワードの 上位バイトは 00h です。圧縮モードを使うと、データ RAM 空間の使用量を非圧縮モードの約 3/4 に節約できます。非圧縮モードは、上位のファントムバイトを含む完全な 24 ビット プログラム データワードの構造を模倣します。データ フォーマットは RPDF ビット (NVMCON<9>) で選択 します。図 4-4に、これらのフォーマットを示します。 RAM バッファにデータを格納した後に、書き込み先のフラッシュ行の 24 ビット開始アドレス をフラッシュ アドレスポインタ (NVMADRL と NVMADRH) に格納します。保持ラッチを使っ た書き込みと同様に、NVM ロック解除シーケンスを書き込んだ後に WR ビットをセットする 事により、プロセスを開始します。プロセスが始まると、デバイスは自動的に正しいラッチを フラッシュへ書き込み、全てのバイトをフラッシュに書き込むまで NVM アドレスレジスタを インクリメントします。例 4-6に、このプロセスの例を示します。データ アンダーラン エラー 条件が発生するような値を NVMSRCADR に設定した場合、URERR ビット (NVMCON<8>) が セットされてエラー条件が示されます。 RAM バッファを使った行書き込み機能を実装しているデバイスは、1 つまたは 2 つの保持ラッ チも実装しています。これらには TBLWT 命令を使ってデータを格納し、ワード書き込み動作を 実行するために使います。 図 4-4: フラッシュへ書き込む RAM データの非圧縮および圧縮フォーマット 例 4-6: データ RAM バッファからフラッシュへの書き込み (C 言語 ) MSB1 00h LSW2 LSW1 0 7 15 MSB2 00h MSB1 MSB2 LSW2 LSW1 0 7 15

Uncompressed Format (RPDF = 0) Compressed Format (RPDF = 1)

Address

Even Byte Addresses

int data[64]; // Data to be programmed in RAM int targetWriteAddressL; // bits<15:0>

int targetWriteAddressH; // bits<22:16> NVMCON = 0x4002; // Row programming

NVMCONbits.RPDF = 0; // Select compressed format NVMSRCADRL = (int)&data[0]; // Start address of data in RAM NVMADRL = targetWriteAddressL;

NVMADRH = targetWriteAddressH;

__builtin_disi(5); // Disable interrupts for NVM unlock sequence

(22)

4.4

一般的なフラッシュ プログラミング アルゴリズム

フラッシュへのプログラミング動作は、以下の不揮発性メモリ (NVM) 制御レジスタを使って制 御します。 • NVMCON • NVMKEY • NVMADRL/H • NVMSRCADRL/H ( 一部のデバイスのみ ) RTSP モードで内蔵フラッシュに対して書き込みまたは消去を実行するには、完全なプログラ ミング シーケンスが必要です。WR ビット (NVMCON<15>) をセットすると動作が始まり、動 作が完了すると WR ビットはクリアされます。 アクティブ パーティションに対してフラッシュ プログラミング動作を実行する場合 ( 特に標準 パーティション モードでは )、動作が完了するまで CPU はストールします。非アクティブ パー ティションをプログラミングする場合、CPU はストールする事なく動作を継続できます。以下 に、各プログラミング動作のアルゴリズム ( および CPU がストールするかどうか ) を示します。 4.4.1 プログラムメモリの消去 (ア クティブ パーティション ) 1. NVMOPx ビット (NVMCOM<3:0>) を「0011」に設定する事でページ消去動作を選択し、 WREN ビット (NVMCOM<14>) をセットします。 2. 消去するブロックの開始アドレスを NVMADRL/H レジスタに書き込みます。 3. 割り込みを無効にします。 4. NVMKEY に 55h を書き込みます。 5. NVMKEY に AAh を書き込みます。 6. WR ビット (NVMCOM<15>) をセットして消去サイクルを開始します。 7. NOP 命令を2 回実行します。 完了時に WR ビットが自動的にクリアされます。 4.4.2 行書き込み (ア クティブ パーティション、標準パーティション モード ) プログラム フラッシュメモリは一度に 1 行ずつ書き込む事ができます。これを実行するには、 書き込み先の行が格納されているページを消去する必要があります。 アクティブ パーティションに対する行書き込みの一般的プロセスは以下の通りです。 1. プログラムメモリの 8 行 (512 命令 ) を読み出してデータ RAM に格納します。 2. RAM 内のプログラムデータを必要なデータに書き換えます。 3. ページを消去します。 a) NVMOPx ビット (NVMCOM<3:0>) を「0011」に設定する事でページ消去動作を選 択し、WREN ビット (NVMCOM<14>) をセットします。 b) 消去するページの開始アドレスを NVMADRL/H レジスタに書き込みます。 c) NVMKEY に 55h を書き込みます。 d) NVMKEY に AAh を書き込みます。 e) WR ビット (NVMCOM<15>) をセットします。消去サイクルが始まり、完了するま でCPUがストールします。消去が完了するとWRビットが自動的にクリアされます。 4. データ RAM 内の最初の 64 命令をプログラム バッファへ書き込みます (4.2.7「テーブル書 き込み保持ラッチ」参照 )。あるいは、RAM 内に保存されているデータの開始アドレスを NVMSRCADR レジスタに格納します。 5. 以下の手順でフラッシュメモリにプログラム ブロックを書き込みます。 a) NVMOPx ビットを「0010」に設定する事で行書き込み動作を選択し、WREN ビット をセットします。 b) NVMKEY に 55h を書き込みます。 c) NVMKEY に AAh を書き込みます。 d) WR ビットをセットします。書き込みサイクルが始まり、完了するまで CPU がストー ルします。フラッシュメモリへの書き込みが完了すると、WR ビットが自動的にクリ アされます。 6. NVMADRL/H 内のアドレスをインクリメントする事により、データ RAM 内の次の 64 命令 に対して手順 4 ~ 5 を実行します。これを繰り返す事で、512 命令の全てをフラッシュに 書き戻します。

(23)

不測の動作を防ぐため、消去または書き込み動作の前に NVMKEY に対する書き込み開始シー ケンスを実行する必要があります。プログラミング コマンドを発行した後は、プログラミング 動作が完了するまで待機する必要があります。プログラミング シーケンス開始後の 2 つの命令 は NOP 命令である事が必要です。 4.4.3 非アクティブ パーティション内の 1ペ ージの書き込み (デ ュアル パーティション モード ) デュアル アーティション モードでの書き込みには特別な注意が必要です。非アクティブ パー ティションがプログラミング中であっても CPU は命令の実行を継続できるため、CPU ストー ルは発生しません。 いずれかのデュアル パーティション モードでデータの 1 ページを消去して再プログラミング するためのアルゴリズムは以下の通りです。 1. ページを消去します。 a) NVMOPx ビット (NVMCON<3:0>) を「0011」に設定する事でページ消去動作を選択 します。 b) WREN ビット (NVMCOM<14>) をセットします。 c) 消去するページの開始アドレス を NVMADR レジスタに書き込みます。 d) NVMKEY に 55h を書き込みます。 e) NVMKEY に AAh を書き込みます。 f) WR ビット (NVMCOM<15>) をセットします。消去サイクルが始まりますが、CPU は 動作を継続します。 g) 消去が完了すると WR ビットが自動的にクリアされ、NVM 書き込み完了割り込みフ ラグ (NVMIF) がセットされます。 2. フラッシュに書き込むデータを RAM バッファに格納するか、TBLWT 命令を使ってメモリ の最初の行のデータ (64 命令 ) を保持ラッチに格納します。 3. ページを書き込みます。 a) NVMOPx ビット (NVMCON<3:0>) を「0010」に設定する事で行書き込み動作を選択 します。 b) WREN ビット (NVMCON<14>) をセットします。 c) フラッシュに書き込む行の開始アドレスを NVMADR レジスタに格納します。 d) NVMKEY に 55h を書き込みます。 e) NVMKEY に AAh を書き込みます。 f) WR ビット (NVMCOM<15>) をセットします。書き込みサイクルが始まりますが、CPU は動作を継続します。 g) 書き込みが完了すると WR ビットが自動的にクリアされ、NVM 書き込み完了割り込 みフラグ (NVMIF) がセットされます。 4. 手順 2 と 3 を繰り返す事で、データの残りの行を消去済みのページに書き込みます。 Note: 書き込みまたは消去サイクル中の CPU ストールは、一部のデバイスだけで発生し ます。ストールを防ぐため、消去または書き込み中の行に対してアプリケーショ ンから読み書きしない事を推奨します。 Note 1: 行、ブロック、保持ラッチの数はデバイスによって異なります。実際の数につい ては、各デバイスのデータシートを参照してください。また、フラッシュメモリ プログラミングのリファレンス コードも参照してください。 2: 保持ラッチが 1 つしかないデバイスの場合、フラッシュ プログラムメモリはワー ドモードで書き込む必要があります。

(24)

4.4.4 非アクティブ パーティション全体の書き込み (デ ュアル パーティション モード ) 非アクティブ パーティション内のコード全体を更新する場合、手順は以下の通りです。 1. 非アクティブ パーティションを消去します。 a) NVMOPx ビット (NVMCON<3:0>) を「0100」に設定する事で非アクティブ パー ティション消去動作を選択します。 b) WREN ビット (NVMCOM<14>) をセットします。 c) NVMKEY に 55h を書き込みます。 d) NVMKEY に AAh を書き込みます。 e) WR ビット (NVMCOM<15>) をセットします。消去サイクルが始まりますが、CPU は動作を継続します。書き込みが完了すると WR ビットが自動的にクリアされ、 NVM 書き込み完了割り込みフラグ (NVMIF) がセットされます。 2. ページ書き込み動作 (4.4.3「非アクティブ パーティション内の 1 ページの書き込み ( デュ アル パーティション モード )」参照 ) を使って非アクティブ パーティションの各ページに 書き込みます。 3. 書き込んだデータを検証します。そのための 1 つの方法として、書き込む前のデータに対 して CRC を実行し、書き込み後にパーティション全体で CRC 値を検証する事で、データ が正しく書き込まれたかどうか確認できます。 4.4.5 ブートローダを使ったアクティブ パーティションの更新 1. 4.4.4「非アクティブ パーティション全体の書き込み ( デュアル パーティション モード )」 で説明した方法により、非アクティブ パーティションの全体を消去して書き込みます。 2. アクティブ パーティションの FBTSEQ コンフィグレーション レジスタを読み出します。 3. その値を 1 つデクリメントし、非アクティブ パーティションの FBTSEQ に書き込みます。 4. パーティションのスワップを実行します。 a) CPU がストールしても構わなければデバイスリセットを実行します。非アクティブ パーティションのブートシーケンス番号の方が小さいため、リセット後はこちらが アクティブ パーティションになります。 b) CPU をストールさせない場合、BOOTSWP 命令を実行します。

(25)

5.0

PSVと 拡張データ空間 (EDS)

全ての dsPIC33/PIC24 デバイスは、テーブル命令 (4.2「テーブル命令」参照 ) を使ってプログ ラムメモリ空間内のデータにアクセスできます。この方法は、データを 1 度に 1 バイトまたは 1 ワードずつ読み書きする場合に使えます。別の方法とし、プログラムメモリ空間の 16K ワー ドページをデータアドレス空間の上位 32K バイトにマッピングする方法もあります。これによ り、データ空間を通常のアドレス指定の限界 (64K バイト ) を超えて効果的に拡張できると共 に、テーブル命令を使わない透過的なアクセスが可能になります。 全ての dsPIC33/PIC24 デバイスは、実装されているプログラムメモリ空間内の任意のページを データ空間へマッピングできます。この機能は PSV と呼びます。 一部のデバイスは、特定の周辺モジュールを仮想プログラムメモリ ページの特定のレンジへメ モリマッピングする事により、PSV 機能を拡張します。この機能は、高データスループットを 要求する周辺モジュール ( 先進グラフィック コントローラ等 ) 向けに特に役立ちます。これは 拡張データ空間 (EDS) と呼びます。

PSV と EDS はデータメモリの機能として実装されます。dsPIC33 と PIC24 では、それらの実 装方法が異なります。詳細は『dsPIC33/PIC24 Family Reference Manual、Data Memory』 (DS70595 (dsPIC33 向け ) または DS39717 (PIC24 向け )) を参照してください。

5.1

PSV と命令ストール

PSV の使用による命令ストールの詳細は、『dsPIC33/PIC24 ファミリ リファレンス マニュア ル、dsPIC33E 拡張 CPU』(DS70005158) を参照してください。

Updating...

関連した話題 :