EK-RE01 256KBでシリアルエコーバックする(e² studio編)

# REファミリのCMSISドライバパッケージについて
REファミリはArm Cortex-M0+コアを内蔵しています。
そのため、ARMが決めたソフトウェア規格であるCMSISに準拠したソフトウェアパッケージが準備されています。
今回は、このRE01 256KB用のCMSISドライバパッケージを使用してシリアルエコーバックプログラムを作成してみます。
RE01 256KB用のCMSISドライバパッケージは以下のルネサス公式サイトからダウンロードすることができます。
https://www.renesas.com/jp/ja/products/software-tools/software-os-middleware-driver/software-package/re-software-development-kit.html

# e² studioでシリアルエコーバックプログラムを作成/実行する
## CMSISドライバパッケージ用のプロジェクトをインポートする
CMSISドライバパッケージが適用されたサンプルプロジェクトをe² studioのワークスペースにインポートします。
インポート方法については、CMSISドライバパッケージに同梱されているドキュメントのに記載されています。
そのため、ここでの説明は割愛します(ドキュメントの5章に記載されています)。

## シリアルエコーバックのプログラムの作成
それでは、シリアルエコーバックのプログラムを作成しましょう。
今回は、シリアルエコーバックのためにEK-RE01 256KBに実装されているUSBシリアル変換回路を使用します。
EK-RE01 256KBとPCをUSBケーブルで接続して、PCのTera Termから送信した文字をRE01 256KBがそのまま返す仕様にします。

CMSISドライバパッケージを使用するためには以下の手順を踏む必要があるそうです。
詳しい手順は、同梱されているCMSIS パッケージを用いた開発スタートアップガイドに記載されています。
1. 動作開始時の端子設定（BoardInit関数の作成）
2. 動作開始時のクロック・電力制御モードの定義
3. IRQ番号の定義
4. 周辺機能で使用する端子の設定
5. 共通機能ドライバの動作条件の定義
6. R_SYSTEMドライバで使用するクロックの定義
7. 周辺機能ドライバで使用するクロックの定義


### 動作開始時の端子設定（BoardInit関数の作成）
インポートしたサンプルプロジェクトのmain.cには既にBoardInit関数が作成されていました。
DCDCとLEDに接続されている汎用ポートに対して端子設定処理が記述されているようです。
今回はリセット解除後、早い段階で必要な端子設定がないため、このまま使用します。

### 動作開始時のクロック・電力制御モードの定義
スタートアップ処理ではr_core_cfg.hの設定に従い、クロックおよび電力制御モードの初期設定を行うようです。
今回は電力制御モードは「ノーマルモード」で動作させます。
また、クロック設定についても、ソースクロックをデフォルトの「MOCO」で使用します。

### IRQ番号の定義
シリアルエコーバックのためにRE01 256KBに搭載されているシリアルコミュニケーションインタフェース(SCI)を使用します。
EK-RE01 256KBのUSBシリアル変換回路にはSCI0(P702,P703)が接続されています。
また、CMSISドライバパッケージのSCI(USART)ドライバはSCIの割り込みを使用するようです。
そのため、CPUが割り込みを受け付けられるようにSCI0からの割り込みをIRQ番号に割り当てる必要があります。

r_system_cfg.h内でRXI割り込みをIRQ番号4に割り当てます。
![SCI0_RXI_INT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/e44099d1-45fe-66f0-4f03-9ffa2ca21713.png)

次にTXI割り込みをIRQ番号5に割り当てます。
![SCI0_TXI_INT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/e7f5b5c1-a9d2-573a-2f00-ff52a7406302.png)

最後にERI割り込みをIRQ番号7に割り当てます。
![SCI0_ERI_INT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/6daaa4ad-f8b0-6460-dbb1-2b285a8eff71.png)

### 周辺機能で使用する端子の設定
SCI0で使用する端子をSCI0の端子機能として使用できるように設定する必要があります。
USBシリアル変換回路にはSCI0(P702,P703)が接続されているので、P702,P703をSCI0用の端子として設定します。
SCI0用の端子設定処理はpin.cのR_SCI_Pinset_CH0関数に記載されており、必要に応じて編集するようです。
今回は「RXD0 : P702」と「TXD0 : P703」の設定を以下のように変更しました。

