RX621やRX62Nを搭載したマイコンボード(CPUボード)は何種類か販売されているようですが、比較的安価に入手できるマイコンボードの1つとして、秋月電子通商で販売しているマイコンボードがあります。
左の写真に示すのは、秋月電子通商のRX621マイコンボードで、載っているのは100ピンのRX621(R5F56218BDFP)です。2.54mmピッチのピンヘッダで接続できるので試作や趣味の工作には便利です。
また、ミニUSB-Bコネクタが実装されているので、フラッシュメモリの書き込みやUSBポートとして使用もできます。
RX621はRX62Nからイーサネット機能を省いたもので、パッケージによる違いはありますが、両者の使い勝手は全く同じと言えます。
RX621マイコンボードはクロック96MHz(マイコン自体は100MHzまで可)で動作可能ですが、100ピンのため使用できるI/Oポートが少なくなっています、特に外部バスを使用するとほとんどなくなってしまいます。
左の写真に示すのは、秋月電子通商のRX621マイコンボードで、載っているのは100ピンのRX621(R5F56218BDFP)です。2.54mmピッチのピンヘッダで接続できるので試作や趣味の工作には便利です。
また、ミニUSB-Bコネクタが実装されているので、フラッシュメモリの書き込みやUSBポートとして使用もできます。
RX621はRX62Nからイーサネット機能を省いたもので、パッケージによる違いはありますが、両者の使い勝手は全く同じと言えます。
RX621マイコンボードはクロック96MHz(マイコン自体は100MHzまで可)で動作可能ですが、100ピンのため使用できるI/Oポートが少なくなっています、特に外部バスを使用するとほとんどなくなってしまいます。
2.RX621/RX62Nの特徴
マイコンRX621/RX62Nの特長について簡単に紹介します。詳細は『RX62Nグループ、RX621グループユーザーズマニュアル ハードウェア編』をご覧ください、ルネサスエレクトロニクスのサイトからダウンロードできます。
RXシリーズはH8SXとR32Cの上位機種ということで、CPUや周辺機能を似たようにしているようです。ただ、筆者はH8系マイコン(H8,H8S,H8SX)を触っていた者なので、H8系マイコンと比較した説明になる場合があることをご容赦願います。
主な特徴は次のようなものです(パッケージや型名により異なる場合があります)。
1)RX621/RX62Nの特徴
- 最大動作周波数100MHz
- 高速フラッシュメモリ 256K/384K/512K バイト内蔵
- 高速SRAM 64K/96Kバイト内蔵
- データフラッシュメモリ 32Kバイト内蔵
- 32 ビット単精度浮動小数点演算器を搭載
- 32 ビット乗除算器を搭載
- 命令コードはリトルエンディアン、データはリトルエンディアンかビッグエンディアンを端子によって選択可能
- イーサネットコントローラを搭載(RX62N)
- USBモジュールを搭載
- DMAC,DTC搭載
- RTC搭載(バッテリーバックアップは困難)
- 通信インタフェース(CAN,SCI,I2C,SPI)搭載
- 8,16ビットタイマカウンタ搭載
- A/D,D/Aコンバータ搭載
- その他(ただし、端子を兼用するものが多い)
3.CPUレジスタセット
下図はRX621,RX62Nを含むRX600シリーズのCPUレジスタセットです。図のように、32ビットの汎用レジスタ16本と9本の制御レジスタ、そして1本のアキュムレータで構成されています。ただし、R0はスタックポインタとして使用されるので汎用レジスタは15本と言った方がいいかもしれません。
レジスタは分割できないので、8ビットや16ビットデータであっても、汎用レジスタ上は常に32ビットに符号拡張して保持されます。汎用レジスタ16本というと多いように感じますが、H8系マイコン(H8/300H以降)で汎用レジスタを分割して使用できたことを考えると、数字上は一概に多いとは言えません。
C言語などの高級言語でプログラミングする場合、レジスタ構成などあまり気にしないと思いますが、レジスタの数が多いと実行速度が速い、あるいは効率の良い命令コードが生成できる可能性があります。
参考:汎用レジスタと制御レジスタはスタックに退避および復帰する命令を持っていますが、アキュムレータにはありません。アキュムレータをスタックに退避および復帰するには、一旦汎用レジスタを介して行います。ただし、アキュムレータの下位16ビットは退避できません。
4.H8と異なる特徴
4-1.ユーザーモードとスーパバイザモード
PSWレジスタのPMビットによって、スーパバイザーモード(PM=“0”)とユーザーモード(PM=“1”)に動作モードを切り替えることができます。これは、リアルタイムOSを使ったとき、システム側とユーザー側のメモリ管理などを分離するために、レジスタのアクセスを制限するものです。しかし、リアルタイムOSを使わない場合などでは、終始スーパバイザモードで動作させることもできます。なお、リセット直後はPM=“0”なので、スーパバイザーモードです。
ユーザーモードでは、PSWレジスタのIPL,PM,U,Iの各ビットと、ISP,INTB,BPSW,BPC,FINTBの各レジスタには書き込みできません。スーパバイザーモードであっても、PSWレジスタのPMビットを直接書き変えることはできません。
スーパバイザーモードからユーザーモードに切り替えるには、スタック中のPSWレジスタのPMビットを“1”にしてRTE命令を実行するか、BPSWレジスタのPMビットを“1”にしてRTFI命令を実行します。ユーザーモードで例外(割り込みなど)を受け付けると自動的にPM=“0”となり、スーパバイザーモードになります。
4-2.割り込み用スタックとユーザ用スタック
R15ではなく、R0レジスタがスタックポインタです。スタックはPSWレジスタのUビットで割り込み用スタック(U=“0”)とユーザ用スタック(U=“1”)に切り換えることができます。例外(割り込みなど)を受け付けると自動的にU=“0”となり、例外処理中は割り込み用スタックが使用されます。これは本来、リアルタイムOSを使ったときユーザ側のスタック容量を節約するための機能です。なお、リセット直後はU=“0”で、割り込み用スタックが使用されます。
割り込み用スタックポインタはISPに、ユーザ用スタックポインタはUSPにそれぞれ保持されているので、R0はISPまたはUSPの別名のようなものと考えられます。
4-3.リトルエンディアンとビッグエンディアン
メモリ中のデータ配置は、マイコンのモード端子(MDE)によって、リトルエンディアン(MDE=“L”)とビッグエンディアン(MDE=“H”)のどちらかを選択できます。
リトルエンディアンは、下位バイト(LSB)から上位バイト(MSB)に向かってアドレスが0,+1,+2,…と増えていく配置方法で、ビッグエンディアンは、上位バイトから下位バイトに向かってアドレスが0,+1,+2,…と増えていく配置方法です。
リトルエンディアンかビッグエンディアンかを選択できるのはメモリ中のデータ配置で、CPU の命令コードはリトルエンディアンに固定です。つまり、命令コード中にある即値(immediate:イミディエイト)データやディスプレースメント値はリトルエンディアンです。
H8マイコンに慣れた人でも馴染みやすく、あるいはH8プログラム資産の利用を容易にするために、データ配置をビッグエンディアンにする機能があるようです。
4-4.PSWレジスタのIビットは割り込み許可
割り込みの禁止/許可はPSWレジスタのIビットで一括制御できます。ただし、ユーザーモードでは変更できません。
Iビットは従来のマイコンにもありましたが、H8マイコンでCCRレジスタのIビットは割り込みマスクの機能だったので、逆になっています。
4-5.割り込み優先制御はIPLビットで行われる
同様の仕組みはH8マイコンファミリーの中にもありますが、PSWレジスタのIPLビットに設定したレベル以下の割り込みは禁止されます。
使用する全ての割り込みは、割り込み要因ごとにプライオリティレジスタ(IPRm)に優先順位を設定し、割り込み要求許可レジスタ(IERm)に許可を設定する必要があります。そして、IPRmに設定された優先順位がIPLに設定されているレベルを越えていて、かつPSWレジスタのIビットが“1”のときにその割り込みは受け付けられます。
割り込みを受け付けると、自動的にPM=“0”,U=“0”,I=“0”となるほか、IPRmの値がIPLにセットされます。従って、割り込み処理中にほかの割り込みを多重に受け付けることはありません。もし割り込み処理中に、さらに優先順位が高い割り込みを受け付けたい場合は、割り込み処理中にプログラムでI=“1”とする必要があります。
純正Cコンパイラでは、下記の例のように"enable"を指定するか、組み込み関数setpsw_iを実行すると、I=“1”とするコードが生成されます。
4-6.固定ベクタテーブルと可変ベクタテーブル
割り込みには、リセットやノンマスカブル割り込み(NMI)、未定義命令例外などの「システム系割り込み」と、INT命令(無条件トラップ)や周辺モジュールなどによる「ユーザー系割り込み」の2つがあります。
前者は固定ベクタテーブルで、0xFFFFFF80~0xFFFFFFFF番地のROMに配置しますが、後者はINTBレジスタでアドレスが決まる可変ベクタテーブルです(INTBは4の倍数であること)。この可変ベクタテーブルはRAM上に置くこともできるため、実行中にベクタを書き換えて分岐先を変更するということも可能になります。
(1)固定ベクタテーブルの例
下記にシステム系割り込みのための、固定ベクタテーブルの記述例を示します。
配列Fixed_Vectors内に記述するのは分岐先の関数名で、別に関数の実体を作成しておく必要があります。この中で関数Int_Invalidは、未定義割り込みの発生を検知したとき呼ばれるようにした例ですが、中身のないダミー関数でもかまいません。
この例では、固定ベクタテーブルのセクション名が“FIXEDVECT”なので、リンカでFIXEDVECT=0xFFFFFFD0となるよう設定してリンクします。セクション名は重複しない限り自由に決めることができます。
(2)可変ベクタテーブルの例(配列形式で手動作成)
下記にユーザー系割り込みのための、ベクタテーブルの記述例を示します。なお下記は、固定ベクタテーブルと同じように配列形式で記述した例です。
ベクタテーブルのセクション名は"#pragma section"で指定します。下記の例では“V_VECT”なので、リンカでV_VECT=XXXXXX※1のように設定してリンクします(XXXXXXはベクタテーブルを置く任意のアドレス、ただし4バイト境界)。このセクションアドレスはINTBレジスタにも設定する必要があり、それはソースプログラム中に次のように記述することで行います。
set_intb(__sectop("V_VECT"));
下記の例では、説明のためにシリアルインタフェースSCI0の受信割り込みのみを記述していますが、他に必要な割り込み処理があれば、同じように0~255のベクタに割り込み処理関数名を記述します。関数Int_Invalidは、未定義割り込みの発生を検知したとき呼ばれるようにした例です。
(3)可変ベクタテーブルの例(コンパイラによる自動生成)
下記の例のように割り込み処理関数を記述すると、ベクタテーブルを自動生成できます。
ベクタテーブルのセクション名は“C$VECT”になるので、リンカでC$VECT=XXXXXX※2のように設定してリンクします(XXXXXXはベクタテーブルを置く任意のアドレス、ただし4バイト境界)。このセクションアドレスはINTBレジスタにも設定する必要があり、それはソースプログラム中に次のように記述することで行います。
set_intb(__sectop("C$VECT"));
※1:固定ベクタテーブルの直前のROMに配置したい場合は、V_VECT=0xFFFFFB80を設定します。
※2:固定ベクタテーブルの直前のROMに配置したい場合は、C$VECT=0xFFFFFB80を設定します。
※2:固定ベクタテーブルの直前のROMに配置したい場合は、C$VECT=0xFFFFFB80を設定します。
注意:可変ベクタテーブルのセクション(前記の例ではV_VECT,C$VECT)は、可変ベクタテーブル専用です。このセクションの先頭からベクタテーブルが配置されていないと、正常に動作しません。
備考:
プログラムの記述方法や生成される関数などについては、ルネサスエレクトロニクスの純正コンパイラを前提にしています。コンパイラの詳細は、「RX ファミリ C/C++コンパイラ、アセンブラ、最適化リンケージエディタコンパイラパッケージ ユーザーズマニュアル」をご覧ください。
プログラムの記述方法や生成される関数などについては、ルネサスエレクトロニクスの純正コンパイラを前提にしています。コンパイラの詳細は、「RX ファミリ C/C++コンパイラ、アセンブラ、最適化リンケージエディタコンパイラパッケージ ユーザーズマニュアル」をご覧ください。