マイコン・メモ
マイコンRX220の使い方(2)
 ホームページ  トップページ  前ページ
 

7.マイコンの初期化

マイコンRX220は、RX621/RX62Nなどと比べ、クロックとI/Oポートの初期化が少々厄介です。
ルネサスエレクトロニクスで公開している下記の資料を基に、クロックとI/Oポートの初期化について説明します。

■参考資料■
(1)RX220グループ アプリケーションノート「RX220初期設定例」 :ルネサス エレクトロニクス
(2)RX220 CubeSuite+用ルネサススタータキットのサンプルコード :ルネサス エレクトロニクス

7-1.前提とするファイル構成

ここでは統合開発環境CS+を使用してC言語でプロジェクトを作成し、下表に示すひな型ファイルがプロジェクト・フォルダにあるものとして説明します。
初期設定はファイル“hwsetup.c”で行いますが、初期状態ではプロジェクトに入っていないので、CS+のメニューから、「プロジェクト」→「追加」→「既存のファイルを追加」を選択して、“hwsetup.c”をプロジェクトに加えます。

「プロジェクト・ツリー登録」欄が“-”となっているファイルで、“hwsetup.c”以外にも必要なものがあれば同様に登録する必要があります。
ただし、“lowlvl.src”,“lowsrc.c”,“lowsrc.h”は、標準入出力注1を使用しない場合は追加する必要ありません。また、ヒープメモリ注2を使用しない場合は、“sbrk.c”,“sbrk.h”は無くてもかまいません。

参考:マイコンRX621/RX62Nにおいても、下表と同様のひな型ファイルが作成されます。

ファイル名 説 明 プロジェクト・ツリー登録 補 足
プロジェクト名.c main関数の定義 メイン関数のファイル。“プロジェクト名”はプロジェクト作成時に指定したものです。
dbsct.c 標準セクションの設定 セクションを初期化するために必要なセクション名のリストです。
hwsetup.c ハードウェア初期化用ファイル マイコンおよび周辺回路の初期化を行います。
intprg.c 割り込み関数の定義
iodefine.h I/Oレジスタの定義 マイコンのI/Oレジスタをアクセスするための定義ファイルです。
lowlvl.src I/O入出力用低レベル関数の定義(アセンブラ用) 標準入出力用の低水準インタフェースルーチン(アセンブリ言語部分)
lowsrc.c I/O入出力用低レベル関数の定義 標準入出力用の低水準インタフェースルーチン(C言語部分)。
lowsrc.h I/O入出力用低レベル関数のプロトタイプ     〃    のヘッダファイル
resetprg.c C言語用初期化の定義 エントリー関数PowerON_Reset_PCが定義されているファイルです。
sbrk.c ヒープ・メモリ確保用関数の定義
sbrk.h ヒープ・サイズの定義
stacksct.h スタック用pragmaの定義 スタックサイズを定義しているだけです。
typedefine.h sbrk.cなどで使用する型のtypedefineの定義
vect.h 割り込みベクタ関数のプロトタイプ
vecttbl.c 割り込みベクタ・テーブルの定義

注1.標準入出力とは、標準入力(stdin),標準出力(stdout),標準エラー出力(stderr)など、ファイルのオープン等の準備を行わずに標準的に使用できるファイルを指します。あらかじめ、標準入出力ライブラリから呼ばれるopen,close,read,write,lseekなどのインタフェースルーチンを作成して用意しておかなければなりません。詳しくは、「RXファミリ C/C++コンパイラユーザーズマニュアル」を参照してください。
注2.ヒープとは、ライブラリ関数malloc、realloc、calloc、new で使用するメモリ領域のことです。



7-2.RX220のクロックについて

参考に、RX220のクロックの仕様概略を示します。

■内部クロックの種類

