本講座は、ルネサスエレクトロニクス社(以降、ルネサス)のArm® Cortex®-Mプロセッサ内蔵マイコン RAファミリを使った初心者向けのマイコン入門講座であり、超基本的なマイコンに関する知識を既に習得されている方を対象としています。
超基本的なマイコンに関する知識を学ぶ場合は、APSのWebinar「 マイコンとは何?|マイコン超入門【第1部】」から始めて、「 テキスト応用実習|マイコン超入門【第5部】」までを学習してください。
本講座のゴール
- マイコンの基本的な使い方を理解する。
- マイコンの基本的な仕組みを、周辺機能ごとに理解する。
- マイコンの基本的な動作を、周辺機能ごとに理解する。
本講座の構成
第1回:開発ツール
第2回:CPU(Cortex-M)
第3回:汎用I/O
第4回:割り込み
第5回:汎用タイマ
第5回:汎用タイマの内容
- タイマの基本機能を理解する。
- PWMなどのタイマの応用機能を理解する。
- 実習を通して、実際のタイマの使い方を習得する。
使用機材のご案内
本ハンズオンワークショップを実機にて体験いただくためには、EK-RA6M5 評価キットとPCが必要となります。
汎用タイマの基本機能
汎用タイマ(Timer)は、キッチンタイマのように、時間が経過したことを知らせる機能です。入力された一定周期のクロック(連続パルス)を数えて、一定数になったら、何かしらのイベントを発生します。このような動作をカウント機能と呼びます。キッチンタイマや時計機能は、カウント機能を使います。カウント機能を担うのは、その名の通りカウンタです。
カウンタの中は、カウントデータを保持するレジスタとその値に1を加算する加算器、または1を減算する減算器で構成されます。数値に1を加算することをインクリメントと言いますので、1を加算する加算器はインクリメンタと呼ばれます。また、1を減算することをデクリメントと言いますので、1を減算する減算器はデクリメンタと呼ばれます。
カウンタのレジスタの値は、クロックに同期して1を加算、または1を減算します。従って、カウンタ値はクロックの1周期ごとに加算、または減算されます。カウンタの値は、常時一致検出回路の値と比較されていて、一致したときにCPUへの割り込み、またはイベント信号を生成します。一方で、カウンタの初期値を設定するためのレジスタ(プリセットレジスタ)があります。
ここで、加算器を使った例を考えてみましょう。まず、ユーザーは、プリセットレジスタにカウンタの初期値を設定します。例えば100を設定するとしましょう。その値は、カウンタのレジスタに移されて、クロックに同期してカウントを始めます。
一致検出回路に200を設定しておくと、カウンタの値が200になった時に、割り込み、またはイベントが発生します。これは、200-100=100クロックを数えたことになり、1クロックの周期が1m秒だとすると100m秒を数えたことになります。
その後、再びプリセットレジスタの100がカウンタのレジスタに設定され、カウンタは再び100からカウントを始めます。この動作を繰り返すと、100m秒の定期的な割り込み、またはイベントを得ることができます。

図2:汎用タイマの基本構成
実際のマイコンに搭載されている汎用タイマについて、もう少し詳しく解説します。実際のマイコンでは、プリセットレジスタと一致検出回路を合成した回路で実現することが多いです。それが、下図の中で示した再ロードレジスタです。
加算器を使う場合は、カウンタの値が、0からスタートして、1ずつ増えていき、一定値(再ロードレジスタの値)までカウントすると、カウントを止めて、CPUに時間が経過したことを知らせる割り込み信号、またはイベント信号を送ります。このような場合を、アップカウントと言います。その場合のカウンタをアップカウンタと呼びます。逆に、一定値(再ロードレジスタ)から1ずつ減らして行き、カウンタの値が0になったら、カウントを止めてCPUに割り込み信号を送る場合を、ダウンカウントと言います。その場合のカウンタをダウンカウンタと呼びます。
ユーザーは、一定値(再ロードレジスタの値)をソフトウェアで設定して、カウントする時間を決めます。この方法だと、プリセットレジスタと一致検出回路の2つの回路を再ロードレジスタという1つの回路で実現できます。
ルネサスのRA6M5の場合、汎用PWM 汎用タイマ周期設定レジスタ(GTPR)が再ロードレジスタに相当します。
実際の汎用タイマは、経過時間を測る以外にも指定した周期のパルスを出力したり、入力パルスの周期を測ったりすることにも使用します。むしろ、最近ではそのような用途の方が多いようです。そのため最近のマイコンには特別な機能を備えた汎用タイマが多くあり、使用方法もマイコンによって異なります。そこで、今回はRA6M5に搭載されている汎用タイマを例にとって、汎用タイマの基本的機能を説明します。

