[Arduino UNO R4] e²Studioによるベアメタル・プログラミング入門

Arduino UNO R4は、ルネサスのマイコンRA4M1(Arm Cortex-M4コア)を搭載し、SWDのデバッグI/Dを装備したマイコンボードです。そこでSWDを活用して、本ボードをただのRAマイコンボードとしてe²studioを使用したプログラミング環境を作ってみました。
Arduinoとしての機能は一切使えなくなりますが、レジスタ直叩きのベアメタル・プログラミングが可能になります。もう少し楽をしたい場合は、ルネサスのFSP(Flexible Software Package)でH/Wの初期化や提供されるHALを使用することができます。
ちなみにe²studioはルネサスが提供する統合開発環境、FPSはファームウェアのパッケージで、ソースコードの自動生成からデバッグまでできます。プログラミング言語はC/C++です。自分はCしか使ってないので本稿はCでの説明です。あと開発PCはWindowsです。

**注意　Arduinoのファームを上書きしますので、再びArduinoとして使用するにはファームの書き込みが必要となります。**

# 準備
## デバッグプローブ
SWDで開発用のPCと接続するため、デバッグプローブが必要となります。ルネサスのE2エミュレータとかSEGGERのJ-Linkとかです。
ボード側のSWDコネクタはハーフピッチの10pinです。ジャンパー線は無理なのでコネクタケーブルも用意します。
以下のようにつなげます。ボード上のコネクタはボックスが無いので向きに注意、ケーブルによって違います。
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/a914e8f6-ec97-2d43-d68b-2c75904fd51c.jpeg">

## e²Studioのインストール
ルネサスの統合開発環境e²Studioをインストールします。RAだけに使用するなら、以下のルネサスのGitHubのリポジトリからインストーラが入手できます。

https://github.com/renesas/fsp/releases

以下の"FSP with e2 studio Windows installer"です。インストーラを実行すればToolcahneも含めて必要なツール一式がインストールされます。

_[2023.11.09 追記]_
FSPのバージョンはv4.2.0、v4.6.0、v5.0.0で確認しました。以前、4.2.0を超えると動作しなかったのですが、コンフィギュレーションを追加することにより回避できました。コンフィギュレーションの記事も変更済みです。
 ~~※注意 私が試した限りではFSP v4.2.0ではうまくいきましたが、v4.5.0およびv4.6.0ではダメでした。途中のバージョンは確認してませんが、現時点ではv4.2.0を使用することをお勧めします。~~ 

<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/0aaf44d0-666a-164c-9b49-a3035d00d528.jpeg">

フルセットのe²Studioは以下のルネサスのWebから入手できます。インストールの際にはターゲットマイコンにRAを選択し、ToolchainやFSPなど必要なものを選択します。

https://www.renesas.com/jp/ja/software-tool/e-studio#overview

e²StudioなどEclipse系は一つのPCに複数インストールできますので（ディスク容量は消費しますが）、FSP with e2 studioを使用するのが無難かも知れません。

# プロジェクトの作成
e²StudioなどEclipse系は開発するプログラムをプロジェクトの単位で管理します。まずプロジェクトを作成します。

## ワークスペースの指定
e²Studioを起動するとまずワークスペースを聞かれますので、ディレクトリを作成し指定します。プロジェクトはデフォルトではこの中に作成されます（別の場所を指定することもできます）。
一つのワークスペースの中に複数のプロジェクトを作成し、ワークスペースごと、プロジェクトごとに設定もできるので、慣れてくると便利な機能です。

## プロジェクトの作成
[File]メニューから[New]->[Renesas C/C++ Project]->[Renesas RA]を選択、開いたダイアログから[GCC for Renesas C /C++ Executable Project]を選択して[Next]を押します。

次の画面で任意のプロジェクト名を入力して[Next]を押します。

次の画面で対象のハードウェアなどを設定します。対応済みのルネサス純正ボードであればそのボードを選択するだけですが、本ボードは対象外なので[Custom User Board]を選択し、Deviceにマイコンの型番[R7FA4M1AB3CFM]を指定します。Debbugerは自分が使用するデバッグプローブの種類を選択してください。Toolchainsは[GNU ARM Embedded]が選択済みだと思います。
以下のようになります。
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/24bc0851-775e-2504-d3a2-c45eb2353753.jpeg">
[Next]を押して[Executable]を選択、さらに[Next]を押して[Bere Metal - Minimal]を選択、そして[Finish]を押すとプロジェクトが作成され、雛形となるソースコードも自動生成されます。
ここでFSPコンフィグレーションを行うか聞かれますが、とりあえず[No]と答えます。
以下のように左側のProjects Explorerに生成したプロジェクトが表示されます。すでにH/Wの初期化してmain()関数を実行するまでのソースコードが出来てます。真のベアメタルを目指す人はこれらを削除して一からコーディングしますが、本稿ではこれを使用して進めていきます。
![pic_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/af0a446a-681b-9f37-565f-07e61a8a8b01.jpeg)

## プロジェクトの設定
作成したプロジェクトを右クリックし[Properties]を選び、開いたダイアログで設定を行いきます。RA4M1用の基本的な設定はされているはずですので、まずはそのままで、必要になったときに変更してもいいかと思います。
設定項目は非常に多いですが、全部設定する必要もありません。実際に設定を行うのは主に[C/C++ Build]->[Settings]->[Tool Settings]です。上から順番に必要な個所を設定していくと良いでしょう。
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/6ed30b61-7e83-e736-f0a1-ebb50fd62c8e.png">