名称 説 明 最大動作周波数注3
ICLK CPU,DMAC,DTC,ROM,RAMの動作クロック(システムクロック) 32MHz(max)
PCLKD 周辺モジュール(S12AD)用の動作クロック 32MHz(max)
PCLKB 周辺モジュール(S12AD以外)用の動作クロック 32MHz(max)
FCLK FlashIFの動作クロック 4MHz~32MHz
CACCLK CACモジュール用の動作クロック 各クロックと同じ
RTCSCLK RTCモジュール専用の動作クロック 32.768kHz
IWDTCLK IWDTモジュール専用の動作クロック 125kHz

注3.最大動作周波数は中速動作モード1Aでの値です。その他の動作電力モードでは変わる場合があります。

■メインクロック発振器の仕様

発振子周波数 1MHz~20MHz
外部クロック入力周波数 20MHz (max)
接続できる発振子、または付加回路 セラミック共振子、水晶振動子
接続端子 EXTAL、 XTAL
発振停止検出機能 メインクロックの発振停止検出時、LOCOに切り替える
MTUの端子をハイインピーダンスにする

メインクロックとは、端子EXTAL,XTALに接続された1MHz~20MHzのセラミック共振子または水晶振動子によるクロック、あるいは端子EXTALに入力された20MHz以下の外部クロックです。
メインクロック発振器コントロールレジスタ(MOSCCR)のMOSTPビットによって、メインクロック発振器の動作“0”/停止“1”を設定できます。
リセット後のMOSTPビットは“1”で、メインクロックは発振停止状態です。

■サブクロック発振器の仕様

発振子周波数 32.768kHz
接続できる発振子、または付加回路 水晶振動子
接続端子 XCIN、XCOUT

サブクロックとは、端子XCIN,XCOUTに接続された32.768KHzの水晶発振子によるクロックで、リアルタイムクロック(RTC)にも使用されるものです。
サブクロック発振器コントロールレジスタ(SOSCCR)のSOSTPビットによって、サブクロック発振器の動作“0”/停止“1”を設定できます。
リセット後のSOSTPビットは“0”で、サブクロックは発振動作状態です。

■高速オンチップオシレータ(HOCO) の仕様

発振周波数 32MHz / 36.864MHz / 40MHz / 50MHz
周波数精度
(-40℃~105℃))
32MHz 31.520MHz~32.480MHz
36.864MHz 36.311MHz~37.417MHz
40MHz 39.400MHz~40.600MHz
50MHz 49.250MHz~50.750MHz

高速オンチップオシレータコントロールレジスタ(HOCOCR)のHCSTPビットによって、HOCOの動作“0”/停止“1”を設定できます。
リセット後のHCSTPビットは、ROM中0xFFFFFF88番地のオプション機能選択レジスタ1(OFS1)のHOCOEN(b8)ビットと同じになります。
ROM初期化後のHOCOENビットは“1”であるため、HOCOENビットを“0”にしない限り、リセット後のHOCOは発振停止となります。

■低速オンチップオシレータ(LOCO)の仕様

発振周波数 125kHz
周波数精度 112.5kHz~137.5kHz

低速オンチップオシレータコントロールレジスタ(LOCOCR)のLCSTPビットによって、LOCOの動作“0”/停止“1”を設定できます。
リセット後のLCSTPビットは“0”で、発振動作しています。
リセット後、システムクロックはLOCOになっています。従って、他のクロック(HOCO,メインクロック,サブクロック)で動作するよう設定するまでLOCOで動きます。

■独立ウォッチドッグタイマ(IWDT)専用オンチップオシレータ

発振周波数 125kHz

IWDT専用オンチップオシレータコントロールレジスタ(ILOCOCR)のILCSTPビットによって、IWDT用オシレータの動作“0”/停止“1”を設定できます。
リセット後のILCSTPビットは“1”で、IWDT用オシレータは発振停止しています。


7-3.エントリー関数PowerON_Reset_PCの例