「RXD0 : P702」の端子設定処理
![RXD0_PIN_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/e6795502-f51e-73b4-bed9-a4b244d474eb.png)
「TXD0 : P703」の端子設定処理
![TXD0_PIN_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/4b84c3bb-9b9a-c138-6fcd-83718d508f63.png)

### 共通機能ドライバの動作条件の定義
必要に応じてr_system_cfg.hとr_lpm_cfg.hを編集する必要があります。
用意されている関数をRAMに配置する設定がありますが、今回は編集する必要がないのでこのままとします。

### R_SYSTEMドライバで使用するクロックの定義
R_SYSTEMドライバのクロック制御関数は、r_core_cfg.hの設定に従ってクロック設定を行うようです。
1の設定と何が違うのかよく分かりませんがこのままとしておきます。

### 周辺機能ドライバで使用するクロックの定義
SCI0をUARTで使用するので、必要に応じてr_usart_cfg.hを編集します。
今回はDTC/DMACは使用しないので、設定はこのままとします。

### メインプログラムの作成
USARTドライバのAPI関数を使用してシリアルエコーバックの処理を作成します。
今回は、RE01 256KBが受信したメッセージをそのままPCのTera Termに送信するため以下のようにmain.cを変更しました。

最初に必要なヘッダーファイルをインクルードします。

```c
/* Start user code for include. */
#include "Driver_USART.h"
/* End user code.*/

/* Start user code for global.*/
extern ARM_DRIVER_USART Driver_USART0;
/* End user code. */
```

次にUSARTドライバで使用する変数を宣言します。

```c
uint32_t serial_data;
int32_t err;
static ARM_DRIVER_USART * USARTdrv = &Driver_USART0;
ARM_DRIVER_VERSION     version;
ARM_USART_CAPABILITIES drv_capabilities;
```

最後にシリアルエコーバックの処理を作成します。

```c
/*Initialize the USART driver */
USARTdrv->Initialize(myUSART_callback);
/*Power up the USART peripheral */
USARTdrv->PowerControl(ARM_POWER_FULL);
/*Configure the USART to 4800 Bits/sec */
USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
                  ARM_USART_DATA_BITS_8 |
                  ARM_USART_PARITY_NONE |
                  ARM_USART_STOP_BITS_1 |
                  ARM_USART_FLOW_CONTROL_NONE, 9600);

/* Enable Receiver and Transmitter lines */
USARTdrv->Control (ARM_USART_CONTROL_TX, 1);
USARTdrv->Control (ARM_USART_CONTROL_RX, 1);

USARTdrv->Send("Hello EK-RE01 256KB\r\n", 23);

while (1)
{
    err = USARTdrv->Receive(&serial_data, 1);
    if (ARM_DRIVER_OK == err)
    {
       USARTdrv->Send(&serial_data, 1);
    }
}
```

## プログラムの動作確認
作成したプログラムの動作を確認するため、Tera Termを使用してRE01 256KBにメッセージを送信します。
上記のソースコードの通り、RE01 256KB側は8bitデータ、パリティなし、1ストップビット、9600bpsに設定しています。
なので、PCのTera Termも同じ設定にします。
プログラムを実行したらTeraTermに「Hello EK-RE01 256KB」と表示されることを確認します。
TeraTermに文字を打ってRE01にメッセージを送信すると、送信したメッセージがTeraTermに表示されることを確認します。
これでシリアルエコーバックプログラムの動作確認は完了です。

![teraterm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354472/4a4f1668-34ed-52ab-cb12-ff51f7306267.png)

## 最後に
今回はEK-RE01 256KBのUSBシリアル変換回路を使用してシリアルエコーバックのプログラムを作成しました。
次は、e² studioを使用しないでプログラムをビルドできるようにCMakeを使用したビルド方法を試してみたいと思います。