R7FA4マイコン（Arduino UNO R4）とe2studioでLチカする

# やること
個人的にベンダー提供のIDEやデバッグ環境に慣れたいというのと、手元の ~~罪基板~~ 積み基板にあったArduino UNO R4（Minima）と、J-linkとe2studioを使用してLチカします。
# 環境
2025年3月16日時点での状態です。使用したソフトのバージョンを貼っておきます。
## IDE
Renesas e2studio バージョンは2025-01で、
FSPのバージョンは5.8.0です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/120e5faf-d681-4f1e-9cdf-4c7a742795da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/8eadbe76-06e1-4817-b9c1-dc60501f54fd.png)

## デバッガ
j-link は1年ほど前にアマゾンで購入したものです。5000円ちょっとだったと記憶しています。
https://www.amazon.co.jp/j-link/s?k=j-link
当時はあまり正規品とか部品の入手ルートとかあまりシビアに考えていなかったですが、今買うならキチンとE2liteが無難だと思います。というかほしい。
https://www.renesas.com/ja/document/mat/e2-emulator-e2-emulator-lite-additional-document-users-manual-notes-connection-re-devices?srsltid=AfmBOorS0mPqRAEQlM1MEvhCourfDSTtC-CMNT6YSh_TZdbEPtyY5HJc
arduino uno r4 は、SWDのピンが出ておりますので、jtag20pin(2.54) - swd10pin(1.27)(cortex 10pinコネクタというそうです。)への変換があればJ-linkがそのままつけられます（これもアマゾンで5・600円くらいだったはず）。
Arduino側はボックスコネクタではなく単なるピンヘッダになっているので、接続方向には注意が必要です。
私の変換についていたケーブルでは、でっぱりが外側を向くようになりました。（ICSPコネクタ側、ユーザLEDやType-Cコネクタの反対側です。A5とかRXとかあるほう。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/3d0e7973-a6b6-4759-a3d8-8c53436718d1.png)

https://docs.arduino.cc/resources/schematics/ABX00080-schematics.pdf

j-linkから電源供給されるようで、UNO r4のtype-cはつなげなくても動きます。
（↓Webカメラがしょぼいのでわかりづらくて恐縮ですが、SWDコネクタ横のパワーLED（緑色）が点灯しています。）
![WIN_20250316_09_18_07_Pro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/7783367e-0e67-4260-b4ca-adab30360fd1.jpeg)

# プロジェクト作成
ツールバー、
"ファイル(F)"->"Renesas C\/C++ Project"->"Renesas RA"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/8114eb35-857d-419f-b6b8-fa8eadaa54a0.png)

”Renesas RA C/C++ Project”を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/bc69d667-527e-46f4-a6d3-8e19be95d450.png)

プロジェクト名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/74f6ac29-5938-4f82-a870-78dc101739a5.png)

デバイスを選択します。Arduino UNO R4には、”R7FA4M1AB3CFM”という64ピンのマイコンが搭載されています。
Device Selectionポップアップでのデバイス選択ツリーをたどっていくと見つけられますが、パッケージごとに後ろのほうのアルファベットがかなりの数種類があるので、コピペ・検索推奨です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/eba799dc-3bfa-43b2-b0c0-a5f0b555c9db.png)
（Arduino UNO R4 MINIMA回路図、U1が対象のマイコンです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/d18ead98-d880-4a5c-b1be-fc821b774ba9.png)
ライブラリのビルド方法やRTOSの選択を行う画面です。デフォルトのままOKとしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/1ce58e25-e4c3-4c55-888a-8d352deca7c4.png)

プロジェクトのテンプレート選択画面です。”Bare Metal - Minimal”が初めから選択されていました。デフォルトのまま終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/acd311cc-4d00-4324-82f5-6b6615e212be.png)

プロジェクトを作成すると下記のようなポップアップが出ます。”パースペクティブ”はIDE上のペインの状態のことで、コーディング用の”C/C++”と、ペリフェラルなどの設定を行う”FSP Configuration”と、デバッグ用の”デバッグ”があるようです。画面右上のボタンで切り替えられるようになっています。
”パースペクティブを開く”を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/b06a99be-595e-4ef2-8b6f-40b6bc04b9e4.png)

プロジェクトの作成が完了すると下記のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/0a954acb-a1b5-4ace-8efe-3874b1fc1101.png)

# プロジェクトコンフィグレーション
クロックやピン配置など、ペリフェラルの設定を行います。
設定内容は、プロジェクトフォルダ直下の、
configuration.xml
に書かれるようです。
設定にはFSPと呼ばれるe2studio上で動作するソフトを使用します。
<!---
（PIC/MPLAB X IDEでいうところのMCCのような位置づけのものでしょうか。）
--->
後でペリフェラルの設定を変更したい場合にも、このconfiguration.xmlをプロジェクトエクスプローラー上でダブルクリックすることで設定画面を開くことができます。