ファイル“resetprg.c”にある関数PowerON_Reset_PCの例を下記に示します。この関数は、マイコンがリセットすると実行する、プログラムの入り口部分です。
下記のように、ここから関数HardwareSetupを呼び出します。
関数PowerON_Reset_PCのアドレスは、リセットベクタ0xFFFFFFFC番地に格納しておきます。固定ベクタテーブルの作成方法はRX621/RX62Nと同じなので、そちらを参照してください。

void PowerON_Reset_PC(void)
{
    /* 割り込みテーブルレジスタ(INTB)のセット */
    set_intb(__sectop("C$VECT"));

    /* CPUクロック,周辺機能の初期設定 */
    HardwareSetup();    // →関数HardwareSetupを呼び出す
    nop();

    /* 各セクションを初期化 */
    _INITSCT();        // Initialize Sections

    main();            // →ファイル“プロジェクト名.c”のメイン関数へ
}

この関数PowerON_Reset_PCは、元々は関数mainを呼ぶ前にset_psw(PSW_init) を実行して割り込みを許可するようになっていました。しかしこの例の場合、関数mainの冒頭で割り込みマスク状態で行う初期化処理が存在することを想定しているので、割り込みマスク状態のまま関数mainを呼んでいます。


7-4.初期化関数HardwareSetupの例

マイコンを初期化する関数HardwareSetupは、ファイル“hwsetup.c”にあります。ただし、初期状態では空なので、中身を作成しないと何の機能もありません。
下記に、関数HardwareSetupの作成例を示します。関数HardwareSetupから呼んでいる各関数の中身については、次項のサンプルプログラムを参照してください。

void HardwareSetup(void)
{
    /* 全てモジュールストップ状態にする */
    Stop_AllModule();

    /* クロック初期設定 */
    Init_SystemClock();

    /* 全てのI/Oポートを汎用入出力ポートに初期化 */
    Init_PortModeReg();

    /* 存在しないI/Oポートの初期化 */
    Init_NonExistPort();

    /* I/Oポートの初期化例 */
    /* I/Oポート1(PORT1.P17~P14を出力ポートにする例) */
    // PORT1.ODR0.BYTE = 0x00;    /* オープンドレイン制御レジスタ0(初期状態:P13~P10 CMOS出力) */
    PORT1.ODR1.BYTE = 0x00;        /* オープンドレイン制御レジスタ1(初期状態:P17~P14 CMOS出力) */
    PORT1.PODR.BYTE = 0x00;        /* ポート出力データレジスタ(出力データの初期状態) */
    PORT1.PDR.BYTE |= 0xF0;        /* ポート方向レジスタ(出力にするポート追加) */
    // PORT1.PCR.BYTE = 0x00;      /* プルアップ制御レジスタ(初期状態:プルアップなし) */
    PORT1.DSCR.BYTE = 0x00;        /* 駆動能力制御レジスタ(初期状態:通常出力) */

    /* ~他にも初期化するものがあれば記述~ */

}

ファイル“hwsetup.c”と関連ヘッダファイルのサンプル

  システムクロック設定用の設定値定義ファイル例(InitSystemClock.h)
  存在しないI/OポートのPDR設定値ファイル例(NonExistPort.h)
  マイコンの初期化プログラム例(hwsetup.c)

この“hwsetup.c”サンプルには、電圧検出回路(LVDAa)を使いVCC < 3.10V になったとき、NMI割り込みを発生する関数init_voltage_detectが用意されていますが、現状使用していません。


7-5.リセット後に動作している周辺機能の停止

関数Stop_AllModuleについて説明します。
周辺機能(周辺モジュール)のうちDMAC、DTC、RAM0は、マイコンをリセットしてもモジュールストップにならないため、起動直後から動作している可能性があります。
この例では、起動直後にRAM0を除く全ての周辺機能をモジュールストップ機能によって停止させます。
もし、RAM0をモジュールストップにより動作停止すると、RAMにアクセスできなくなってしまうので注意が必要です。


7-6.クロックの初期設定