図3:汎用タイマの基本機能(カウント)
汎用タイマの応用機能
イベントカウント機能
イベントカウント機能は、外部から入力された信号の変化をイベントとしてとらえ、イベントが発生したら、カウンタをアップカウントしたり、ダウンカウントしたりするものです。
下図では、外部信号の立ち上がりと立ち下りをイベントとして、カウンタをアップまたはダウンします。最も簡単な用途は、周波数計測です。一定周期のイベントを数えることによって、イベント信号の周波数が測れます。
下図は理想的な動作を示していますが、実際はイベントを取り込むために数クロック必要で、イベント信号の変化からカウントまでに、時間差が生じます。

図4:イベントカウント機能
アウトプットコンペア
ユーザーが比較レジスタに設定した値とカウンタの値が一致したときに、何かしらのイベントを出力する機能をアウトプットコンペア(Output compare)機能と呼びます。
アウトプットコンペア機能は、比較レジスタの値とカウンタの値が一致したときに外部へ何かしらのイベント信号を出力します。ここでいうイベントとは、信号の変化です。例えば、信号を反転(トグル)する、ハイレベルにする、ロウレベルにする、などです。
下図中の外部出力信号の一番上が反転(トグル)の場合です。1つ前の信号がロウレベルならハイレベルに、ハイレベルならロウレベルへ変化させます。二番目はハイレベルにする場合で、三番目がロウレベルにする場合です。1つ前の信号が何であっても、ハイレベルまたはロウレベルにします。もちろん1つ前の信号がハイレベルまたはロウレベルならば同じ状態を保持します。
アウトプットコンペア機能の場合、再ロードレジスタの値はカウンタのリセット周期を決めるために使われます。カウンタのリセット周期はイベントの発生周期に影響を及ぼします。
ここでは、アップカウンタの場合を例としてあげましたが、もちろんダウンカウンタでも同じ動作をします。再ロードレジスタの値からダウンカウントしてきて、カウンタの値が比較レジスタの値と同じになったらイベントを発生させます。

図5:アウトプットコンペア
PWM(Pulse Width Modulation)
外部出力信号のハイ幅とロウ幅の比を変更する機能をPWMと呼びます。PWMの場合のイベントは反転しかありません。ここでは、比較レジスタの値とカウンタの値が一致したときに出力信号を反転します。そして、カウンタの値が再ロードレジスタの値に来たら、カウンタはリセットされて同時に出力信号もリセットされます。この場合はロウレベルに戻っています。
下図では、比較レジスタの値が4のときに反転していますが、これを2にするともう少し早いタイミングで反転が発生し、出力パルスのハイ幅とロウ幅の比を変更することができます。しかし、再ロードレジスタの値が変わらなければ、周期は変化しません。これを繰り返すことによって一定周期のパルスが出力されるとともに、ハイ幅とロウ幅の比をユーザーが自由に変更することができます。
また、一般的なPWM機能では、外部出力信号のスタート値もハイレベルかロウレベルの選択が可能です。PWM機能は、モータの速度制御(パルスのハイ幅とロウ幅の比、または周期で速度調整)やLED照明などのスイッチング電源の制御などに使われています。

