EK-RE01 256KBでLチカする(e² studio編)


低消費電力マイコンのREファミリ

EK-RE01 256KBというRE01 256KBを搭載した評価キットが発売されました。
https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/re/re0/re01-256kb.html
RE01 256KBはREファミリという低消費電力マイコンの256KBのフラッシュメモリを採用した製品になります。
REファミリはSOTBプロセス採用したことにより、動作時とスタンバイ時両方での超低消費電流、
低電圧時の高速動作を実現していることが特徴のようです。

e² studioでLチカプログラムを作成/実行する

プロジェクトの作成

REファミリの統合開発環境(IDE)はIAR for ARMもしくはe² studioを使えるようですが、
ここではe² studioを使用してEK-RE01 256KBでLチカができるまでを試してみたいと思います。

ルネサスの公式サイトよりe² studio 2020-07をダウンロードしてインストールします。

インストールが終わったらスタートメニューから、e² studioを起動します(ワークスペースは適当なフォルダを指定)。

起動したら、左上のファイル → 新規 → C/C++ Project をクリック

Renesas RE → Renesas RE C/C++ Executable Project をクリックしてから 次へ をクリック

プロジェクト名 を入力してから 次へ をクリック

Device Settings でEK-RE01 256KBに搭載されているRE01デバイス(R7F0E01182CFP)を選択して 次へ をクリック

次の画面以降では特に設定する項目がないので 終了 をクリック
するとプロジェクト・エクスプローラー に作成したプロジェクトが表示される

RE01ファミリ用のプロジェクトを作成すると、
CMSISドライバの各ヘッダーファイルとクロック設定関連のためのスタートアップファイルも一緒に生成されるようです。

デフォルトの設定では、中速オンチップオシレータ (MOCO) = 2MHzで動作するようです。

プログラムの作成

それではLチカプログラムを作成していきます。
今回は0.5秒おきにEK-RE01 256KBに実装されているLED0とLED1が交互に点灯する仕様にします。
EK-RE01 256KBの回路図を見ると、LED0はRE01のP210、LED1はRE01のP410に接続されているようなので、
これをI/Oポートで制御することにします。
まず0.5秒の待ち時間を作るために以下のようなソフトウェアループを作成しました。

__attribute__((naked)) static void delay (uint32_t loop_cnt)
{
    __asm volatile("LOOP :");
    __asm volatile("SUB r0, r0, #1");
    __asm volatile("NOP");
    __asm volatile("NOP");
    __asm volatile("NOP");
    __asm volatile("NOP");
    __asm volatile("NOP");
    __asm volatile("NOP");
    __asm volatile("CMP r0, #0");
    __asm volatile("BNE LOOP");
    __asm volatile("BX lr");
}

void delay_us (uint32_t us, uint32_t hz)
{
    signed long loop_cnt;

    loop_cnt = (((us * hz) / 1000000) / 10);

    if(loop_cnt > 0)
    {
        delay(loop_cnt);
    }
}

void delay_ms (uint32_t ms, uint32_t hz)
{
    signed long loop_cnt;

    loop_cnt = (((ms * hz) / 1000) / 10);

    if(loop_cnt > 0)
    {
        delay(loop_cnt);
    }
}

次にRE01 256KBのユーザーズマニュアルを見るとI/Oポートの制御はPCNTR1/PODR/PDRレジスタを使用するので、
以下のように0.5秒おきに今後にI/Oポートの出力レベルを切り替えるプログラムを作成しました。

int main(void) {

    PORT2->PCNTR1_b.PDR10 = 1; /* P210 output */
    PORT4->PCNTR1_b.PDR10 = 1; /* P410 output */

    PORT2->PCNTR1_b.PODR10 = 1; /* P210 high output */
    PORT4->PCNTR1_b.PODR10 = 1; /* P410 high output */

    while(1) {
        PORT2->PCNTR1_b.PODR10 = 0; /* P210 low output */
        PORT4->PCNTR1_b.PODR10 = 1; /* P410 high output */
        delay_ms(500, 2000000);
        PORT2->PCNTR1_b.PODR10 = 1; /* P210 high output */
        PORT4->PCNTR1_b.PODR10 = 0; /* P410 low output */
        delay_ms(500, 2000000);
    }
return 0;
}

それではプログラムを実行してみます。
e² studio のトンカチマークをクリックして正常にビルドできることを確認します。
その後、同じくe² studio の虫マークをクリックしてデバッガと接続します。
接続が完了したら 再開ボタン を2回押して、0.5秒おきにLED0とLED1が交互に点灯することを確認します。

最後に

0.5秒おきにLED0とLED1が交互に点灯することを確認できました。
RE01ファミリの開発環境として、CMSISドライバが提供されているみたいなので、
次はCMSISドライバを使用したプログラムの開発方法について記事を書きたいと思います。