関数Init_SystemClockでは、次のクロック設定を行っています。

 ・サブクロック設定
 ・リアルタイムクロック(RTC)のモード設定
 ・メインクロック設定
 ・高速オンチップオシレータ(HOCO)設定
 ・システムクロックの切り替え
 ・動作電力制御モードを選択

下表に示す、ファイル“InitSystemClock.h”に記述されているパラメータ(下表は一部です)によってクロック設定を変更することができます。
なお、前出のサンプルプログラムは秋月電子通商のRX220マイコンボード用に、20MHz水晶発振子によるメインクロックで動作するように設定しています。 異なるクロックを使用する場合は、該当するマクロの設定値を変更してファイル“hwsetup.c”をコンパイルします。

参考:マクロの設定値、B_NOT_USEは「使わない」、B_USEは「使う」です。

マクロ名 設定値 説 明 サンプルでの設定値
SEL_MAIN B_NOT_USE /
B_USE
システムクロックにメインクロックを使用するかどうかを選択 B_USE
MAIN_CLOCK_Hz 1000000L~
20000000L
メインクロックの周波数(実装されている水晶の周波数[Hz]) 20000000L
REG_MOFCR 0x10 /
0x20 /
0x30
メインクロック発振器ドライブ能力を選択
 0x10=1MHz~8MHz
 0x20=8.1MHz~15.9MHz
 0x30=16MHz~20MHz
(端子EXTAL,XTALに水晶発振子を接続するものとしています)
0x30
SEL_SUB B_NOT_USE /
B_USE
システムクロックにサブクロックを使用するかどうかを選択 B_NOT_USE
SEL_RTC B_NOT_USE /
B_USE
RTCカウントソースとしてサブクロックを使用するかどうかを選択 B_NOT_USE
SUB_CLOCK_Hz 32768L サブクロックの周波数[Hz] 32768L
SEL_HOCO B_NOT_USE /
B_USE
システムクロックに高速オンチップオシレータ(HOCO)を使用するかどうかを選択 B_NOT_USE
REG_OPCCR OPCM_MID_1A /
OPCM_MID_1B /
OPCM_LOW_1 /
OPCM_LOW_2
動作電源制御モードを選択
 OPCM_MID_1A=中速動作モード1A
 OPCM_MID_1B=中速動作モード1B
 OPCM_LOW_1=低速動作モード1
 OPCM_LOW_2=低速動作モード2
OPCM_MID_1A
SEL_SYSCLK CLK_MAIN
CLK_HOCO
CLK_SUB
システムクロックとして使用するクロックを選択
 CLK_MAIN=メインクロックを使う
 CLK_HOCO=高速オンチップオシレータを使う
 CLK_SUB=サブクロックを使う
CLK_MAIN


7-7.I/Oポートの初期化

1)全てのI/Oポートを汎用入出力ポートにする

関数Init_PortModeRegについて説明します。
リセット後全てのI/Oポートは、各ポートモードレジスタ(PMR)の全ビットが“0”なので、汎用入出力ポートとして使用できるようになっています。
しかしこのサンプルでは、明示的に全I/OポートのPMRを“0”にし汎用入出力ポートとなるよう再設定しています。


2)存在しないI/Oポートの初期化

関数Init_NonExistPortについて説明します。
RX220は、端子数が100ピン未満の製品では、存在していてもピン数の関係で端子に接続されていないポートがあり、それらを出力に設定しておく必要があります。また、存在自体していないポートは入力に設定しておく必要があります。
関数Init_NonExistPortは、ファイル“NonExistPort.h”にあるマクロPIN_SIZEに定義されたピン数(100,64,48のどれか)に従って、端子に接続されていないポートを出力に設定します。
秋月電子通商のRX220マイコンボードの場合は64ピンなので、PIN_SIZEは64にします。
なお、この関数を実行する時点で全てのポートが入力に設定されている必要があります(リセット直後は全て入力です)。