図6:PWM
インプットキャプチャ(Input capture)
外部から入力された信号の立ち上がり、立ち下がりまたは両方のいずれかを検知すると、カウンタの値をキャプチャレジスタへ取り込む機能をインプットキャプチャと呼びます。
下図は外部入力信号のロウレベルからハイレベルへの立ち上がりを検知する場合です。最初の立ち上がりの時、カウンタの値は4ですので、キャプチャレジスタには4が取り込まれ(キャプチャされ)ます。CPUは、すかさずこの値をRAMなどのメモリに格納しておきます。次の立ち上がりの時、カウンタの値は11です。この値もキャプチャレジスタに取り込まれ、CPUによってメモリに格納されます。次にCPUで「11-4=7」の計算を行うことによって、入力された信号の1周期がクロックの7周期分に相当することが分ります。クロックの周期は分っていますので、CPUで掛け算を行えば、入力されたクロックの周期を知ることができます。
ハイレベルからロウレベルへの立ち下がりを検知する場合も同様に動作して、入力されたクロックの周期を知ることができます。立ち上がり、立ち下がりの両方でキャプチャすることもできます。その場合は、ハイレベルの長さ、ロウレベルの長さを知ることができます。

図7:インプットキャプチャ
その他の機能、その他のタイマ
マイコンによって搭載されている汎用タイマの機能は様々です。本講座は入門編なので、すべての機能の説明は致しませんが、例えば、決められた信号を入力することによって、アップカウントとダウンカウントを切り替えるエンコーダ機能や、出力パルスを連続させないで、1パルスだけ出力する機能などがあります。
ここまでは、一般的に汎用タイマと言われるタイマの機能を説明しました。タイマにはこの他に特殊用途に特化したタイマがあります。本講座は入門編なので、特殊なタイマの説明は致しませんが、例えば、
- 時計やカレンダー機能を持つRTC(Real-Time Clock )
- マイコンの暴走を監視するウォッチドッグタイマ
なども、一般的なマイコンに搭載されています。
実習内容
実習では、押しボタンを押すと外部割込みが発生してLEDが点灯または消灯するプログラムを作ります。「 応用実習|Arm Cortex-M搭載 ルネサスRAファミリを使ったマイコン超入門【第5部】」で、タイマを使って0.5秒ごとにLEDを点滅させるプログラムを作りました。今回も同じプログラムを作りますが、汎用タイマの設定に関して、もう少し詳しく解説します。
まずは、プログラムの作り方から、e2 studioを起動し、GUIを使って汎用タイマを設定するところを復習がてら行います。その後汎用タイマを設定に関して、少し詳しく説明します。
まず、LEDを点滅させる手順から説明します。最初にCPUは、プログラムに従ってI/Oポート(P006)のレジスタに「1」を書きます。すると、PMOSからLEDに電源が供給されLEDは点灯します。次に、CPUはレジスタに「0」を書きます。今度は、PMOSからLEDに電源が供給されなくなるのでLEDは消灯します。これを繰り返すとLEDは点滅します。
この実習のポイントは汎用タイマの使い方です。汎用タイマで点滅間隔(0.5秒)を作ります。汎用タイマで0.5秒を測定して、割り込みを発生させるように設定します。汎用タイマのカウントがスタートすると、その都度CPUが、レジスタの値を反転させてLEDを点滅させます。

図8:実習内容
プログラムを作る
プログラムは、何もしない無限ループを実行し、汎用タイマの割り込み要求を待ちます。
割り込み要求信号は0.5秒間隔で発生します。CPUは、割り込み要求信号を検知すると、LEDの接続されているP006の出力信号のレベルを反転させます。その後、再び無限ループを実行し、 次の汎用タイマからの割り込み要求を待ちます。

図9:プログラムフロー
今回は、汎用タイマの割り込みを使います。割り込みの詳細については、マイコン入門講座の割り込み編を参照してください。
ここでは、割り込みの復習を兼ねて、汎用タイマ割り込みについて解説します。今回は一定時間毎にCPUに割り込みをかけて、その周期でCPUがプログラムを実行できるようにします。今回の場合は0.5秒を作り出して0.5秒ごとにCPUに割り込みをかけます。
割り込みとは、何かしらのイベントをきっかけに、CPUが現在実行しているプログラムを一時的に中断して、そのイベントに関連する処理を行うことです。今回は、汎用タイマから0.5秒毎に割り込みを発生させて、CPUはその都度メイン処理を中断して、I/Oポートを反転させます。これでLEDを0.5秒の一定周期で点滅させることができます。