## プロジェクトのビルド
ここでいったん作成したプロジェクトをビルドしてみます。
プロジェクトを右クリックし[Build Project]を選択します。コンパイル、リンクが始まります。"Build Finished. 0 errors, 0 warnings. "と表示されればOKです。もしエラーが出た場合は何か間違えてます。

# プログラムの作成
古の作法にのっとりLED点滅プログラム、Lチカを作成してみます。

## コンフィギュレーション

プロジェクト中にある"configuration.xml"ファイルをダブルクリックすると[FSP Configuration]の画面が表示されます。
まずクロックをボードに合わせて設定します。[Clocks]タブを選択し以下を設定します。これを間違えるとたいがい起動しません。
[HOCO 48MHz]
[PLL Src: Disabled]
[Clock src: HOCO]
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/f7ed1ceb-6cd3-cbf1-4bff-6f1f108adddb.jpeg">

_[2023.11.09追記]_
[BSP]タブを選択し、[プロパティー]の[RA Common]から以下を設定します。以前のバージョンでは不要でしたが最近のバージョンではこれを設定しないとRTCの初期化コードを生成し、起動時に止まってしまいます。
[Subclock Populated:  Not Populated]
![pic_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/8451e8f3-f36c-c760-18ab-d022bc0a0869.jpeg)


次にボード上のLEDを使用できるように設定します。
ポート1の11(P111)にLEDがつながってますので、これを出力ポートにします。
[Pins]タブを選択し、左のリストから[P111]を探します。[Mode]に[Output (initial Low)]を選択してください。
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/d56ef8f5-6be7-258f-cf21-0361356ad782.jpeg">
コンフィギュレーションが終わったらソースコードを自動生成します。右上にある[Generate Project Content]ボタンを押してください。

## ユーザプログラムの作成
Lチカのプログラムを書きましょう。自分のコードは\src\hal_entry.cに記述します。
このファイルを開くと以下のhal_entry()関数があります。
![pic_007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/494dc696-30ed-26aa-9842-4ce5b4557b9d.jpeg)
この関数はmain()関数から呼び出されます。main()関数自体は書き換え不可です。書き換えてもたぶん上書きされます。
ユーザプログラムはこのsrcディレクトリ内に記述する流儀のようです（別のところにも書けますが）。
hal_entry()関数を以下のように書き換えます。特に説明も不要と思いますが、R_IOPORT_PinWrite()関数で出力値を変更し、R_BSP_SoftwareDelay()関数で時間待ちです。

```C
void hal_entry(void)
{
    while(1) {
        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_11, BSP_IO_LEVEL_HIGH);
        R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_11, BSP_IO_LEVEL_LOW);
        R_BSP_SoftwareDelay (500, BSP_DELAY_UNITS_MILLISECONDS);
    }
}
```

プログラムが書き終わったら、プロジェクトを右クリックし[Build Project]を選択してビルドします。コンパイルエラーが出たらコードを直します。

# プログラムの実行
出来上がったプログラムをボード上でデバッグ実行してみます。

## PCとの接続準備
PCとArduino UNO R4をデバッグプローブを介してつなげます。ボードのUSBも電源供給のため接続します。

## デバッグ構成の設定
[Run]メニューから[Debug Configurations]を選択します。以下のように[Renesas GDB Hardware Debugging]にビルドしたプロジェクトのデバッグ構成が出来ていると思います。もし無ければ[New Configuration]ボタンを押して作成します。[C/C++ Application]にビルドしたプログラム(ELFファイル)が選択されていることも確認してください（たまに自動的に設定されてないことがあります）。
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/09fc6318-df33-7a9a-642e-e95b57f47553.jpeg">

[Debugger]タブを選び、[Debug Hardware]に使用するデバッグプローブの種類を選択します。
<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/cef92e73-1f53-221f-82f6-f50efbba67d0.png">

_[2023.11.09追記]_
E2 Liteを使用する場合は[Connection Settings]で以下を設定してください。

[メイン・クロック・ソース: 外部クロック]
[動作周波数(MHz): 48]
[エミュレータから電源を供給する: いいえ]

<img width="500" alt="pic_0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179541/2a059c6b-5d99-627c-b12b-870211943ac4.jpeg">

他の設定項目はデフォルトで大丈夫と思いますが、うまく接続できないときは確認してください。

## デバッグ実行
[Debug]ボタンを押したら、プログラムがボードに転送され実行されます。最初はReset_Hndlerの先頭でブレークすると思います。そこから実行すると、デフォルトではmain()関数の先頭でブレークします。この最初にブレークする場所は前述のデバッグ構成の中で指定できます。hal_entryとかにしておく方が便利かもしれません。
ここまでうまくいけば、Arduino UNO R4がLチカしてるはずです。
二度目からは虫のアイコンの[Debug]ボタンを押すだけで、前回のデバッグ構成でデバッグが実行されます。複数のデバッグ構成がある場合は、[Debug]ボタン横の下矢印から選択できます。

# おわりに
今回はLED点滅のみですが、FSPを使うと他のデバイスも比較的簡単に使用可能です。UART、A/DC、I²Cの基本動作までは試したので機会があれば書きたいと思います。
また、e²Studioは嫌だ、Eclipseは嫌いだという方は、ルネサス提供のVSCode機能拡張を使用すれば、VSCodeでも開発できると思います。そのうち試してみたいと思います。
最後に言うのでなんですが、Arduino UNO R4を気軽に使いたいならArduinoとして使うのが一番手軽かと思います。でもやっぱりデバッガが使いたい、マイコンならベアメタル、という方はお試しを。