Renesas



Section1
Section2
Section3
Section4
Section5
Section6




ここでは、RX610の内蔵周辺機能を幾つか取り上げ、その操作方法について解説します。 まず、I/O空間(SFR領域)の操作方法について説明します。

RX600シリーズは、メモリ空間のエンディアンをユーザが自由に指定できるバイエンディアン方式です。これに対しI/O空間は、表に示すような各レジスタのサイズに応じてアクセスを行うことで、メモリ空間のエンディアンを意識することなく、I/Oレジスタの入出力が可能となっています。したがって、必ず各グループのハードウェアマニュアルに明記されている“アクセスサイズ”でアクセスをしてください。

 次に具体的なアクセス方法について説明します。ルネサス統合開発環境により周辺モジュールのレジスタ定義ファイル(iodefine.h)が自動生成されますので、これを使用して各周辺制御レジスタへのアクセスを行います。 ファイルは、図のように各モジュールごとに構造体で定義されています。SFR領域はモジュールごとに関連する制御レジスタが固まって配置されていますので、構造体の先頭のメンバアドレスをマクロ定義し、そこから配置されている各制御レジスタの順序にしたがって、共用体でメンバ定義をしています。

 よってプログラムでの記述は、このようにマクロ定義された“モジュール名”、 そのモジュールを制御する“各種レジスタ名”、 そのレジスタへの“アクセスサイズ”というように指定します。ビットアクセスする場合は、最後のメンバで“ビット名”を指定します。

 次にRX610に内蔵されているタイマの操作について説明します。RX610グループでは、これらのタイマが内蔵されていますが、ここでは“TMR”を例に説明します。TMRはユニット0と1の2ユニットあり、各ユニットは2チャネルで構成されますので、計4チャネルが内蔵されています。

 TMR(ユニット0)のブロック図です。チャネル0、チャネル1共にTCNTレジスタが‘0’~‘FFh’まで繰り返しカウントアップするフリーランタイマとなっており、任意のデューティでパルスを出力することも可能です。タイマの周期設定は、各チャネルでそれぞれ2つあるタイマコンスタントレジスタに設定した値で決まります。それでは具体的な動きを見てみましょう。

 ここではタイマコンスタントレジスタA(TCORA)、B(TCORB)共に使用している場合で、タイマコンスタントレジスタA(TCORA)に設定した値をタイマ周期とした場合の動作例です。 TCNTレジスタ値とタイマコンスタントレジスタB(TCORB)の値が一致すると出力波形が変化します。さらにタイマコンスタントレジスタA(TCORA)と一致した時にも波形を変化させ、同時にTCNTレジスタをクリアして割り込み要求も出力することができます。

 TMRは8ビットタイマですが、ユニット0のチャネル0と1、あるいはユニット1のチャネル2と3をカスケード接続し、16ビットタイマとしても使用することができます。 TMRの実習では、カスケード接続して16ビットカウントモードで使用します。

TMRの制御はこれらのレジスタで行います。このうちTCRレジスタとTCCRレジスタのビット構成を次に示します。

TCRレジスタは、TCNTとタイマコンスタントレジスタが一致したときの割り込み要求の禁止/許可やTCNTの“0クリア”を行うタイミングなどを制御するレジスタです。 TCCRレジスタは、クロックソースを選択するレジスタです。次にこれらのビット構成を示します。