図10:汎用タイマと割り込み
I/Oポートの初期設定については、統合開発ツール(e2 studio)がすべて行ってくれます。そのためユーザーは出力値を反転するHAL関数だけを使います。
最初にI/Oポートのレベルを決めるLevelという変数を定義して、ハイレベルに初期化します。
変数の定義には 「static bsp_io_level_t 」という関数を使います。この後ろに変数の名前levelを書けば定義されます。
static bsp_io_level_t level
次に、levelの初期値をハイレベルに設定します。ハイレベルを表すHAL関数は「BSP_IO_LEVEL_HIGH」です。ロウの場合は「 BSP_IO_LEVEL_LOW」です。
先ほどのlevelを定義した記述と等号(=)を使って一度に初期値も定義できます。
最終的に、次の記述で、levelという変数を定義して、初期化できます。
static bsp_io_level_t level = BSP_IO_LEVEL_HIGH;
変数levelの定義は、これだけで良いのですが、このままだと変数levelに対して、関数で使用されていない引数に関する警告文(Warning)をツールが出します。Warningが出ても動作には問題がない場合がほとんどですが、たまにWarningに誤動作の原因が隠される場合があります。そのため、なるべくWarningは出ないようにします。Warningを抑止するために、
FSP_PARAMETER_NOT_USED(p_args);
の記述を入れます。これはおまじないだと思って入れてください。
次にI/Oポートに「level」の値を出力する記述を作ります。今回使う評価キットは、ルネサスのEK-RA6M5評価キットです。便利なことに、e2 studioのGUIでEK-RA6M5評価キットを選択するとデフォルトでR_IOPORT_OpenとR_IOPORT_Closeの関数を組み込んでくれますので、ユーザーが記述する必要はありません。
I/Oポートに「level」の値を出力する関数はマイコン入門の汎用I/O編で説明したR_IOPORT_PinWriteです。この関数は、e2 studioの持つ「Developer Assistance」という機能で簡単に入力できます。(やり方は、後ほど説明します)
R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_06, level);
この記述だけでI/OポートのP006に「level」の値を出力します。ハイレベルを出力したい時はこの記述の前に
level = BSP_IO_LEVEL_HIGH;
また、ロウレベルを出力したい時は、
level = BSP_IO_LEVEL_LOW;
と、書きます。まとめると、次の記述になります。
ハイレベルを出力
level = BSP_IO_LEVEL_HIGH;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_06, level);
ロウレベルを出力
level = BSP_IO_LEVEL_LOW;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_06, level);
I/Oポートを反転させるには、現在のI/Oポートの状態を知る必要があります。そこで、C言語の手法の一つであるif-else文を使います。
if (条件式)
{
条件式が成立する時の処理;
}
else
{
条件式が成立しないときの処理
}
if文の条件式に、「level」がハイレベルである場合を設定し、条件が成立していればすぐ下の処理を行います。ここには「level」をロウにして、I/Oポートから出力するようにします。これでI/Oポートはハイレベルからロウレベルに変化します。
また、「level」がハイレベルでない場合は、else文で記述した処理を実行します。その場合は、「level」がロウレベルなのでハイにして、I/Oポートから出力するようにします。これでI/Oポートはロウレベルからハイレベルに変化します。
まとめると 次のような記述になります。
if(level== BSP_IO_LEVEL_HIGH
{
level = BSP_IO_LEVEL_LOW;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_06, level);
}
else
{
level = BSP_IO_LEVEL_ハイ;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_06, level);
}
次に汎用タイマのプログラムを作ります。今回使う汎用タイマは、RA6M5の汎用タイマです
汎用タイマの細かな設定はe2 studioのGUIで設定すれば、初期設定に必要なHAL関数はすべて自動で組み込んでプロラムコードを作ってくれます。ユーザーが記述しなければならないコードは、汎用タイマ用のAPIのOpenと、汎用タイマのスタートと、割り込みの際の処理の記述です。APIのCloseは無くても動作には影響ありません。
汎用タイマ用のAPIのOpenとスタートは 次のような記述になります。
汎用タイマ用のAPIのOpen (void) R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg); 汎用タイマのスタート (void) R_GPT_Start(&g_timer0_ctrl);
これらは、プログラムの最初のステップになるので、hal_entry()の中に入れます。e2 studioの持つ「Developer Assistance」からDrag&Dropすれば、簡単に作れます。
割り込みの処理は「callback」という手法を使います。「callback」関数は、メイン処理とは非同期なイベントの要求があった場合に実行される関数です。今回の様に、汎用タイマが0.5秒の非同期な割り込みをCPUに要求する場合などに使います。
hal_entry()の中ではなく そのすぐ下に汎用タイマのcallback関数「callback_GPT()」という関数を設けて、その中に0.5秒の割り込みで処理する内容を書いておきます。
すると、汎用タイマが0.5秒間隔で「callback_GPT()」を呼び出しますので、その時にI/Oポートを反転するプログラムを実行すれば、LEDは0.5秒間隔で点滅するようになります。callback関数は、e2 studioの持つDeveloper AssistanceからDrag&Dropすれば、簡単に作れます。
void callback_GPT(timer_callback_args_t *p_args)
{
0.5秒間隔で行う処理(I/Oポートを反転する)
}
callback関数は、I/Oポートを反転するプログラムと組み合わせて、次のような記述になります。
void callback_GPT(timer_callback_args_t *p_args)
{
static bsp_io_level_t level = BSP_IO_LEVEL_HIGH;
FSP_PARAMETER_NOT_USED(p_args);
if(level== BSP_IO_LEVEL_HIGH)
{
level = BSP_IO_LEVEL_LOW;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_06, level);
}
else
{
level = BSP_IO_LEVEL_HIGH;
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_06, level);
}
汎用タイマの初期設定が終わったら、hal_entry()の最後に 汎用タイマの割り込み待ちの記述を入れます。while文を使って無限ループを作ります。これでプログラムは完成です。

