こんにちは、組み込みエンジニア歴20年以上のtomozoです。
今回は、ルネサス社製の
RL78マイコンで通信制御プログラムについて徹底解説します。
この記事は
- RLマイコンでUART通信プログラムを作ってみたい方
- 新人組み込みエンジニアの方
向けの記事です。
RL78マイコンの統合開発環境e2studioには
コード自動生成機能があります。
コードの自動生成機能を使うと期待通り動作する周辺機能のプログラム
をすぐに作ることができて、プログラミング作業がはかどります。
マニュアルを読みながら一つずつ設定を入力していくのは
結構苦労しますからね。
プログラミングが終わって実際に動かしてみると
全然動かなくて原因調査に何日もかかることもあります。
そういった作業はサクッとミスなく終わらせると
クリエイティブな設計作業や他の業務、学習などに
時間を充てることができるようになります。
この記事を読めば
- e2studioでUART通信のコード生成の方法
- RL78のUART通信プログラム設計の基本
が分かるようになります。
それでは早速解説をはじめます。
目次
設計するもの
今回のUARTを含む通信制御については
こちらの記事で詳しく紹介しています。

今回説明する内容の準備にもなりますのでまずは一読下さい。
設計するものの要点をまとめると以下の表のようになります。
機能 | シリアル通信 |
マイコン | RL78/G13(R5F100SH) |
使用するマイコンの周辺機能 | シリアル通信(UART) |
備考 | e2studioのコード生成を使用する |
通信の詳細設定は、設定画面の説明で記述します。
プログラミングの流れ
プログラミング作業の大まかな流れとしては以下のようになります。
プロジェクト作成というのはプログラムの開発環境の
ファイルなど一式を含んだものです。
コードを自動生成
それでは早速、コードを自動生成します。
e2studioの準備がまだの方はこちらを確認して下さい。