3)I/Oポートとして使用する設定

下記は、関数HardwareSetupの例にもあった、I/Oポート1のP17~P14を出力ポートにする設定例です。
オープンドレイン制御レジスタ(ODR1)を“0x00”にしていますが、リセット直後は元々“0x00”なのでCMOS出力で使用するなら省略してもかまいません。
プルアップ制御レジスタ(PCR)でポートの端子にプルアップ抵抗を入れることができますが、出力ポートでプルアップは無効なので設定しても無意味です。
駆動能力制御レジスタ(DSCR)で高駆動出力を設定するとLOWレベル出力電流がmax16mA注4となります。下の例は通常出力なのでmax4mA注4

■ I/Oポート1設定例(PORT1のP17~P14)
PORT1.ODR1.BYTE = 0x00;   /* オープンドレイン制御レジスタ1(初期状態:P17~P14 CMOS出力) */
PORT1.PODR.BYTE = 0x00;   /* ポート出力データレジスタ(出力データの初期状態) */
PORT1.PDR.BYTE  |= 0xF0;   /* ポート方向レジスタ(出力にするポート追加) */
PORT1.DSCR.BYTE = 0x00;   /* 駆動能力制御レジスタ(初期状態:通常出力) */

64ピンおよび48ピンパッケージでは、I/Oポート1のP13~P10は使用できません。
同様に、下表のようにRX220のパッケージによって使用できないI/Oポートが異なるので注意が必要です。

パッケージ別のI/Oポート一覧表(RX220グループユーザーズマニュアル ハードウェア編より)

ポート パッケージ パッケージ パッケージ
100ピン 本数 64ピン 本数 48ピン 本数
PORT0 P03、P05、P07 3 P03、P05 2 なし 0
PORT1 P12~P17 6 P14~P17 4 P14~P17 4
PORT2 P20~P27 8 P26、P27 2 P26、P27 2
PORT3 P30~P37 8 P30~P32、P35~P37 6 P30、P31、P35~P37 5
PORT4 P40~P47 8 P40~P44、P46 6 P40~P42、P46 4
PORT5 P50~P55 6 P54、P55 2 なし 0
PORTA PA0~PA7 8 PA0、PA1、PA3、PA4、PA6 5 PA1、PA3、PA4、PA6 4
PORTB PB0~PB7 8 PB0、PB1、PB3、PB5~PB7 6 PB0、PB1、PB3、PB5 4
PORTC PC0~PC7 8 PC2~PC7 6 PC4~PC7 4
PORTD PD0~PD7 8 なし 0 なし 0
PORTE PE0~PE7 8 PE0~PE5 6 PE1~PE4 4
PORTH PH0~PH3 4 PH0~PH3 4 PH0~PH3 4
PORTJ PJ1、PJ3 2 なし 0 なし 0
ポートの合計 85 ポートの合計 49 ポートの合計 35

注4.全出力端子の総和はmax80mA。ただし、総電力(チップ全体の電力)と使用温度により異なります。


4)I/Oポートの端子を周辺機能の入出力として使う

リセット後または関数Init_PortModeRegを実行後は、全てのI/Oポートが汎用入出力ポートに設定されます。
I/Oポートの端子は、周辺機能(周辺モジュール)の入出力としても割り当てられています注5。周辺機能の入出力として使う場合は、マルチファンクションピンコントローラ(MPC)を使い、次の手順で設定が必要です。

 1. ポートモードレジスタ(PMR)を“0”にして汎用入出力ポートに設定します(リセットまたは関数Init_PortModeRegで設定済み)。
 2. 書き込みプロテクトレジスタ(PWPR)注6のPFSWEビットを“1”に設定して、目的の端子の機能制御レジスタ(PmnPFS注7)への書き込みを有効にします。
 3. 機能制御レジスタ(PmnPFS)注6のPSEL[3:0] ビットにより端子入出力機能を設定します。
 4. 書き込みプロテクトレジスタ(PWPR)のPFSWEビットを“0”に設定し、機能制御レジスタ(PmnPFS)への書き込み禁止にします。
 5. ポートモードレジスタ(PMR)を“1”に設定し、選択された周辺機能の入出力に切り替えます。