図11:プログラム全体
統合開発ツール(e2 studio)の起動
では、実際にプロジェクトを作っていきましょう。ここからは、「 ルネサスRAファミリ マイコン入門講座:第2回 CPU編」と同じ手順で、プロジェクトの作成からコード生成まで行います。
e2 studioを開いて、ワークスペースのフォルダを指定します。ここではTIMとします。そして、「Welcome to e2 studio」の画面を隠して、「e2 studioのスタート画面」を表示します。
汎用タイマの仕様をGUIで入力
統合開発ツール(e2 studio)の自動プログラム生成機能を使うため 汎用タイマの仕様をGUIで入力します。
Stacksタグをクリックします。

図12:汎用タイマの設定開始
I/Oのスタックは、ボードを選択した時点で、自動で生成され、設定されています。そのためI/Oのスタックに関しては何もする必要はありません。
今回は汎用タイマを使うのでTimerのスタックを追加します。[New Stack]をクリックし、[Timres] から[Timers, General PWM(r_gpt)]を選択します。

図13:汎用タイマのスタックを追加
汎用タイマのスタックが追加されるので、選択します。左下にプロパティのタグがあるので、そこで汎用タイマの設定をするのですが、画面が狭いので境界線をつまんで上に上げてプロパティの画面を広げます。

図14:汎用タイマのスタックを選択
プロパティの[General]で汎用タイマの仕様を設定します。
Nameはg_timer0 Channelは0 ModeはPeriodic Periodは500 PeriodUnitはMilliseconds
とします。
次に、Interruptsで割り込み設定をします。Callbackの名前をcallback_GPTとし、Priorityは5にします Priorityは割り込みの優先順位です。今回の割り込みは ひとつしか使わないので何に設定しても構いません。

