メインコンテンツまでスキップ
Knowledgebase
Home
Renesas Electronics Japan - Knowledgebase

RTC_リアルタイムクロック_でBlinkyを実行する方法

最終更新日:2017/07/05

Question:

RTC(リアルタイムクロック)でBlinkyを実行する方法は?

Answer:

このガイドでは、単純なRTCベースの実装を用いてBlinkyデザインを作成する(お客様のボード上でLEDを点滅させる)方法を紹介します。
このガイドでは、ツールフロー内で共通する複数のアクションについて簡単に説明します。
このガイドでは、お客様がe2 studioの各種操作についてある程度理解されていることを前提としています。

<SSPユーザズマニュアル>の開発開始のセクションで、各ステップを詳しく説明しています。随時、<SSPユーザズマニュアル>で、そのセクションを参照してください。

このガイドの内容を完了すると、単純なHALベースのRTCプログラムが作成できるようになります。このRTCプログラムでは、RTC APIのコールおよび関連する割り込みコールバック関数を初期化して使用します。

手順
初期設定
まずハードウェア内でBlinkyが動作しているかどうか確認するため、Synergy開発ツールとSSPをPCにインストールし、Synergyのターゲットボードを利用できるようにする必要があります。
そうでない場合は、以下に示すSSPユーザズマニュアルへのリンクに従って進み、SSP OverviewセクションおよびStarting Developmentセクションを確認してください。

<SSPユーザズマニュアル>

プロジェクトを作成する

上記の手順を完了させることで、Synergyプラットフォームのツールフローを実行させ、Blinkyの入門バージョンをターゲットボード上で動作させることができるようになります。
以上で、RTCと割り込みコールバック関数を使用してHALベースのバージョンに対応する準備は完了です。

1.e2 studioを開いて、Synergyプロジェクトを新規作成します(必要に応じてSSPユーザズマニュアルを再度ご参照ください)。
2.ボードをターゲットにして、BSPオプションを選択します。
3.これで新しいBlinkyコードを追加する準備は完了です。

RTC Blinkyコードを追加する
この手順では、RTCベースのBlinkyバージョンを実装するためのコードを追加します。
1.ConfigurationウィンドウのThreadsタブを開きます。
2.ThreadsウィンドウでHALコンポーネントを選択します。
3.HAL Modulesウィンドウの隣にあるNew>をクリックします。
4.RTCでRTCドライバを選択し、RTCでRTCドライバであるg_rtcをHAL Modulesウィンドウに追加します。
5.HAL ModulesウィンドウのRTCでRTCドライバであるg_rtcを選択します。
6.Propertiesタブで、CallbackをNULLからperiodic_callbackに変更します。
7.ICUタブでRTC Interruptを見つけて、RTC PRDをPriority 4に設定します。
8.Generate Project Contentボタンを押します。
9.ここで、srsディレクトリにhal_entry.cというファイルがあるはずです。
10.hal_entry.cを開いて、1行目のコメントより下のコードをすべて、以下のコードに変更します。

/* HAL-only entry function */
#include "hal_data.h"
bsp_leds_t Leds;
ioport_level_t level = IOPORT_LEVEL_HIGH;
/* Set up the RTC periodic interrupt to fire once every second */
void periodic_interrupt_setup(void) {
/* Open the real time clock driver */
g_rtc.p_api->open(g_rtc.p_ctrl, g_rtc.p_cfg);
/* Set the periodic interrupt rate */
g_rtc.p_api->periodicIrqRateSet(g_rtc.p_ctrl,
RTC_PERIODIC_IRQ_SELECT_1_SECOND);
/* Start the counter */
g_rtc.p_api->calendarCounterStart(g_rtc.p_ctrl);
/* Enable periodic interrupts */
g_rtc.p_api->irqEnable(g_rtc.p_ctrl, RTC_EVENT_PERIODIC_IRQ);
/* Close the real time clock driver */
g_rtc.p_api->close(g_rtc.p_ctrl);
}
/* periodic ISR that toggles a GPIO pin */
void periodic_callback(rtc_callback_args_t * p_args) {
if (p_args->event == RTC_EVENT_PERIODIC_IRQ)
{
level = !level;
g_ioport_on_ioport.pinWrite(Leds.p_leds[0], level);
}
}
void hal_entry(void) {
/* Get LED information for this board */
R_BSP_LedsGet(&Leds);
/* If this board has no LEDs then trap here */
if (!Leds.led_count)
{
while(1); // There are no LEDs on this board
}
periodic_interrupt_setup();
while (1);
}

11.ファイルに対して行った変更を保存し、プロジェクトのデバッグコンフィギュレーションをビルドします。