## クロック設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/e1e60cdb-a732-4122-b971-5ee2ec40a539.png)
クロック設定を変更します。
システムクロックには”HOCO”を選択しておきます。
"HOCO"はHigh-Speed On-Chip Oscillatorのことだそうです。これを48Megに変更します。
また、R4 minima には外部クロックは特に乗っていませんので、関係のありそうな設定は無効化する/HOCOにソースを切り替えておきます。（PLL Src: Disabled, CLKOUT Disabled, UCLK Src: HOCO）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/6310876f-5902-4444-994a-22a851dc4276.png)

また、BSPタブにて、サブクロックを非搭載（Not populated）に変更します。RTCの何かなようで、ここを設定しないと初期化時（SystemInitialize()）時に、引っかかるようになっているようです。
（詳しいことはわかりませんでしたが、ステップ実行していくとRTCのリセット完了を監視している部分のウエイトから抜けられなくなるようです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/38afb6ef-2031-4d1d-8ab9-1f86b87fe43f.png)

## ピン設定変更
R4 minima上にのっているユーザLEDを点灯させるためのピン設定をしていきます。
ユーザーLEDは回路図上では”SCK LED”というそうで、具体的にはP111ピン（Port1の11ピン）に接続されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/74d5b82b-a228-434f-a59a-a22ac37a8ca4.png)

”Pins”タブに移動し、”P1”->”P111”の”Mode"を”Outoput mode (Initial Low)”に変更します。
（右側の”FSP Visualization”の赤枠は私がつけたものではなく、画面上で実際に表示されているものです。”FSP Configuration”ペイン側でピンを選択すると、対応するピンが赤く囲まれるようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/97c56858-1a30-4306-8e0e-a95c73107a7e.png)

設定を保存（Ctrl + S）し、”Generate Project Content”を押してペリフェラルの設定変更は完了です。
Configuration.xmlを閉じ、パースペクティブを”C/C++”に変更しておきます。
<!--
設定をプロジェクトに適用するため、”Generate Project Content”を押すと、下記のようにファイルが生成されているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/418f8c82-452e-42e3-86b9-40ccc799d037.png)
-->

# Lチカします。
"Developer Assistance"なるものがあり、ここからそれらしい関数を持ってくれば良いそうです。
”Call R_*()”を挿入したいソースの個所にドラッグアンドドロップで、一般的な呼び方（引数・戻り値の取得変数の例が付加された状態）が挿入されるようです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/ed45e4f0-43b8-4ed3-a7f4-db4f2844e7dc.png)

下記に、作成したLチカのコードを示します。
前述の”Generate...”をすると、srcディレクトリにhal_entry.cができるので、そこに処理を記述していきます。

```c:hal_entry.c　11行目あたりから

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    /* TODO: add your own code here */
    static fsp_err_t status;
    static uint16_t duration = 250;

    status = R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg);

    while (1){
        status = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_11, BSP_IO_LEVEL_HIGH);
        R_BSP_SoftwareDelay(duration, BSP_DELAY_UNITS_MILLISECONDS);
        status = R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_11, BSP_IO_LEVEL_LOW);
        R_BSP_SoftwareDelay(duration, BSP_DELAY_UNITS_MILLISECONDS);
    }

    status = R_IOPORT_Close(&g_ioport_ctrl);
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

```
”status”変数は使っていませんがデバッグ用に残してみます。
（追記：…と思ったのですがデフォルトでは最適化されてしまい消えてしまったようです）

## ビルド
ビルドは、画面左上の”🔨”マークで行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/5bba2a4b-a082-4309-bc2f-37c46aebb5e3.png)
成功すると下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/5c06be19-c847-4e20-b9bb-9d6b2efde4ca.png)


## デバッグの実行
プロジェクトを右クリック、”デバッグ”->”3 Renesas GDB Hardware Debugging”を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/c293bad3-f6b7-4d91-a99e-49ca60e31614.png)

IDE上の表示がデバッグパースペクティブに切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/570409a3-144e-4536-b3e1-d68896759be5.png)

デバッグ開始直後はリセットハンドラで停止した状態から始まるようです。
実行”｜▶”を開始して、動作を検証します。