図15:汎用タイマ仕様を設定
GUIで設定する各項目と、汎用タイマのブロック図と動作波形イメージを紐付けしてみます。
今回使用する汎用タイマはg_timer0でカウンタのチャネルは0です。カウントに使うクロックはPCLKDです。カウントのモードはPeriodic(繰り返し発生)です。
周期(Period)は500で、単位(Period Unit)はMillisecondsなので0.5秒になります。今回はミリ秒で設定しましたが、カウント数などでも設定できます。
周期(Period)のデフォルトは十六進数の0x10000ですが、数字だけ直接書くと十進数になります。単位(Period Unit)のデフォルトはRaw Counts(カウント値を直接記入)ですが、Nanoseconds(ns)、Microseconds(μs)、Milliseconds(ms)、Seconds(s)、Hertz(Hz)、Kilohertz(kHz)などが選択できます。これは、ハードウェアでは再ロードレジスタの設定に関係します。
スタートトリガをかけるためには、「 (void) R_GPT_Start(&g_timer0_ctrl);」を実行します。
割り込みのイベントが発生すると実行されるプログラムは、Callbackで名前はcallback_GPTです。次のプログラムが実行されます。
/* Callback function */
void callback_GPT(timer_callback_args_t *p_args)
{
/* TODO: add your own code here */
………………
}

図16:GUIの内容とブロック図の関係
ウィンドウの右上隅にあるGenerate Project Contentをクリックすれば、コンフィギュレータは必要な設定ファイルをすべて作成しプロジェクトに追加します。

図17:コードの生成
Generate Project Contentのウィンドウが開いたら、「続行」をクリックします。

図18:Generate Project Contentウィンドウ
Stackの設定が終わったのでプロパティの画面を小さくします。左のプロジェクト・エクスプローラーの中のscrをクリックして開けます。その中のhal_entry.cをダブルクリックして開けます。

図19.生成されたプログラムコードの確認
hal_entry.cをダブルクリックすると、ソースコードが表示されます。
通常のC言語の場合、ユーザープログラムはmain.cと言うファイルに書きますが、e2 studioの場合はhal_entry.cの中に記述します。
void hal_entry(void)の記述の下に /* TODO: add your own code here */という記述がありますのでこの下にユーザーコードを追記します。

図20:生成されたプログラムコードの確認
コーディング
実際のプログラムをコーディングしていきます
左のプロジェクト・エクスプローラーの中の[Developer Assistance]を開けて、さらに[HAL/Common]を開けます。さらに、その中のg_timer0 Timer,General PWM(r_gpt)を開けるとfsp_err_t R_GPT_Open( timer_ctrl_….)という記述があります。さらに開けるとCall R_GPT_Open()という関数があります。Call R_GPT_Open()を、右のhal_entry(void)の中の/* TODO: add your own code here */の下にDrag&Dropします。
すると、status = R_GPT_Openという記述が入りますので、最初のstatus =を(void) に書き換えます。

図21:汎用タイマのAPIをOpenする
同じように、g_timer0 Timer,General PWM(r_gpt)の中のfsp_err_t R_GPT_Start(….)という記述がありますので、さらに開けるとCall R_GPT_Start()という関数があります。
Call R_GPT_Start()を、先ほどの(void) R_GPT_Openの下にDrag&Dropします。
すると、status = R_GPT_Start(&g_timer0_ctrl);という記述が入りますので、最初のstatus =を(void) に書き換えます。

図22:汎用タイマをスタート
(void) R_GPT_Startの下に無限ループの、
while(1){}
を書き込みます。
これでメインルーティーンは完了です。汎用タイマのAPI関数をオープンして、汎用タイマをスタートさせ、その後割り込みイベント待ちの無限ループに入ります。

図23:メインの無限ループ
g_timer0 Timer,General PWM(r_gpt)を開けたままプロジェクト・エクスプローラーを一番下までスクロールします。一番下にCallback function definitionが有るのでhal_entry関数の下(hal_entry関数の閉じ括弧”}”の下)にDrag &Dropします。すると、void callback_GPTの記述が挿入されます。
/* TODO: add your own code here */の下に、割り込みのプログラムコードを書き込みます。