12.エラーが発生することなくビルドされます。エラーが発生した場合は、追加したコードを慎重に確認してください。何らかの文字抜けや追加が発生している可能性があります。
お客様のコードが問題なくビルドされると、ターゲットボード上でRTCのBlinkyを実行させることができます。

ボード上でRTCのBlinkyを実行する
1.以前のサンプルデザインで実行したとおり、ボードを接続します。
2.デバッガを初期化し、新しいプロジェクトのビルドコンフィギュレーションを選択します。
3.Debugボタンをクリックしてデバッグパースペクティブを立ち上げます。
4.デバッグセッションは、デザイン開始時は停止しているため、Resumeボタンを2回押してボード上での実行を開始させます。

5.ここで、LEDが点滅します。デバッグセッションを一時停止または終了するまで、点灯1秒と消灯1秒を繰り返します。

6.SynergyプラットフォームでRTCを使用した初の割り込みコールバックデザインが完了しました。

RTCのBlinkyの仕組み
以前のサンプル(Regular Blinkyなど)でお気づきのように、RTCのBlinkyはhal_entry内で動作を開始します。
hal_entryコードの最初のセクションは、デザインのバランスに必要となるHALインフラストラクチャーに、重要なインクルードファイルであるhal_data.hを追加します。
hal_data.hをさらに詳しく調べると、ペリフェラルとそれに関連するapi.hファイルに対して、さらに複数のインクルードファイルが取り込まれるのを確認することができます。
このファイルはさらに、g_rtc、g_ioport、g_elc、およびperiodic_callbackエレメントを、hal_entry.cで使用するための設定も行います。
インクルード文の後でhal_entry.cは、hal_entry.cのbodyで使用するLeds(ボード上で使用するLEDの場所を識別)およびlevel(LED駆動信号の値を識別)という2つの変数を識別します。


RTC Blinkyに関する最初の関数は、RTCの初期化コードです。まず初めに、RTCドライバを開くためにapiコールを使用します。
g_rtc構造は、hal_data.cファイルに配置されており、.p_ctrl(制御ブロック)、.p_cfg(コンフィギュレーションブロック)、および.p_api(api関数ブロック)という3つのエレメントを使用します。
g_rtc_cfgエレメントを初期化するデータは、RTCでRTCドライバg_rtcを設定したときにRTC Propertiesウィンドウに入力したデータに起因していることにご注意ください。
g_ioportおよびg_elcに対しても、同様のエレメントが作成されます。

RTCで利用可能な様々なapi関数は、SSPが生成したファイルr_rtc.c(ssp/src/driver/r_rtcフォルダ内)に作成されます。
これらの関数を、RTC Blinkyで使用するものを含めて下図に示します。
ここでr_rtc.cは自動生成されますので、如何なる場合でも、編集や変更はしないでください。


RTCモジュールの制御に使用するapi関数に、RTC Blinkyがアクセスする際の注意事項は下記になります。
たとえば以下に挙げたコードは、グローバル変数g_rtcを使用して、open関数を選択するapi構造にアクセスします。
関数のパラメータは、前述のとおり、hal_data.cで提供されるg_rtcの制御(.p_ctrl)およびg_rtcのコンフィギュレーション(.p_cfg)ブロックです。
その他のRTC apiコールは、同様のフォーマットを使用します。

Open the real time clock driver */
g_rtc.p_api->open(g_rtc.p_ctrl, g_rtc.p_cfg);

RTCは、周期割り込み率1秒で初期化され、起動後に割り込みが有効になります。これでドライバを閉じることができます。

周期コールバック関数によって、割り込みサービスルーチンである「work」が定義されます。まず、割り込み事象が期待された周期IRQであるかどうかを確認します。
こ のIRQが期待どおりなら、LED駆動信号レベルが切り換えられ、その信号はioポート端子に書き込まれます。このioポート端子は、ターゲットボードで 最初に使用可能なLEDを特定するためBSP関数R_BSP_LedsGetを使用する際に識別されるものです(periodic_callbackのす ぐ下にあるhal_entryルーチンで処理)。


切り換えるLEDを特定するため、hal_entry関数は上述のR_BSP_LedsGet関数を呼び出します(RTC BlinkyがSynergy BSPを備えたあらゆるボードで機能するようになります)。
LEDが存在する場合は、periodic_interrupt_setupが呼び出され、プログラムが連続ループに入ります。
ループ中はRTCの割り込みが毎秒発生して、LEDが切り替わります。

以上で、このサンプルデザインは終了です。
・HAL APIコールについての詳細は、SSPユーザズマニュアルをご参照ください。

・コードを改良してRTC Blinkyの点滅速度を変更してみてください。10秒ごとに点滅させるようにしてください。10秒間のうち毎回1秒間点灯させるように変更してみてください。

適用製品

Renesas Synergy™ プラットフォーム
Renesas Synergy™ ソフトウェア