# Renesas RL78 ペリフェラル実装ガイド｜UART・I2C・タイマ・ADCをSmartConfiguratorで実装｜株式会社テクノスフィア

> ルネサス RL78 の UART（SAU）・I2C（IICA）・タイマ（TAU）・12bit ADC を Smart Configurator のコード生成で実装する手順。CS+/e2 studio/CC-RL と STOP/SNOOZE まで解説。

URL: https://technosphere.co.jp/blog/renesas-rl78-peripheral-guide

** 目次
1. はじめに：RL78が日本の組込みで選ばれる理由
2. 開発環境とSmart Configurator
3. UART通信の実装（SAU）
4. I2C通信の実装（IICA / 簡易I2C）
5. タイマ（TAU）でPWM・インターバル
6. 12bit A/Dコンバータの実装
7. 低消費電力モード（HALT/STOP/SNOOZE）
8. よくあるトラブルと対策
9. まとめ

## はじめに：RL78が日本の組込みで選ばれる理由

 **RL78**は、ルネサス エレクトロニクスの16bit低消費電力マイコンファミリです。産業機器・白物家電・車載のボディ系・センサーノードなど、日本の組込み機器で非常に広く採用されています。1.6〜5.5Vの広い動作電圧、豊富なフラッシュ容量ラインナップ、そして優れた低消費電力性能が特徴です。

 ARM Cortex-M系のSTM32などと比べると情報が英語中心になりがちなSTM32に対し、RL78は**日本語ドキュメントとサンプルが充実**しており、国内の量産案件で扱いやすいのも大きな利点です。本記事では、RL78でもっとも使用頻度の高い**UART・I2C・タイマ・ADC**の4つのペリフェラルを、Smart Configuratorのコード生成を活用して実装する方法を解説します。   ** 弊社での活用実績