図24:callback関数の追加
最初にI/Oポートのレベルを決めるLevelという変数を定義してハイレベルに初期化します。
static bsp_io_level_t level = BSP_IO_LEVEL_HIGH;
このままでは変数levelに対して、関数で使用されていない引数に関するWarningがでますので、Warninngを抑止するために、
FSP_PARAMETER_NOT_USED(p_args);
の記述を入れます。

図25:変数levelを定義
次にif文を作っていきます。If文の基本構成は以下です。
if()
{
}
最初はlevelがハイの時です。点滅させるのでハイの場合はlevelをロウに変更して出力します。if文の条件式は変数level== HIGHとします。
if(level== BSP_IO_LEVEL_HIGH)
中括弧 の中の最初に変数level をロウにする記述を入れます。
level = BSP_IO_LEVEL_LOW;
ポートにlevelを出力する場合はR_IOPORT_PinWrite()という関数を使います。Developer Assistance のg_ioport I/O Port(r_ioport)を開けて、プロジェクト・エクスプローラーをスクロールして、Call R_IOPORT_PinWriteをDrop&Dragします。
すると、status = R_IOPORT_PinWriteという記述になりますのでstatus = を削除して、pinをP006に相当する記述に書き換えます。
R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_06, level);

図26:if文の中身を作る
次にelse文を作ります。else文は現在のlevelがロウなので、それをハイにします。先ほど作ったif文をコピペして、変更すれば簡単です。elseの中括弧の中にlevelをハイにする記述を書いてその下にR_IOPORT_PinWriteを書きます。
else
{
level = BSP_IO_LEVEL_HIGH;
R_IOPORT_PinWrite(&g_ioport_ctrl,BSP_IO_PORT_00_PIN_06, level);
}

図27:else文の中身を作る
上部のツールバーにある小さな「ハンマー」記号をクリックするとプロジェクトがビルドされます。ビルドとは、C言語をマシン語に変換することです。完了すると、ビルド結果がステータスとして表示されます。errorもwaringも0ならばOKです。
これでプロジェクトを実行する準備が整いました。

図28:プロジェクトのビルド
プログラムの実行
実際にプログラムを実行させて、LEDの点滅を確認します。
PCとEK-RA6M5評価ボードをUSBケーブルで接続すると、USBから給電されて、ボードが起動します。

図29:EK-RA6M5評価キットとPCの接続
マイコンを動作させるには、デバッガという機能を使います。評価キットとPCを接続したら、いよいよデバッガを起動して、先ほどビルドでマシン語に変換したプログラムをマイコンに書き込んで動作させます。
デバッグ記号の横にある小さな矢印をクリックし、ドロップダウンリストボックスから[デバッグの構成]を選択します。

図30:デバッグの構成
「構成の作成、管理、および実行」の画面で、左側のツリービューのRenesas GDB Hardware Debuggingの下のTIM Debug_Flatを強調表示します。そして、今回のプロジェクトの名前(TIM)を確認します。下部の[デバッグ]をクリックするとデバッガが起動します。

図31:構成の作成、管理、および実行
[パースペクティブ切り替えの確認]ダイアログが表示されたら、[切り替え]を選択します。
しばらくするとデバッグ画面が開きます。デバッグ画面が開くと、デバッガはプログラムカウンタをプログラムのエントリポイントであるリセットハンドラに設定します。

図32:デバッガの起動
再開ボタンをクリックすると、プログラムはmain()関数のhal_entry()の呼び出し行まで実行されます。再開ボタンをもう一度クリックするとプログラムは実行を継続し、LEDの点滅が始まります。

図33:プログラムの実行
LEDの点滅が確認できましたでしょうか?

図34:LEDの点滅
「第5回:汎用タイマ」は、以上です。タイマの基本機能と、PWMなどのタイマの応用機能、実際のタイマの使い方が詳しくお分かりいただけたと思います。







