はじめに:RL78が日本の組込みで選ばれる理由
RL78は、ルネサス エレクトロニクスの16bit低消費電力マイコンファミリです。産業機器・白物家電・車載のボディ系・センサーノードなど、日本の組込み機器で非常に広く採用されています。1.6〜5.5Vの広い動作電圧、豊富なフラッシュ容量ラインナップ、そして優れた低消費電力性能が特徴です。
ARM Cortex-M系のSTM32などと比べると情報が英語中心になりがちなSTM32に対し、RL78は日本語ドキュメントとサンプルが充実しており、国内の量産案件で扱いやすいのも大きな利点です。本記事では、RL78でもっとも使用頻度の高いUART・I2C・タイマ・ADCの4つのペリフェラルを、Smart Configuratorのコード生成を活用して実装する方法を解説します。
テクノスフィアでは RL78/G13・G14・G23 を用いた計測機器・センサーノード・制御基板の 組込み受託開発 を多数手がけています。生産終了したRL78基板の 逆アセンブル・再構築 実績もあり、本記事は実案件のノウハウをもとに構成しています。
開発環境と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, ®, 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 化や移行も 組込み制御・マイコン開発 として対応しています。
Renesas RL78 受託開発・量産設計
RL78を使った計測機器・センサーノード・制御基板の設計から量産、生産終了基板の再設計・他マイコン移植まで、組込み開発歴20年超のエンジニアが一貫対応します。
よくある質問(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 と使い分けるのが実務的です。