テクノスフィアでは RL78/G13・G14・G23 を用いた計測機器・センサーノード・制御基板の [組込み受託開発](https://technosphere.co.jp/embedded-achievements) を多数手がけています。生産終了したRL78基板の [逆アセンブル・再構築](https://technosphere.co.jp/blog/renesas-rl78-reverse-engineering) 実績もあり、本記事は実案件のノウハウをもとに構成しています。

## 開発環境とSmart Configurator

RL78の開発では、以下の組み合わせが標準です。
| 要素 | 選択肢 | 備考 |
| 統合開発環境 | **CS+** / **e2 studio** | CS+は純正・軽量、e2 studioはEclipseベースでRX/RAと統一可 |
| コンパイラ | **CC-RL** | ルネサス純正Cコンパイラ。無償版は容量制限あり |
| コード生成 | **Smart Configurator** | GUIでペリフェラルを設定し初期化コードを自動生成 |
| デバッガ | E2 Lite / E2 | オンチップデバッグエミュレータ |

Smart Configurator（旧コード生成／Applilet）は、クロック・端子・ペリフェラルをGUIで設定すると、`R_Config_xxx_Create()` や `R_Config_xxx_Start()` といった初期化・制御関数を自動生成してくれます。手書きでレジスタを叩く必要がほぼなくなり、開発工数を大幅に削減できます。  ** 命名規則について

Smart Configuratorが生成する関数名は `R_Config_<周辺>_<動作>` の形式です（例：`R_Config_UART0_Start`）。本記事のコードはこの生成コードを呼び出す前提で記載しています。世代や設定により関数名が若干異なる場合があります。

## UART通信の実装（SAU）

RL78のUART・SPI・簡易I2Cは、**SAU（Serial Array Unit）**という共通のシリアルユニットで実現します。Smart ConfiguratorでSAUのチャネルを「UART」モードに設定し、ボーレートと端子を割り当てると、送受信関数が生成されます。

### UART送信

```
#include "r_cg_macrodriver.h"
#include "r_cg_userdefine.h"
#include "Config_UART0.h"

/* UART0 を開始（Smart Configurator 生成）*/
R_Config_UART0_Start();

/* 文字列を送信 */
uint8_t tx_buf[] = "Hello RL78!\r\n";
R_Config_UART0_Send(tx_buf, sizeof(tx_buf) - 1);

/* 送信完了は割り込みコールバックで通知される */
```

### UART受信（割り込み）

受信はリングバッファに溜め、コールバック内で処理するのが定石です。Smart Configuratorが生成する受信完了コールバック `r_Config_UART0_callback_receiveend()` をユーザーコード領域に実装します。

```
static volatile uint8_t g_rx_data;

/* 受信開始（1バイトずつ受信） */
R_Config_UART0_Receive(&g_rx_data, 1);

/* 受信完了コールバック（自動生成のひな型に追記）*/
void r_Config_UART0_callback_receiveend(void)
{
    /* g_rx_data に1バイト受信済み。処理後、再度受信を仕掛ける */
    ring_buffer_push(g_rx_data);
    R_Config_UART0_Receive(&g_rx_data, 1);
}
```

   ** 注意

SAUのチャネル割り当ては端子（ピン）と密接に紐づきます。基板設計時に「使いたいUART/SPI/I2Cが同じSAUユニット内で競合しないか」を必ず確認してください。SAUのユニット数（SAU0／SAU1）やチャネル数は品種によって異なる（小型品はSAU0のみ等）ため、対象デバイスのデータシートで構成を確認してください。

## I2C通信の実装（IICA / 簡易I2C）

RL78のI2Cには2種類あります。用途で使い分けます。
| 方式 | 特徴 | 向く用途 |
| **簡易I2C（SAU）** | SAUのチャネルをI2Cモードで使用。マスタ送受信が中心 | センサー・EEPROMへの単純アクセス |
| **IICA（専用ユニット）** | アービトレーション・クロックストレッチ・マルチマスタ対応 | 本格的なI2Cバス、スレーブ動作、複数マスタ環境 |

温湿度センサーやEEPROMを1つ読むだけなら簡易I2Cで十分です。バス上に複数マスタがいる、スレーブとして応答する、といった場合はIICAを選びます。

```
#include "Config_IICA0.h"

#define SENSOR_ADDR  (0x48 << 1)  /* 7bitアドレスを左シフト */
static uint8_t reg = 0x00;
static uint8_t rx[2];

/* レジスタ0x00 を指定して2バイト読み出す */
R_Config_IICA0_Master_Send(SENSOR_ADDR, &reg, 1, 0);   /* 第4引数=継続フラグ */
R_Config_IICA0_Master_Receive(SENSOR_ADDR, rx, 2, 0);
/* 完了は IICA のコールバックで判定 */
int16_t value = (rx[0] << 8) | rx[1];
```

   ** プルアップ抵抗を忘れずに

I2CのSDA/SCLは外部プルアップ抵抗（一般に2.2k〜10kΩ）が必須です。RL78内蔵プルアップでは不足することが多く、通信が不安定になる主因です。波形が鈍る場合は抵抗値を下げます。

## タイマ（TAU）でPWM・インターバル

**TAU（Timer Array Unit）**は複数チャネルを持つ汎用タイマで、以下のような用途に使えます。
- **インターバルタイマ**：一定周期で割り込みを発生（制御周期・ソフトタイマの土台）
- **PWM出力**：マスタチャネルで周期、スレーブチャネルでデューティを設定し、LED調光やモーター制御へ
- **入力パルス測定**：外部信号の周期・パルス幅を計測（流量計・回転数センサー）
- **外部イベントカウント**：エンコーダや接点入力のカウント

```
#include "Config_TAU0_0.h"

/* 1ms インターバルタイマを開始 */
R_Config_TAU0_0_Start();

/* インターバル割り込みコールバック（自動生成）*/
void r_Config_TAU0_0_interrupt(void)
{
    g_msec_tick++;          /* ソフトウェアタイマのカウントアップ */
    if (g_msec_tick % 100 == 0) {
        g_flag_100ms = 1;   /* 100ms ごとの処理要求 */
    }
}
```

PWMを使う場合は、Smart Configuratorで「インターバルタイマ（PWM出力）」を選び、マスタ／スレーブのチャネルを割り当てます。デューティ比は `R_Config_TAU0_n_Set_PWM_Duty()` 相当の関数や、コンペアレジスタへの直接書き込みで動的に変更できます。

## 12bit A/Dコンバータの実装

RL78は12bit逐次比較型（SAR）A/Dコンバータを内蔵します。温度センサー・電圧監視・アナログ入力の読み取りに使います。Smart ConfiguratorでA/D変換チャネル・基準電圧・変換モード（ワンショット／連続）を設定します。

```
#include "Config_ADC.h"

uint16_t ad_value;

R_Config_ADC_Start();
R_Config_ADC_Set_OperationOn();

/* 変換完了コールバック（自動生成）*/
void r_Config_ADC_interrupt(void)
{
    R_Config_ADC_Get_Result_12bit(&ad_value);
    /* 例：基準電圧 3.3V のとき電圧[mV] に換算 */
    uint32_t mv = ((uint32_t)ad_value * 3300) / 4095;
}
```

   ** 精度を出すコツ

サンプリング時間を十分に確保し、アナログ入力源のインピーダンスを下げることが精度の鍵です。高インピーダンス源はOPアンプでバッファするか、サンプリング時間を延ばします。基準電圧のノイズ対策（デカップリング）も忘れずに。

## 低消費電力モード（HALT/STOP/SNOOZE）

RL78が選ばれる最大の理由のひとつが低消費電力性能です。電池駆動機器では、いかにCPUを止めている時間を長くするかが平均電流を決めます。
| モード | 動作 | 復帰要因 |
| **HALT** | CPU停止、周辺は動作継続 | 任意の割り込み |
| **STOP** | 高速発振も停止し最小消費電流 | 外部割り込み・一部周辺の割り込み |
| **SNOOZE** | CPUを起こさずADC変換やUART/CSI受信を実行 | 条件成立でHALT/STOPへ自動復帰 |

**SNOOZEモード**はRL78の強力な機能です。たとえば「STOP中に一定周期で起き、CPUを起こさずにADCで電圧を測り、しきい値を超えたときだけCPUを起こす」といった動作が可能で、センサーノードの平均電流を桁違いに下げられます。

```
/* メインループの基本形：処理がなければ眠る */
while (1) {
    if (g_flag_100ms) {
        g_flag_100ms = 0;
        do_periodic_task();
    }
    /* やることが無ければ HALT で待機（割り込みで復帰）*/
    HALT();
}
```

## よくあるトラブルと対策
| 症状 | 主な原因 | 対策 |
| UARTが文字化けする | ボーレート誤差・動作クロック設定ミス | 高速オンチップオシレータの周波数とSAUの分周設定を確認。誤差±2%以内に収める |
| I2Cが応答しない（NACK） | アドレスのシフト忘れ・プルアップ不足 | 7bitアドレスを左1bitシフト。プルアップ抵抗を実装し波形を確認 |
| STOP復帰後に動作が不安定 | 発振安定待ち不足 | STOP復帰後は発振安定時間を確保してから周辺を再開 |
| 消費電流が下がらない | 未使用端子の処理不足・周辺停止漏れ | 未使用端子を入力プルアップ等で固定。使わない周辺はクロック供給を停止 |
| 書き込みできない | オプションバイト・オンチップデバッグ設定 | セキュリティ設定とデバッガ接続（RESET/TOOL端子）を確認 |

## まとめ

###  この記事のまとめ
- RL78は16bit低消費電力マイコンで、日本の産業・車載・家電で広く採用されている
- UART・SPI・簡易I2CはSAU、本格的なI2CはIICAで実装する
- Smart Configuratorのコード生成で `R_Config_xxx` 関数が生成され、開発工数を削減できる
- TAUはインターバル・PWM・パルス測定に、12bit ADCは電圧監視・センサー読み取りに使う
- HALT/STOP/SNOOZEを使い分けることで電池駆動機器の平均電流を大幅に下げられる

RL78を使った組込みシステム開発・量産設計でお困りのことがあれば、テクノスフィアにお気軽にご相談ください。新規開発はもちろん、生産終了基板の再設計やSTM32など他マイコンへの移植も対応します。

RL78 を使ったセンサー・計測機器・制御基板の試作・量産設計、既存基板の RL78 化や移行も [組込み制御・マイコン開発](https://technosphere.co.jp/embedded) として対応しています。   ／この内容の受託開発・PoC相談はこちら＼

### Renesas RL78 受託開発・量産設計

RL78を使った計測機器・センサーノード・制御基板の設計から量産、生産終了基板の再設計・他マイコン移植まで、組込み開発歴20年超のエンジニアが一貫対応します。  [組込み開発サービスを見る](https://technosphere.co.jp/embedded) [RL78受託開発・量産相談](https://technosphere.co.jp/contact)

## よくある質問（FAQ）   ** RL78のUART・I2C・SPIはどのペリフェラルで実装しますか？

UART・SPI・簡易I2CはSAU（Serial Array Unit）で実装します。アービトレーションやクロックストレッチが必要な本格的なI2Cマスタ/スレーブはIICA（専用I2Cユニット）を使います。Smart Configuratorでチャネルと動作モードを選ぶと対応する `R_Config_xxx` 関数が自動生成されます。   ** 開発環境はCS+とe2 studioのどちらを使うべきですか？

どちらもCC-RLとSmart Configuratorを利用できます。CS+は純正・軽量で日本語情報が豊富、e2 studioはEclipseベースでRX/RAなど他のルネサスデバイスと操作を統一できます。複数デバイスを扱うならe2 studioが扱いやすいです。   ** RL78で消費電力を下げるには？

処理がないときはHALT/STOPモードに遷移させ割り込みで復帰させます。SNOOZEモードを使うとCPUを起こさずにADC変換やシリアル受信を実行でき、電池駆動機器の平均電流を大幅に下げられます。   ** STM32など他マイコンとどう違いますか？

RL78は16bitで超低消費電力・低コストに強く、日本語情報が豊富で国内量産に向きます。32bitの高性能処理やARMエコシステムが必要ならSTM32が有利です。要件に応じて [STM32](https://technosphere.co.jp/blog/stm32-uart-i2c-can) と使い分けるのが実務的です。

##   次に読む｜マイコン記事
-  [Renesas シリーズ Renesas RX マイコン入門 32bit産業機器の主力。SCI/FIT/MTUを解説](https://technosphere.co.jp/blog/renesas-rx-introduction)
-  [Renesas シリーズ RL78 逆アセンブル・再構築 ソース紛失したレガシー基板の復元事例](https://technosphere.co.jp/blog/renesas-rl78-reverse-engineering)
-  [STM32 シリーズ STM32 UART・I2C・SPI・CAN 実装ガイド ARM系マイコンの通信実装と比較に](https://technosphere.co.jp/blog/stm32-uart-i2c-can)
    [技術コラム一覧に戻る](https://technosphere.co.jp/blog/)
