拡張データ空間
(EDS)
を備えた
データメモリ
45
セクション 45. 拡張データ空間 (EDS) を備えたデータメモリ
ハイライト
本セクションには下記の主要項目を記載しています。 45.1 はじめに ... 45-2 45.2 データメモリの構成 ... 45-3 45.3 拡張データ空間 ... 45-7 45.4 データ配置 ... 45-14 45.5 ソフトウェア スタック ... 45-15 45.6 プログラムメモリとデータメモリ間のインターフェイス ... 45-15 45.7 関連アプリケーション ノート ... 45-16 45.8 改訂履歴 ... 45-1745.1
はじめに
USB やグラフィック等の大容量メモリが必要なアプリケーションに対応するために、PIC24F マイクロコントローラ (MCU) の一部のデバイスのデータアドレス空間は拡張されています。拡 張データ空間 (EDS) を備えた PIC24F MCU は、最大 16M バイトの内部および外部の追加デー タメモリにアクセスできます。外部メモリへのアクセスには拡張パラレルマスタ ポート (EPMP) を使用します。他のハーバード アーキテクチャ採用デバイスと同様、PIC24F MCU も プログラムとデータ用に別々のメモリ空間とバスを備えます。PIC24F アーキテクチャでは、 コード実行中にデータ空間からプログラムメモリに直接アクセスする事も可能です。
拡張データ空間
(EDS)
を備えた
データメモリ
45
45.2
データメモリの構成
45.2.1
データアドレス空間
PIC24F コアは、単一の連続領域としてアクセス可能な 16 ビット幅のデータメモリ空間を備え ます。データ空間へのアクセスには、読み出し用と書き込み用にそれぞれ 1 つずつ ( 計 2 つ ) のアドレス生成ユニット(AGU)を使用します。データ空間のメモリマップを図45-1に示します。 データメモリ空間の 16 ビット幅データアドレスは、データ空間 (DS) 内のアドレスをバイト単 位で指定します。この DS アドレス領域は 64K バイトまたは 32K ワードです (2K バイトの SFR 領域を含む )。DS の下位 32K バイト (0x0000 ~ 0x7FFF) は、EDS 付きではない PIC24F MCU と互換です。DS の上位 32K バイト (0x8000 ~ 0xFFFF) は、EDS ウィンドウとして使用します。EDS ウィ ンドウは、EDS に実装された全てのメモリ領域へのアクセスに使用します ( 図 45-2 参照 )。 EDS は、データアドレス空間の下位 32K バイトではアクセスできない追加の内部データメモ リと、拡張 PMP を介してアクセスする外部メモリの全てを含みます。EDS 付きの PIC24F MCU では、プログラムメモリ (PM) も EDS から読み出す事ができます。これは PSV と呼ばれます。 EDS は複数のページとして構成され、EDS ページと呼ばれる個々のページは EDS ウィンドウ (32K バイト ) と同じ構造を持ちます。EDS ページの選択には、データ空間読み出しレジスタ (DSRPAG) とデータ空間書き込みレジスタ (DSWPAG) を使用します。PSV では DSRPAG レジ スタのみを使用します。DSxPAG レジスタの値と 16 ビット幅データアドレスの組み合わせに より、24 ビットの実効アドレス (EA) を形成します。内部拡張データメモリと外部データメモ リおよび PM からのデータ読み出し用 PSV アドレス空間にアクセスする EDS アドレス空間向 けに EA を生成する詳細な方法は、セクション 45.3.1「EDS からのデータアクセス」に記載し ています。
45.2.2
データ空間と拡張データ空間の構造
データメモリ空間は 16 ビット幅ブロックにより構成され、バイトアクセスが可能です。デー タはデータメモリとレジスタに 16 ビットワードとして配置されますが、全てのデータ空間と 拡張データ空間の実効アドレス (EA) はバイト単位で指定できます。各ワードの下位バイト (LSB) は偶数アドレス、上位バイト (MSB) は奇数アドレスを持ちます。図 45-1 に、データ空 間のメモリマップを示します。 Note: デバイスごとのデータメモリの実装については各デバイスのデータシートを参照 してください。図 45-1: PIC24F のデータ空間メモリマップ(1,3,5) 0x0000 0x07FE 0xFFFE LSB アドレス LSB MSB MSB アドレス 0x0001 0x07FF 0xFFFF 0x8001 0x8000 0x7FFF 0x0801 0x0800 ニアデータ SFR SFR 空間 0x7FFE 空間 空間(2) 0x1FFE 0x2000 0x1FFF 0x2001 32 K バイト EDS ウィンドウ 30 K バイト データ RAM Note 1: データメモリの各領域の大きさの縮尺は不統一です。 2: ニアデータメモリへは、13 ビットアドレスをオペコードで指定するファイル レジスタ命令を使用して直接ア クセスできます。ニアデータメモリ領域は少なくとも SFR 空間の全てを含みます。 3: データメモリの全体には、ワーキング レジスタ命令を介して間接的にアクセスできます。 4: データメモリの上位 32K バイト領域には 1 ページの EDS を配置できます。 5: データメモリの実装サイズはデバイスによって異なります。詳細は各デバイスのデータシートを参照してくだ さい。 上位 1/2(4) 下位 1/2
拡張データ空間
(EDS)
を備えた
データメモリ
45
図 45-2 に DS、EDS、PSV 空間を示します。 図 45-2: PIC24F のデータメモリ、EDS、PSV 空間45.2.3
ニアデータメモリ
0x0000 ~ 0x1FFF の 8K バイトのアドレス空間はニアデータメモリと呼ばれます。全てのファ イルレジスタ命令は、13 ビット絶対アドレス フィールドを介してニアデータメモリを直接ア ドレッシングできます。 ニアデータメモリには、任意の 16 ビット ワーキング レジスタでデータメモリ アドレスを指定 する全ての間接アドレッシング モードでもアセスできます。0x1FFF より上位のデータメモリ 領域 (EDS ウィンドウを含む ) には、間接アドレッシング モードでのみアクセスできます。 ニアデータ空間に含まれるメモリ領域は、PIC24F ファミリ各製品のデータメモリ実装サイズ によって異なります。ニアデータメモリ空間は少なくとも全ての SFR を格納します。詳細は図 45-1 を参照してください。 0x0000 データメモリ (内部拡張と外部 ) Special Registers 30 KB Data 32 KB EDS Window Memory 0x8000 プログラムメモリ DSxPAG= 0x001 DSxPAG= 0x002 DSxPAG= 0x1FF DSRPAG= 0x200 DSRPAG= 0x2FF DSRPAG= 0x300
DSRPAG = 0x3FF Function 0x008000 0x00FFFE 0x010000 0xFF8000 0x000000 0x7F8000 0x000001 0x7F8001
0x017FFE 0xFFFFFE 0x007FFE 0x7FFFFE 0x007FFF 0x7FFFFF EDS Window EDS Window PSV Window PSV Window PSV Window Upper Word PSV Window Upper Word EDS Window Lower Word Lower Word 0x0800 0xFFFE
45.2.4
SFR 空間
ニアデータ空間の先頭 2K バイト (0x0000 ~ 0x07FF) は、主として特殊機能レジスタ (SFR) を 格納します。PIC24F コアと周辺モジュールは、これらの SFR を使用してデバイスの動作を制 御します。 SFR は制御するモジュールごとにグループ化されています。SFR 空間の多くの領域は未使用ア ドレスとなっており、これらは「0」として読み出されます。SFR 空間内の各種 SFR の配置を 表 45-1 に示します。表内の 1 つの実装領域は 32 バイト領域を表し、少なくとも 1 つのアドレ スを SFR として実装します。 表 45-1: SFR 空間の配置(1) SFR 空間アドレス xx00 xx20 xx40 xx60 xx80 xxA0 xxC0 xxE0 0x000 コア ICN 割り込み — 0x100 タイマ キャプチャ — コンペア — — —0x200 I2C™ UART SPI — — I/O
0x300 ADC/CTMU — — — — — — 0x400 — — — — — — — — 0x500 — — — — — — — — 0x600 拡張 PMP RTC/Comp CRC — PPS — 0x700 GFX コントローラ システム NVM/PMD — — — — 凡例 : — = SFR を実装していないブロック Note 1: 実際のレジスタ配置については各デバイスのデータシートを参照してください。
拡張データ空間
(EDS)
を備えた
データメモリ
45
45.3
拡張データ空間
EDS 付き PIC24F デバイスの CPU アーキテクチャは、最大 16M バイトのデータ空間の追加を 可能にします。EDS へのアクセスには、常に 32K バイトの EDS ウィンドウを使用します。こ のため EDS の各ページには、32K バイトのメモリ空間を格納できます。アドレッシング可能 なページ数は、読み出し時と書き込み時で異なります。書き込み時には 511 ページ (0x001 ~ 0x1FF) にアクセスでき、読み出し時には 1023 ページ (0x001 ~ 0x3FF) にアクセスできます。 読み出しと書き込みの両方が可能な下位の 511 ページ (0x001 ~ 0x1FF) は拡張データメモリ 用、読み出しのみ可能な上位の 512 ページ (0x200 ~ 0x3FF) は PSV 用です。表 45-2 に DS、 EDS、PSV を含むデータメモリ全体のメモリマップを示します。 表 45-2: EDS 付き PIC24F の各種アドレス空間 DSRPAG データ空間 読み出しレジスタ DSWPAG データ空間 書き込みレジスタ 間接アドレッシング時 のソース / デスティネー ション アドレス DS、EDS、 PSV 用 24 ビット EA 備考 x(1) x(1) 0x0000 ~ 0x1FFF 0x000000 ~ 0x001FFF DS; ニアデータメモリ(2) 0x2000 ~ 0x7FFF 0x002000 ~ 0x007FFF DS 0x001 0x001 0x8000 ~ 0xFFFF 0x008000 ~ 0x00FFFE EDS; 32 K バイト / ページ 0x002 0x002 0x010000 ~ 0x017FFE • • • • • • • • • 0x1FF 0x1FF 0xFF8000 ~ 0xFFFFFE 0x200 ---(3) 0x000000 ~ 0x007FFE PSV、4M プログラム命令 (8M バイト ) の下位ワード、読み 出し専用 • • • • • • 0x2FF 0x7F8000 ~ 0x7FFFFE 0x300 0x000001 ~ 0x007FFF PSV、4M プログラム命令の上 位ワード (4M バイトを使用、 残りの 4M バイトはファント ムバイト )、 読み出し専用 • • • • • • 0x3FF 0x7F8001 ~ 0x7FFFFF 0x000 0x000 無効アドレス アドレスエラー トラップ(4)
Note 1: ソース / デスティネーション アドレスが 0x8000 より下位の場合、DSRPAG と DSWPAG は無視されます。
2: このデータ空間は、直接アドレッシングによるアクセスも可能です。
3: DSWPAG は 9 ビットレジスタであるため、EDS 機構を使用して 0x1FF を超える EDS ページに書き込
む事はできません。
4: ソース / デスティネーション アドレスが 0x8000 以上かつ DSRPAG/DSWPAG がゼロの場合、アドレス
内部 RAM の物理的実装サイズはデバイスによって異なります。例えば PIC24F256DA210 ファ ミリのデバイスは合計 96K バイトの内部 RAM を持ち、その中の 30K バイトを DS の下位 32K バイト (2K バイトは SFR) に物理的に実装し、残りの 66K バイトを EDS に物理的に実装しま す。EDS ページ 1 とページ 2 で合計 64K バイト ( 各ページ 32K バイト ) を実装し、ページ 3 は残りの 2K バイトを実装します。EPMP アドレスもこの EDS に含まれます。EPMP の詳細は 「PIC24F ファミリ リファレンス マニュアル」のセクション 42.「拡張パラレルマスタ ポート (EPMP)」 (DS39730) を参照してください。
45.3.1
EDS からのデータアクセス
32K バイトの EDS ウィンドウは、データ空間アドレスの Bit 15 がセットされている時に有効 です。この際、任意のワーキング レジスタ (Wn) に設定した DSRPAG/DSWPAG レジスタに適 切な EDS ページを格納する必要があります。その 32k バイトの EDS ウィンドウは、選択され た EDS ページのアドレスに割り付けられます。EDS ページの選択には、メモリ読み出し時に DSRPAG レジスタ、書き込み時に DSWPAG レジスタを使用します。EDS 付き PIC24F MCU は、ページ境界を越える際にこれらのページレジスタを自動的に更新しません。アセンブリコー ドを作成する場合、ページ境界をまたぐデータメモリ アクセスにはページレジスタの更新を配 慮する必要があります。C コンパイラはアドレッシングを常時監視しているため、ページ境界 をまたぐアクセスではページレジスタを自動的にインクリメント / デクリメントします。 45.3.1.1 内部拡張データメモリへのアクセス データメモリを読み書きするための EDS 実効アドレス (EA) の生成方法を図 45-3( 読み出し ) と図 45-4( 書き込み ) に示します。 図 45-3: 読み出し時の EDS アドレスの生成 図 45-3 に示すように、DS アドレスの最上位ビット (MSb) が「1」かつ DSRPAG<9> = 0 の時、 DSRPAG の下位 9 ビットと DS アドレスの下位 15 ビットを連結して、読み出し用の 24 ビッ ト EDS 空間アドレスを形成します。 Note 1: EDS ページ 0 にはアクセスできません。アクセスするとアドレスエラー トラップ が発生します。 2: 現在の EDS ページから次の EDS ページへの自動的なインクリメント / デクリメ ントは行われません。EDS ページの境界を越えてアクセスする場合、適切なペー ジ番号を DSRPAG と DSWPAG に書き込む必要があります。 DSRPAG Reg Select Wn 9 8 15 Bits 9 Bits24-Bit EDS Address
Wn<0> 0 = SRAM and Enhanced PMP
1 0 Note: バイト動作では、DS アドレスの最下位ビット (Wn<0>) によってどちらのバイト にアクセスするのかが決まります。このビットが「0」であれば下位バイト (LSB) にアクセスし、「1」であれば上位バイト (MSB) にアクセスします。ワード動作で は、Wn<0> を「0」に維持しないとアドレスエラーが発生します。
拡張データ空間
(EDS)
を備えた
データメモリ
45
図 45-4: 書き込み時の EDS アドレスの生成 図 45-4 に示すように、DS アドレスの最上位ビット (MSb) が「1」の時、DSWPAG の下位 9 ビットと DS アドレスの下位 15 ビットを連結して、書き込み用の 24 ビット EDS 空間 アドレスを形成します。 45.3.1.2 外部データメモリ (EPMP) へのアクセス 拡張データ空間インターフェイスは、CPU から外部データメモリへの直接アドレッシングを可 能にします。外部データメモリへのアクセスには EPMP を使用します。この動作モードでは、 EPMP モジュールを有効にし (PMPEN = 1)、これをマスタモードに設定する (MODE<1:0> = 11) 必要があります。 EPMP モジュールは、外部データメモリの読み書き時に必要な全ての制御信号を生成します。 詳細は「PIC24F ファミリ リファレンス マニュアル」のセクション 42.「拡張パラレルマスタ ポート (EPMP)」を参照してください。 CPUから外部メモリにアクセスするための推奨PMPコンフィグレーションは以下の通りです。 • 16 ビットポート ( インターフェイス ) の場合 : アドレス多重化なし、開始または中間のデー タ待機なし、8/16 ビットアクセス • 8 ビットポート ( インターフェイス ) の場合 : アドレス多重化なし、開始または中間のデー タ待機なし、8 ビットアクセスのみ 外部メモリの読み書き用実効アドレス (EA) の生成方法を図 45-3( 読み出し ) と図 45-4( 書き込 み ) に示します。 DSWPAG Reg Select Wn 8 15 Bits 9 Bits24-Bit EDS Address
Wn<0> 1 0 Note 1: EPMP モジュールを無効またはマスタモード以外に設定して外部メモリ空間にア クセスすると、アドレスエラー トラップが発生します。 2: 物理的に実装されていない外部メモリからの読み出しは意味のないデータを返 し、物理的に実装されていない外部メモリへの書き込みはダミー書き込みとなり ます。
45.3.1.3 プログラムメモリへのアクセス (PSV)
図 45-5 に、PIC24F のプログラムメモリ (PM) の構造を示します。プログラムメモリ空間は 24 ビット幅として扱われますが、この空間の各アドレスを 2 ワード ( 上位ワードと下位ワード ) と見なして、上位ワードの上位バイトが実装されていないと考えた方が適切です。EDS を持た ない PIC24F デバイスは、上位ワードの PSV 読み出しをサポートしません。EDS 付きの PIC24F デバイスのみが、プログラムメモリの上位ワードの PSV 読み出しをサポートします。上位ワー ドの下位バイトは PM データを格納し、上位バイトは常にゼロとして読み出されます。 図 45-5: プログラムメモリの構成 PM 全体には、EDS ページ 0x200 ~ 0x3FF を介してアクセスできます。EDS ページ 0x200 ~ 0x2FF は下位ワードを格納し、EDS ページ 0x300 ~ 0x3FF は上位ワードを格納します。適切 なページを選択する事により、必要な PM 位置からデータを読み出す事ができます。各ページ は 32K バイトのデータにアクセスできます。 図 45-6 に、プログラムメモリ読み出し時の PSV 実効アドレス (EA) の生成方法を示します。 図 45-6: 読み出し時の PSV アドレスの生成 00000000 00000000 00000000 00000000 上位ワード 下位ワード ( 下位バイトのみ実装 ) 0 8 16 23 ファントムバイト、「0」として読み出し 0x000001 0x000003 0x000005 0x000007 0x000000 0x000002 0x000004 0x000006 DSRPAG Reg Select Wn 9 8 15 Bits 9 Bits Wn<0> 1 = PSV 1 0 0 = プログラムメモリの下位ワード 1 = プログラムメモリの上位ワード 24-Bit PSV Address
拡張データ空間
(EDS)
を備えた
データメモリ
45
DS アドレスの MSb が「1」かつ DSRPAG<9> が「1」の時、DS アドレスの下位 15 ビットと DSRPAG レジスタの下位 9 ビットを連結する事により、24 ビット PSV アドレスを形成しま す。この 24 ビット PSV アドレスは、プログラムメモリの位置を指します。DSRPAG<8> に よってプログラムメモリの上位と下位どちらのワードにアクセスするのかが決まります。この ビットが「0」の時に下位ワードを読み出し、「1」の時に上位ワードを読み出します。45.3.2
EDS の読み出し
EDS 空間からの全ての読み出し動作には、EDS を使用しない場合よりも 1 命令サイクル多く かかります。従って、1 回の EDS 読み出しに少なくとも 2 命令サイクルが必要です。REPEAT 命令による EDS 読み出しでは、最初の 2 回のアクセスに 3 サイクルを要し、その後のアクセ スには 1 サイクルしか要しません。EDS 読み出しには 2 段階の手順が必要です。まず、適切な EDS ページ番号を DSRPAG レジ スタに格納してアドレスポインタを設定し、オフセットアドレスをいずれかのワーキング レジ スタに割り当てます。次に、上記で指定した EDS アドレスからデータを読み出します。 例 45-1 に、EDS から 1 バイト、1 ワード、2 ワードを読み出す方法を示します。 例 45-1: EDS 読み出しのサンプルコード Note 1: 上位ワードの上位バイト ( ファントムバイト ) の読み出しは 0x00 を返します。 2: 通常 PSV はデバイスに実装されたフラッシュメモリであり、EDS 機構を使用し て書き込む事はできません。しかし、テーブル書き込みを使用してプログラムメ モリ空間にデータを書き込む事ができます。
; Set the EDS page from where the data to be read mov #0x001 , w0
mov w0 , DSRPAG ;page 0x001 is selected for read
mov #0x800 , w1 ;select the location (0x800) to be read
bset w1 , #15 ;set the MSB of the base address, enable EDS mode ;Read a byte from the selected location
mov.b [w1++] , w2 ;read Low byte mov.b [w1++] , w3 ;read High byte ;Read a word from the selected location mov [w1] , w2 ;
;Read Double - word from the selected location
例 45-2 に、PSV から 1 バイト、1 ワード、2 ワードを読み出す方法を示します。 例 45-2: PSV 読み出しのサンプルコード
;Reading Lower word of program memory
;Set the EDS page from where the data to be read mov #0x220 , w0
mov w0 , DSRPAG ;page 0x220 is selected for read
mov #0x0C00 , w1 ;select the location (0x0C00) to be read
bset w1 , #15 ;set the MSB of the base address, enable EDS mode ;Read a byte from the selected location
mov.b [w1++] , w2 ;read Low byte mov.b [w1++] , w3 ;read High byte ;Read a word from the selected location mov [w1] , w2 ;
;Read Double - word from the selected location
mov.d [w1] , w2 ;two words read, stored in w2 and w3 ;Reading Upper word of program memory
;Set the EDS page from where the data to be read mov #0x320 , w0
mov w0 , DSRPAG ;page 0x320 is selected for read
mov #0x0C00 , w1 ;select the location (0x0C00) to be read
bset w1 , #15 ;set the MSB of the base address, enable EDS mode ;Read a byte from the selected location
mov.b [w1++] , w2 ;read Low byte
mov.b [w1++] , w3 ;read High byte, always 0x00 (Phantom byte) ;Read a word from the selected location
mov [w1] , w2 ;
;Read Double - word from the selected location
拡張データ空間
(EDS)
を備えた
データメモリ
45
45.3.3
EDS の書き込み
EDS への全ての書き込み動作は 1 サイクルで実行されます。EDS 読み出しと同様に、EDS 書 き込みにも 2 段階の手順が必要です。まず、適切な EDS ページ番号を DSWPAG レジスタに格 納してアドレスポインタを設定し、メモリアドレスをいずれかのワーキング レジスタに割り当 てます。次に、上記で指定したアドレスにデータを書き込みます。
例 45-3 に、EDS に 1 バイト、1 ワード、2 ワードを書き込む方法を示します。 例 45-3: EDS 書き込みのサンプルコード
; Set the EDS page where the data to be written mov #0x002 , w0
mov w0 , DSWPAG ;page 0x002 is selected for write
mov #0x800 , w1 ;select the location (0x800) to be written bset w1 , #15 ;set the MSB of the base address, enable EDS
;mode ;Write a byte to the selected location mov #0x00A5 , w2
mov #0x003C , w3
mov.b w2 , [w1++] ;write Low byte mov.b w3 , [w1++] ;write High byte ;Write a word to the selected location mov #0x1234 , w2 ;
mov w2 , [w1] ;
;Write a Double - word to the selected location mov #0x2233 , w2
mov #0x4455 , w3
mov.d w2 , [w1] ;2 EDS writes
Note 1: EDS での読み出し - 変更 - 書き込み動作に REPEAT 命令を使用する事はできません。 2: 読み出し - 変更 - 書き込み動作 ( ビット操作命令等 ) の実行には DSRPAG レジス