Copyright (C)SUWA TSUSHIN NETWORK.
All Rights Reserved. TOPへ戻る
スポンサードリンク

No.0036 2021.4.30




ルネサス RA4W1マイコン 初心者(6) 割り込み入力を使ってみる





今回のソースファイル: hal_entry.c のみ (3.99 KB)


□ 1.割り込み入力とは?

割り込み処理とは、通常の処理を止めて特定の処理を割り込ませて行うものです。
電話が掛かってきたときに、手を止めて電話に出るのも割り込み処理の1つです。
ARMマイコンでは、割り込みのことを「例外」と呼ぶことも多いようです。

特定の入力信号によって発生する割り込みを、割り込み入力と言います。




□ 2.割り込み入力を使ってみる

EK-RA4W1 ピン配列 ポート機能一覧.xlsx


前回のデジタル入出力で使用したボタン入力用の P402には、割り込み入力「IRQ4」の機能があります。
今回はそれを使います。
前回作成したデジタル入出力のプロジェクトに、割り込み処理を追加します。

・ボタン(P402)が押されたとき、LED0(P106)が点灯
・ボタン(P402)が押されている間は、LED1(P404)の点滅が止まる

という処理にします。

ソースコードのうち、hal_entry.c は以下のようになります。







□ 3.FSPを使用してIRQを設定する
RAマイコン用のGCCコンパイラは、RXマイコン用 CC-RXコンパイラのように簡単に割り込みを使うことができないようです。 ハンドコードのみで記述しようとしても例がなく、他メーカーのARMマイコンの例を見るとアセンブラを使用する必要があったり、記述量が膨大な量になりそうです。 そこでFSP(Flexible Software Package)の機能を使用します。前回までにクロック設定で使用した、自動コード生成ツールです。


最初にIRQ4のピン設定をします。 configuration.xml をダブルクリックして FSPを開き、[Pins] タブ を開きます。
Pin Selection にて [Peripherals] - [Input:ICU] を選択します。ICUとは割り込みコントローラーのことです。
Pin Configuration の項目を以下のように変更します。

 Operation Mode : Enabled
 IRQ4 : P402





次に、[Stacks] タブ を開きます。 Stackは、各機能ごとの関数ライブラリのようなものです。
右上にある HAL/Common Stacks の [New Stack] を開きます。




[New Stack] − [Driver] − [Input] − [External IRQ Driver on r_icu] を選択します。
これで割り込み入力についての関数の雛形ができます。




作成した関数の雛形について設定をします。プロパティを開きます。
メニューバーの [ウィンドウ(W)] − [ビューの表示(V)] − [プロパティー] を開きます。




作成した関数の雛形をクリックして選択すると、プロパティの表示が選択したものに変わります。 初期状態だとプロパティの表示が小さいので、大きくします。




プロパティの各値を以下のように変更します。

 Name: 「g_external_irq4」
 Channel: 「4」
 Trigger: 「Both Edges」
 Callback: 「irq4_int」

Channelは、IRQ番号を指定します。
Triggerは、信号の立ち上がりで判定するのか、立ち下がりで判定するのかの設定です。Both Edges を選択することで、両エッジで割り込みが発生します。
Callbackは、割込み時に呼び出される関数名を指定します。自由に付けて問題ありません。今回は、irq4_int と名付けました。




以上で、FSPによる設定は完了です。
最後に [Generate Project Content] をクリックして、ソースコードを生成・反映させます。




プロジェクトの [Developer Assistance] - [HAL/Common] の中に、設定した割り込み機能の関数が生成されました。
これをソースコードの中に埋め込みます。
これらの関数は、RENESAS RA Flexible Software Package Documentation で内容を調べることができます。




最初に、R_ICU_ExternalIrqOpen()関数を、hal_entry()関数の上のほうに埋め込みます。
これは設定した割り込み機能の初期設定関数です。主にピン設定の関数のようです。
手書きでもいいのですが、ドラッグ&ドロップすれば好きな位置に埋め込めます。

【参考文献】 RENESAS RA FSP / R_ICU_ExternalIrqOpen()




ドラッグ&ドロップで埋め込むと、戻り値を受け取るstatus変数が宣言されていないとエラーが出ます。
R_ICU_ExternalIrqOpen()関数の戻り値は、fsp_err_t という型のようです。




hal_entry()関数で、fsp_err_t型のstatus変数を宣言します。




次に R_ICU_ExternalIrqEnable()関数を、先ほどのR_ICU_ExternalIrqOpen()関数の下に埋め込みます。
これは割り込み機能を有効にする関数です。

【参考文献】 RENESAS RA FSP / R_ICU_ExternalIrqOpen()




次に、割り込みが発生したときに呼び出される関数を置きます。
Callback function definition をドラッグ&ドロップで埋め込みます。
関数の本体ですので、hal_entry()関数の外の、hal_entry.c の任意の位置に置きます。




割り込みが発生したときに呼び出される関数に、処理したい内容を書きます。
今回はボタンのON/OFF時に割り込みが発生し、ON時にLEDを点灯させる処理にしたいので、
「TODO: add your own code here」の下に、そのように記述します。




以上で、完了です。
ビルドしてデバッグを行うと、割り込みによってLEDが点灯、消灯します。

今回は、ハードウェアマニュアルのレジスタ表が一切出てきませんでした。
今回の割り込み処理をハードウェアマニュアルを見ながら手書きで行おうとすると、
レジスタ仕様を調べるのに膨大な時間が掛かります。
FSPを使用することによって、ハードウェアマニュアルを見なくてもマイコンの制御が簡単にできるようになります。

しかし、よく分からない処理のコードが膨大に含まれ、よく分からないけど動いているという状況になります。
よく分からない処理のコードの中には、今回の処理に必要ない無駄なコードも沢山含まれているはずです。
RAマイコンで使用するGCCコンパイラ、FSP、e2studioなどは無料であり、何があっても自己責任です。
このような形態でよく分からない処理のコードが膨大に含まれる状態では、信頼性のリスクがあります。

手書きと自動コード生成にはそれぞれ一長一短があるため、
特に保証がないことが多いARMマイコン系では使い分ける必要があるでしょう。


スポンサードリンク

TOPへ戻る


ご利用条件
 Copyright (C)SUWA TSUSHIN NETWORK. All Rights Reserved.