![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/b1be03be-a1fd-484b-9e95-cf4474edfa74.gif)
GIFだとわかりづらくてすみませんが、500ms周期でLEDが点滅するはずです。
(SWDコネクタの向きが変わっていますが、出っ張りの方向は変わりません。ちょっとは見やすくなるかと思っていろいろやってみましたが。。。）

# ArduinoIDEではできない（やりづらい）ことをやってみる
ArduinoIDEでやろうとすると大変なデバッグですが、e2studioならソースレベルで直感的なデバッグができます。
（ArduinoIDE 2.xでは、デバッグペインが追加されており将来的にソースレベルでバッグがサポートされる可能性はゼロではないかもしれませんが、2025年3月16日現在では今のところe2studioを使ったほうがいろいろと早いように思います。ただし、Arduino Zeroなど一部のボードではすでにArduinoIDE上でソースレベルデバッグが可能なものもあるようです。UNO R4が出た時（確か24年1月頃）の私はArduinoIDEでソースレベルデバッグができることを期待してMinimaを買ったんですが、調査不足でした…）
また、関数の定義などをたどるにも、定義を知りたい関数にカーソルを合わせてF3キーを押すだけでいわゆる”Go to Definition”ができるため、例えば引数にどんな値を指定すればよいのかを知りたい場合などに便利です。
まずは、デバッグを開始した流れで、ブレイクポイント、ステップ実行関連の機能をまとめようと思います。

## ブレイクポイントの設置とステップ実行
デバッグの実行中に行番号の左のスペースをダブルクリックでブレイクポイントの設置ができます。
CPUが実行中であった場合はブレイクポイントを設置した箇所ですぐに実行が停止されるはずです。
下記では、whileループ内でのピン状態の変更関数に設置してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/948a93a2-32e1-4747-874c-27172970e984.png)
ステップイン・ステップオーバー・ステップアウト（e2studioでは”ステップリターン”というようです）は、
それぞれF5・F6・F7キーに割りついているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/bb8180b5-e5e0-45ed-8ba9-bd48c5856d88.png)

それぞれの機能について、基本的なことですがせっかくですのでまとめてみました。
* ステップイン
ステップインで関数内の処理に入り、関数内部でより詳細に何が行われているかを確認できます。
（先ほどのR_IOPORT_PinWrite()に対してステップイン）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/d6f2ddb9-ce7c-4d00-b2a1-f9d7edfd37c6.png)

* ステップリターン（ステップアウト）
ステップリターンでは、ステップインした関数から呼び出し元へ戻ることができます
（当然、関数の途中でステップリターンすれば、関数の以降の処理も実行されたうえで呼び出し元へ戻ります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/6b4dd457-9358-4977-b3f9-187dffb35755.png)

* ステップオーバー
ステップオーバーでは、関数内部に入らず、現在の行の関数をステップ実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/c0bed305-c78d-4418-8219-8e51e4839d43.png)

## 監視式（ウォッチウィンドウ）
また、実行の停止中には、変数の値を確認することができます。
変数の値を確認するには、マウスカーソルを確認したい変数の上に合わせ、数ミリセックほど待てば定義や内容がポップアップのようにして重ねて表示されるようです。
（duration 変数にマウスカーソルを合わせてしばらく待つと、内容が見れます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/da05818b-accf-4c80-9169-1f0d6d68946c.png)

もしくは、IDE右側の”式”タブにて（デバッグパースペクティブに切り替わっている必要があることに注意してください）右クリックし、”監視式を追加…”をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/56e5e4c3-6199-4b5f-84f5-43c861481103.png)

変数名を入力することのできるポップアップが現れますので、見たい変数名などを入力し”OK”を押すことで現在の値を”式”タブで確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/a5020602-5766-49b3-9735-c3cca85475a0.png)
（↓”OK”を押すと、変数の状態が見れるようになります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/06772091-ec0c-4bf1-896f-d44e555e3ac7.png)

<!-- 
## Go to Definition(F3)機能
慣れ親しんだ人からするとあまりすごいことではないかもしれませんが（まぁ、デバッグもそうですが）、
今回は知らない関数群を使うときに便利な機能として、紹介してみようと思います。
例として、R_IOPORT_PinWrite()関数の定義をたどってみます。
Arduinoと同様に、Lチカをやってみたいとしましょう。
あなたはArduinoの時に使っていたdigitalWrite()関数のようなものがないかググってみましたが、パッとするものがありません。
いろいろ調べて出てきたDeveloper Assistanceを使用して、なんだかそれっぽい関数を見つけてソースへの追加はできたものの、どう使ったらよいのかよくわかりません。
下記のように
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572881/7bd4019a-3c07-49c5-b06b-78bca7624b76.png)
-->

<!--
// #################################
// TODO:変数の値を変更する方法を調べる
// 　　（Failed to execute MI command？）
// #################################
-->

# まとめ
ArduinoIDEの今後の発展にも大変期待していますが（私は一体何様だョ）、e2studioを使うことで鍛えられるものも多くあると思うので、ArduinoIDEでソースレベルデバッグができるまではしっかり使い込んで慣れ親しんでいきたいです。
すでにもっと高度な内容を記事にされている方もいる中で、あくまで自分用のメモ書きとして作成しましたが、今後同じようなことに挑戦される方などがいらしたらお役に立てれば幸いです。
ツッコミ、質問大歓迎です！