注5.I/Oポートの端子と周辺機能の入出力の対応表は『RX220グループユーザーズマニュアル ハードウェア編』にあります。
注6.書き込みプロテクトレジスタ(PWPR),能制御レジスタ(PmnPFS)は、マルチファンクションピンコントローラ(MPC)のレジスタです。
注7.“m”はポート番号(0~5,A~E,H,J)、“n”はポートのビット番号(0~7)。

■PORTBのB3(PB3)端子からMTU0のMTIOC0Aを出力、PORTBのB5(PB5)端子からMTU2のMTIOC2Aを出力する設定例。

/* MTIOC2A(PB5),MTIOC0A(PB3)端子(ポートB)のモード設定 */
  PORTB.PMR.BIT.B5 = 0;   /* PB5をI/Oポートとして使う設定 */
  PORTB.PMR.BIT.B3 = 0;   /* PB3をI/Oポートとして使う設定 */
/* マルチファンクションピンコントローラ(MPC) */
  MPC.PWPR.BYTE = 0x00;   /* 書き込みプロテクトレジスタ(先にBOWI=0にすること) */
  MPC.PWPR.BYTE = 0x40;   /* PFSWE=1:PFSレジスタ書き込みを許可 */
/* PB5,PB3端子機能制御レジスタ */
  MPC.PB5PFS.BYTE = 0x01;   /* PB5端子をMTIOC2A出力として使用する */
  MPC.PB3PFS.BYTE = 0x01;   /* PB3端子をMTIOC0A出力として使用する */
/* マルチファンクションピンコントローラ(MPC) */
  MPC.PWPR.BYTE = 0x80;   /* 書き込みプロテクトレジスタ(POWI=1にして書込み保護) */
                  /* PFSWE=0:PFSレジスタへの書き込みを禁止 */
/* MTIOC2A(PB5),MTIOC0A(PB3)端子(ポートB)のモード設定 */
  PORTB.PMR.BIT.B5 = 1;   /* PB5を周辺機能として使う設定 */
  PORTB.PMR.BIT.B3 = 1;   /* PB3を周辺機能として使う設定 */

5)8ビットのI/Oポートを確保

64ピンおよび48ピンパッケージでは、8ビットそろったI/Oポートがありません。
マイコンの外部に周辺デバイスや周辺回路を接続するときに、8ビットそろっていた方が都合が良い場合があります。
そのような時に、I/Oポートの一部の端子(兼用になっている端子)を切り替えて8ビットポートにする機能があります。
ポート切り替えレジスタA(PSRA)は64ピンパッケージ用で、I/OポートBのPB7,PB6端子をI/OポートCのPC1,PC0に切り換えることができます。
ポート切り替えレジスタB(PSRB)は48ピンパッケージ用で、I/OポートBのPB5,PB3,PB1,PB0端子をI/OポートCのPC3,PC2,PC1,PC0に切り換えることができます。
この機能を使っても、8ビットのポートにできるのはI/OポートCのみです。
PSRA,PSRBによるポートの切り替えは全ビット一括ではないので、必ずしも8ビットでなくても設定可能です。


ホームページ  トップページ  前ページ
■■■ 注 意 ■■■
1.ここに掲載された内容(写真,図,表などを含む)の、全てまたは一部を無断で使用しないでください。
2.ここで紹介した手法(構造や仕組み,回路,プログラムなどを含む)を使用したことにより、問題や不利益が発生したとしても一切関知しません。
3.ここで紹介したプログラム例は、正常なコンパイルおよび正常な動作を保証するものではありません。
Copyright © 2012-2018 S.Suzuki, All rights reserved.