【準備】
e2studioで新しいプロジェクトを作成します。
tomozo
新しいプロジェクト作成した直後はプロジェクト名のファイル一つしかありません。
【コード生成手順】
①プロジェクト・エクスプローラーの
「コード生成」-「周辺機能」-「シリアル」
をクリックします。
②「周辺機能」ウインドウの
「SAU0」-「チャネル」タブでチャネル0を
- UART0
- 送信/受信機能
に設定します。
ちなみにSAUというのはシリアル・アレイ・ユニットの略です。
③「SAU0」-「UART0」-「受信」タブ
で受信の設定を行います。
設定の一例
- データ・ビット長設定:8ビット
- データ転送方向設定:LSB
- パリティ設定:パリティなし
- 受信データ・レベル設定:標準
- 転送レート設定:38400bps
- 割り込み設定:エラー割り込み設定
- コールバック機能設定:受信完了
LSBというのは下位ビットから順番に転送する方式で、
逆に上位ビットから転送するのをMSBと言います。
パリティというのは誤り検出のためのもので偶数・奇数・なしがあります。
データの1の数にパリティビットを加えて偶数か奇数の設定した
ように通信します。
例えば奇数パリティに設定しデータが10010001の場合、1は3個で
奇数なので奇数パリティは0になります。
ハードウェアの通信データのトラブルなどで偶数になったらおかしい
とマイコンが判断しパリティエラーを発生させます。
④「SAU0」-「UART0」-「送信」タブ
で送信の設定を行います。
設定の一例
- 転送モード設定:繰り返しモード
- データ・ビット長設定:8ビット
- データ転送方向設定:LSB
- パリティ設定:パリティなし
- ストップ・ビット長設定:1ビット
- 送信データ・レベル設定:標準
- 転送レート設定:38400bps
- 割り込み設定:低
- コールバック機能設定:送信完了
ストップビットはHighでデータの終了を示します。
この長さを1か2の長さに設定できます。
ちなみにスタートビットはLowとなっています。
⑤設定が終わったら「コードを生成する」をクリックするとコードが生成されます。
以下のようなファイルが生成されました。
tomozo
生成コードの確認
生成されたコードを確認します。
シリアル通信に関連するファイルは
- r_cg_serial_user.c
- r_cg_serial.c
- r_cg_serial.h
の3つです。
r_cg_serial_user.c
以下のような関数が生成されています
static void __near r_uart0_interrupt_receive(void) | 受信割り込み関数 |
static void __near r_uart0_interrupt_error(void) | エラー発生時の割り込み関数 |
static void __near r_uart0_interrupt_send(void) | 送信割り込み関数 |
static void r_uart0_callback_receiveend(void) | 受信完了で呼ばれる関数 |
static void r_uart0_callback_softwareoverrun(uint16_t rx_data) | オーバーラン発生時に呼ばれる関数 |
static void r_uart0_callback_sendend(void) | 送信完了で呼ばれる関数 |
static void r_uart0_callback_error(uint8_t err_type) | エラー発生で呼ばれる関数 |
オーバーランというのは受信したデータを格納したレジスタ
をリードする前に次のデータを受信した場合にのことをいいます。
UARTでは一定間隔でデータが送られてくるので、受信割り込みで
データをリードしてあげる必要があります。
r_cg_serial.c
void R_SAU0_Create(void) | シリアルアレイユニットの初期設定関数 |
void R_UART0_Create(void) | UART0の初期設定関数(コード生成のGUIで設定した内容が記述されています) |
void R_UART0_Start(void) | UART0の開始関数 |
void R_UART0_Stop(void) | UART0の停止関数 |
MD_STATUS R_UART0_Receive(uint8_t * const rx_buf, uint16_t rx_num) | UART0の受信関数 |
MD_STATUS R_UART0_Send(uint8_t * const tx_buf, uint16_t tx_num) | UART0の送信関数 |
r_cg_serial.h
UARTで使用する数値のマクロ定義や
関数のプロトタイプ宣言が記述されています。
必要に応じてみる程度で問題ありません。
それぞれの中身の詳細はRL78/G13のハードウェアマニュアルなどを見てくださいね。
動作確認
シリアル通信はマスターとスレーブがあるので
2つの通信デバイスが必要になることがほとんどです。
動作確認するには通信相手も必要になるので、
自身で完結するプログラムに比べると少し複雑になります。
確認することとしては
- 送信データが期待通り出力されているか
- 受信データを正しく読み取っているか
- エラー発生時の処理が適切に行われているか
といった点になります。
組み込み機器での送受信データの確認方法としては
- JTAGデバッガでメモリを確認する
- シリアルモニターで確認する
- オシロスコープで波形を見て確認する
が一般的です。
すでに通信が動いていることが確認できている環境では、
オシロスコープを使うことはほとんどありませんが、
新規設計した基板で時初めて通信を確認する時は、
まずオシロスコープで以下のような点から
ハードウェアの確認から行いましょう。
- データの通信速度
- 信号が設計通りの電圧で仕様通り綺麗に出ているか(電圧が低かったりなまったりしていないか?)
ハードウェアに問題がなければ、
シリアルモニターを使います。
組み込み開発現場では一つは用意されているのではないでしょうか?
USBなどでパソコンに接続して確認するタイプと
液晶があり単体で確認できるタイプがあります。
いきなりJTAGデバッガでメモリを確認してもいいですが、
プログラムがバグっていると送信側が悪いのか
受信側が悪いのか分からない場合もあります。
こんな時シリアルモニターで確認するとどちらが悪いか予想がつきやすくなります。
まとめ
プログラミングの流れ
- プロジェクト作成
- コード自動生成
- ユーザープログラム作成
- 動作確認・コード修正
コード自動生成
- e2studioのGUI画面で設定するだけで簡単に作成可能
- 出来たコードの中身はしっかり確認・理解しておこう
動作確認手段は3つ
- ハードウェアはオシロスコープで確認
- シリアルモニターで通信データの確認
- JTAGデバッガでメモリを確認
参考になったとか、もっとここが知りたいなど一言でも
コメント、意見などいただけると励みになります。
こちらの記事でマイコンの基本機能についてまとめています。
もしよければご覧ください。

このサイトでは
学校や友人、親は教えてくれない
資産運用についても紹介しています。
できるだけ早く自分の将来のために勉強しておかないと
もっと早く知っておけば良かったって後悔しますよ。