TMRをカスケード接続して“16ビットカウントモード”で使用する場合は、偶数番号チャネル(チャネル0あるいは2)のCSSビットを“11b”に設定します。これにより、TCNT0あるいはTCNT2レジスタは、16ビットカウンタの上位8ビット側のカウンタとなります。 奇数番号のチャネル(チャネル1あるいは3)は、下位8ビット側のカウンタとなりますので、TCNT1あるいはTCNT3レジスタのCSSビットとCKSビットで、任意のクロックソースを選択します。

 次にモジュールストップ機能について説明します。 RXでは、リセット解除後、消費電流を抑える目的でDMAコントローラやDTCなどデータ転送系モジュール以外の周辺モジュールにクロックが供給されていません。これを制御するレジスタが“モジュールストップコントロールレジスタ”です。各ビットごとに内蔵周辺モジュールのON/OFFを制御可能で、‘0’で動作、‘1’で停止状態となります。 モジュールストップコントロールレジスタAの“MSTPA5ビット”が、先に説明した“TMRユニット0”の“モジュールストップ設定ビット”になりますので、使用する前に必ず‘0’にしてモジュールを動作させます。

 では次に、実際にTMRの設定をしてみましょう。演習の仕様は、TMRのユニット0を使用して、LCDに“00:00:00”~“23:59:59”まで1秒間隔で繰り返しカウントアップを行います。  演習では、これらのTMR関連レジスタを設定します。

 青枠の虫食い部分を埋めてプログラムを完成させます。

 解答例はこのようになります。



 続いてRX600の割り込みコントローラについて説明します。 1つ目の特長としては、割り込み要求ごとにその伝達先をCPU、DTC、DMACからユーザが自由に選択できる点です。

 2つ目は、ベクタテーブルが固定ベクタと可変ベクタの2種類あります。INTBレジスタに設定したアドレスから1024バイトの領域が可変ベクタとなり、配置アドレスはユーザが任意に指定できます。可変ベクタには、周辺I/Oの割り込みと無条件トラップ(INT命令)が割り当てられています。また可変ベクタのアドレスの小さい方から順番に、ベクタ番号が割り付けられます。 ベクタを可変にすることで、RAM領域にベクタを配置できるため、プログラム実行中でも分岐先を変更することができます。  可変ベクタの割り込み要因割り当ての一例です。

割り込みコントローラを制御するレジスタ一覧です。これらのレジスタは、割り込み使用時に設定が必要な、各モジュール共通のレジスタです。その他のレジスタは、ユーザシステムで使用するかどうかに応じて設定します。 割り込み使用時に設定が必要な、モジュール共通レジスタのビット構成です。 “割り込み要求先設定レジスタ”が、発生した割り込み要求の伝達先を選択するレジスタです。その他のレジスタについては、次の『割り込み要求の受け付け条件』で説明します。

 RX600での割り込み要求受け付け条件を説明します。受け付け条件は、これらのAND条件となります。 ①の“周辺モジュールの割り込みイネーブルビット”は、各周辺モジュールの制御レジスタに割り当てられており、発生した割り込み要因を割り込みコントローラに出力するか否かを制御します。‘0’で禁止、‘1’で許可です。外部端子割込み(IRQ)を例にとると、IRQ許可レジスタのIRQENビットを意味し、この部分に相当します。

外部端子割り込み(IRQ)を発生させるには、まず『入力バッファコントロールレジスタ』で該当するビットをセットし、内蔵周辺機能への入力信号を許可します。また、IRQコントロールレジスタの“IRQ検出設定ビット”でエッジの極性、あるいはレベル入力など、割り込み検出要因を選択します。

③の“割り込みステータスフラグ”は、周辺モジュールの割り込み要求ごとに用意されている“割り込み要求レジスタ”の“IRビット”のことで、この部分です。つまり、“周辺モジュールの割り込みイネーブルビット”を許可することで“IRビット”が‘1’にセットされます。

②の“割り込み要求許可ビット”は、 “割り込み許可レジスタ02”~“割り込み許可レジスタ1F”までの各レジスタに配置されている“IENビット”のことで、割り込み要求信号(IR)をCPU、DTC、DMACのどれに伝達するかを制御します。 ④、⑤の条件は、割り込み要求の伝達先がCPUになっている場合の条件で、CPU内で判断されます。   ④は、割り込み要因ごとに存在する“割り込み要因プライオリティレジスタ”で設定した割り込み優先レベルのことで、PSWレジスタ内のIPL値よりも大きい必要があります。IPLの値はリセット解除後“000b”ですので、割り込みを使用する場合、レベルを‘1’以上に設定します。本来、優先レベルは多重割り込みを許可するシステムで意味を持つ条件です。 ⑤の割り込み許可ビット(Iビット)は、発生した割り込み要求をCPUが最終的に受け付けるかどうかの制御ビットです。“Iビット”が許可されていない場合、周辺I/O全ての割り込み要求がマスクされます。

 それでは、実際に外部端子割り込みを使用してみましょう。I/Oボード上のSW1はIRQ8、SW2はIRQ9にそれぞれ接続されています。SW1または2を押し下げるごとに立下りエッジが入力されるため、これによりIRQ8とIRQ9の割り込み要求を発生させます。

SW1はLED2と3の点灯/消灯を制御し、SW2はLCDに表示されている24時間時計の開始/停止を制御します。 演習では、これらのIRQ関連レジスタを設定します。

 青枠の虫食い部分を埋めてプログラムを完成させます。

 解答例はこのようになります。