秋月電子通商で、マイコンRX220(R5F52206BDFM)を搭載した、比較的安価なマイコンボード(CPUボード)が販売されています(左写真)。2.54mmピッチのピンヘッダで接続できるので試作や趣味の工作には便利です。
RX220には、100ピン,64ピン,48ピンパッケージがありますが、このマイコンボードに搭載されているRX220は64ピンで、フラッシュROMを256KB、RAMを16KB内蔵したものです。
RX220は32MHzで動作可能ですが(高速オンチップオシレータの場合)、外部クロックは20MHzまでとなります。このマイコンボードに搭載されている水晶発振子は20MHzなので、メインクロックは20MHzです。
以降は、このマイコンボードを使用した例を基に説明します。
2.RX220の特徴RX220には、100ピン,64ピン,48ピンパッケージがありますが、このマイコンボードに搭載されているRX220は64ピンで、フラッシュROMを256KB、RAMを16KB内蔵したものです。
RX220は32MHzで動作可能ですが(高速オンチップオシレータの場合)、外部クロックは20MHzまでとなります。このマイコンボードに搭載されている水晶発振子は20MHzなので、メインクロックは20MHzです。
以降は、このマイコンボードを使用した例を基に説明します。
マイコンRX220の特徴について簡単に紹介します。詳細は『RX220グループユーザーズマニュアル ハードウェア編』をご覧ください、ルネサスエレクトロニクスのサイトからダウンロードできます。
RX220は、RXシリーズのマイコンなのでRX621/RX62Nなどと基本的な部分は同じですが、動作クロックをmax32MHzとし、内蔵周辺機能(周辺モジュール)を絞り込んだマイコンになっています。また、外部バスはなく、外部にメモリ等を追加することはできません。
主な特徴は次のようなものです(パッケージや型名により異なる場合があります)。
1)RX220の特徴
- 最大動作周波数32MHz(発振子および外部クロックは20MHzまで)
- 高速フラッシュメモリ 32K/64K/128K/256K バイト内蔵
- 高速SRAM 4K/8K/16K バイト内蔵
- E2データフラッシュメモリ 8Kバイト内蔵
- 32 ビット乗除算器を搭載
- 命令コードはリトルエンディアン、データはリトルエンディアンかビッグエンディアンを選択可能
- DMAC,DTC搭載
- ELC搭載(割り込みを介さず、イベント信号でモジュール動作が可能)
- RTC搭載(バッテリーバックアップは困難)
- IWDT(独立ウォッチドッグタイマ)内蔵
- 低速,高速オンチップオシレータ、IWDT専用オンチップオシレータ内蔵
- 通信インタフェース(SCI,IrDA,I2C,SPI)搭載
- 8,16ビットタイマカウンタ搭載
- 12ビットA/Dコンバータ搭載
- 多くのI/Oポート(ただし、64ピン,48ピンでは使用できなポートが多い)
- その他
下図はRX220のCPUレジスタセットです。図のように、32ビットの汎用レジスタ16本と8本の制御レジスタ、そして1本のアキュムレータで構成されています。ただし、R0はスタックポインタとして使用されるので汎用レジスタは15本と言った方がいいかもしれません。
CPUレジスタの構成は、RX621/RX62Nなどとほぼ同じですが、単精度浮動小数点演算機能はないので、FPSW (浮動小数点ステータスワード)レジスタがない構成になっています。
4.オプション設定領域と固定ベクタ 領域
RX220では、一部のオプション設定をROM中に置くことで設定するようになっています。
このオプション設定は、ROM中にあらかじめセットしておくものなので、プログラムによって設定したり変更したりすることはできません。
下表のように、オプション設定には、ユーザーブートモードで使用するもの、独立ウォッチドッグタイマ(IWDT)や電圧検出回路(LVDAa)の設定を行うものなどがありますが、ユーザーブートモードでなければ初期状態のままでも動作します。
固定ベクタは、例外を検知したときの分岐用ベクタテーブルで、一部構成は違いますがRX621/RX62Nなどと同じ配置です。
このオプション設定領域および固定ベクタ領域は、他の目的に使用できないので注意が必要です(予約領域を含む)。
オプション設定領域・固定ベクタ領域 | ||
0xFF7FFFE8 | UBコードA | ユーザーブートモードを使用するときに必要なコード |
0xFF7FFFEC | ||
0xFF7FFFF0 | UBコードB | |
0xFF7FFFF4 | ||
0xFF7FFFF8 | エンディアン選択レジスタB(MDEB) | ユーザーブートモード時のエンディアン選択 |
: | ||
0xFFFFFF80 | エンディアン選択レジスタS(MDES) | シングルチップモード時のエンディアン選択 |
0xFFFFFF84 | 予約 | |
0xFFFFFF88 | オプション機能選択レジスタ1(OFS1) | 独立ウォッチドッグタイマ(IWDT)、 電圧検出回路(LVDAa)などの設定 |
0xFFFFFF8C | オプション機能選択レジスタ0(OFS0) | |
0xFFFFFF90 | 予約 | |
0xFFFFFF94 | 予約 | |
0xFFFFFF98 | 予約 | |
0xFFFFFF9C | 予約 | |
0xFFFFFFA0 | ID コードプロテクト IDコード1~3 | ブートモードで、オンチップデバッガやPCで ROMの読み出し/プログラム/イレースを禁止す る |
0xFFFFFFA4 | 〃 IDコード4~7 | |
0xFFFFFFA8 | 〃 IDコード8~11 | |
0xFFFFFFAC | 〃 IDコード12~15 | |
0xFFFFFFB0 | 予約 | |
0xFFFFFFB4 | 予約 | |
0xFFFFFFB8 | 予約 | |
0xFFFFFFBC | 予約 | |
0xFFFFFFC0 | 予約 | |
0xFFFFFFC4 | 予約 | |
0xFFFFFFC8 | 予約 | |
0xFFFFFFCC | 予約 | |
0xFFFFFFD0 | 特権命令例外のベクタ | 例外の固定ベクタ |
0xFFFFFFD4 | 予約 | |
0xFFFFFFD8 | 予約 | |
0xFFFFFFDC | 未定義命令例外のベクタ | |
0xFFFFFFE0 | 予約 | |
0xFFFFFFE4 | 予約 | |
0xFFFFFFE8 | 予約 | |
0xFFFFFFEC | 予約 | |
0xFFFFFFF0 | 予約 | |
0xFFFFFFF4 | 予約 | |
0xFFFFFFF8 | ノンマスカブル割り込み(NMI)のベクタ | |
0xFFFFFFFC | リセット(RESET)のベクタ |
5.エンディアン
5-1.エンディアン選択レジスタ
RX621/RX62Nでは、データのエンディアンを端子によりリトルエンディアンかビッグエンディアンに切り換えられましたが注1、RX220ではROM中にあるエンディアン選択レジスタで設定します。
エンディアン選択レジスタS(MDES)注2はアドレス0xFFFFFF80番地のROM中にあり、下図に示すようにその32ビットデータのb2~b0で決まります。ただ、フラッシュROMの初期化直後は全ビット'1' になっているので、リトルエンディアンであれば改めて指定しなくても問題ありません。
注1.外部アドレス区間は、エリアごとにCSn制御レジスタ(CSnCR)によって切り替え可能です。
注2.エンディアン選択レジスタにはB(MDEB)とS(MDES)があり、アドレス0xFFFFFF80番地のMDESはシングルチップモード時のもので、ユーザーブートモードではアドレス0xFF7FFFF8番地のMDEBが使用されます。 ちなみに、MDEB/MDES内の32ビットデータはリトルエンディアンです。
注2.エンディアン選択レジスタにはB(MDEB)とS(MDES)があり、アドレス0xFFFFFF80番地のMDESはシングルチップモード時のもので、ユーザーブートモードではアドレス0xFF7FFFF8番地のMDEBが使用されます。 ちなみに、MDEB/MDES内の32ビットデータはリトルエンディアンです。
5-2.エンディアンの設定例
設定例を下記に示します(純正のC/C++コンパイラの例)。
マクロ“__BIG”を定義してコンパイルするとビッグエンディアンに、定義しないとリトルエンディアンになります。
このように#pragma addressを使って変数のアドレスを指定すると、この例では“$ADDR_C_FFFFFF80”というセクションが自動的に作成され、その先頭アドレスが0xFFFFFF80番地になります。
#pragma address _MDEreg=0xffffff80
#ifdef __BIG
const unsigned long _MDEreg = 0xfffffff8;
#else
const unsigned long _MDEreg = 0xffffffff;
#endif
#ifdef __BIG
const unsigned long _MDEreg = 0xfffffff8;
#else
const unsigned long _MDEreg = 0xffffffff;
#endif
6.レジスタライトプロテクション
6-1.プロテクトレジスタ
RX220には、プログラムが暴走した場合に重要なレジスタを書き換えられないように、保護する機能があります。
プロテクトレジスタ(PRCR)は、下図のような構成の16ビットレジスタで、PRC3,PRC1,PRC0の3ビットで下表に示すレジスタの書き換えを保護します。
つまり、下表に示すレジスタに設定する場合は、プロテクトレジスタ(PRCR)の対応するビットを'1' にしておかなければなりません。
PRC3,PRC1,PRC0の初期状態は、いずれも'0' です。
b0 | PRC0 | ・クロック発生回路関連レジスタ SCKCR、SCKCR3、MOSCCR、SOSCCR、LOCOCR、ILOCOCR、HOCOCR、 OSTDCR、OSTDSR、HOCOCR2 |
b1 | PRC1 | ・動作モード関連レジスタ SYSCR1 ・消費電力低減機能関連レジスタ SBYCR、MSTPCRA、MSTPCRB、MSTPCRC、OPCCR、RSTCKCR、MOSCWTCR、 SOSCWTCR、FHSSBYCR、HOCOWTCR2 ・クロック発生回路関連レジスタ MOFCR、HOCOPCR ・ソフトウェアリセットレジスタ SWRR |
b3 | PRC3 | ・LVD関連レジスタ LVCMPCR、LVDLVLR、LVD1CR0、LVD1CR1、LVD1SR、 LVD2CR0、LVD2CR1、LVD2SR |
6-2.プロテクトレジスタの設定例
クロック発生回路関連レジスタ、およびモジュールストップコントロールレジスタへの書き込みを許可する設定例を下記に示します注3。
1)クロック関連の設定を行う場合は、次のように設定してプロテクトを解除しておきます。
SYSTEM.PRCR.WORD = 0xA503;
/* b0:PRC0=1:クロック発生回路関連レジスタへの書き込み許可 */
/* b1:PRC1=1:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可 */
/* b3:PRC3=0:LVD関連レジスタへの書き込み禁止 */
2)モジュールストップの設定を行う場合は、次のように設定してプロテクトを解除しておきます。/* b1:PRC1=1:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可 */
/* b3:PRC3=0:LVD関連レジスタへの書き込み禁止 */
SYSTEM.PRCR.WORD = 0xA502;
/* b0:PRC0=0:クロック発生回路関連レジスタへの書き込み禁止 */
/* b1:PRC1=1:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可 */
/* b3:PRC3=0:LVD関連レジスタへの書き込み禁止 */
3)設定が終わったら、下記のように全てのレジスタへの書き込みを禁止する設定をしておきます。/* b1:PRC1=1:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み許可 */
/* b3:PRC3=0:LVD関連レジスタへの書き込み禁止 */
SYSTEM.PRCR.WORD = 0xA500;
/* b0:PRC0=0:クロック発生回路関連レジスタへの書き込み禁止 */
/* b1:PRC1=0:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み禁止 */
/* b3:PRC3=0:LVD関連レジスタへの書き込み禁止 */
/* b1:PRC1=0:動作モード、消費電力低減機能、ソフトウェアリセット関連レジスタへの書き込み禁止 */
/* b3:PRC3=0:LVD関連レジスタへの書き込み禁止 */
注3.
・純正のC/C++コンパイラ使用で、統合開発環境CS+が生成するファイル“iodefine.h”によってI/Oレジスタが定義されているものとします。
・この例では、ファイル"iodefine.h"に定義されたマクロを使用しています。
・純正のC/C++コンパイラ使用で、統合開発環境CS+が生成するファイル“iodefine.h”によってI/Oレジスタが定義されているものとします。
・この例では、ファイル"iodefine.h"に定義されたマクロを使用しています。
/* ビッグエンディアン */
/* リトルエンディアン */