RL78/G13 周辺機能紹介 SAU シリアル アレイ ユニット ルネサスエレクトロニクス株式会社 ルネサス半導体トレーニングセンター 2013/08/02 Rev. 0.00 00000-A
コンテンツ SAU の概要 UART 通信機能のプログラム サンプル紹介 2
SAU の概要 3
SAU の機能 クロック同期式調歩同期式マスタ動作のみ チャネル 0: 送信チャネル 1: 受信 4
UART 通信機能のプログラム サンプル紹介 5
仕様 (1/2) UART 通信機能のプログラム例対向機器から受信を行い 受信キャラクタまたは受信エラーの種別に応じたメッセージを送信します 受信と送信の対応は以下の通りです 受信キャラクタ T t 上記以外受信エラーパリティ エラーフレーミング エラーオーバーラン エラー 応答メッセージ OK r n ok r n UC r n 応答メッセージ PE r n OE r n FE r n 6
仕様 (2/2) < 設定条件 > 高速オンチップオシレータのクロックは 32MHz で動作します CPU/ 周辺ハードウェア クロックは 32MHz で動作します SAU0 チャネル 0 1 を UART として使用します データ出力は P12/TxD0 端子 データ入力は P11/RxD0 端子を使用します データ長は 8 ビットを使用します データ転送方向設定は LSB ファーストを使用します パリティ設定は偶数パリティを使用します 受信データ レベル設定は標準を使用します 転送レートは 9600bps を使用します 受信完了割り込み (INTSR0) 送信完了割り込み (INTST0) エラー割り込み (INTSRE0) を使用します INTSR0 INTST0 INTSRE0 の割り込み優先順位は低優先を使用します 7
初期設定のフロー 8
シリアル アレイ ユニットの設定フロー fclk の 4 クロック以上間隔をあける 9
シリアル アレイ ユニットへのクロック供給開始 周辺イネーブル レジスタ 0(PER0) 各周辺ハードウエアへのクロック供給許可 / 禁止の設定 10
SAU の動作クロックと転送クロック シリアル アレイ ユニット0 チャネル0 レジスタ 0 f CLK 32MHz プリスケーラ 16 セレクタ クロック 0 2 種類のクロックと外部クロックから f MCK セレクタ選択セレクタ 分周 クロック制御 f TCLK ユニット 0 共通の 2 種類のクロック 外部クロック チャネル 1 転送クロック 0 16 セレクタ クロック 1 セレクタ f MCK セレクタ クロック制御 f TCLK 外部クロック 11
クロック周波数の設定 シリアル クロック選択レジスタ 0(SPS0) CK00 CK01 動作クロックの設定 CK01 CK00 0 1 0 0 0 1 0 0 サンプルの周辺ハードウエア クロック 12
シリアル アレイ ユニットの設定関数 void R_SAU0_Create(void) { SAU0EN = 1; NOP(); NOP(); NOP(); NOP(); SPS0 = 0x0044; R_UART0_Create(); } fclk の 4 クロック以上間隔をあける 13
UART0 の設定フロー (1/4) R_UART0_Create() 1 チャネルの動作停止 RxD 端子のノイズ フィルタの設定 割り込みの禁止 エラー フラグのクリア 割り込み要求フラグのクリア 割り込み優先度の設定 チャネル 1 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 チャネル 0 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 チャネル 0 の出力の設定 入出力端子の設定 1 return 14
チャネルの動作停止 シリアル チャネル停止レジスタ 0(ST0) チャネルの動作停止 チャネル 1 チャネル 0 15
割り込みの禁止 割り込みマスク フラグ レジスタ (MK0H) 対応するマスカブル割り込み処理の許可 / 禁止を設定 エラー割り込み SREMK0 ビット 受信完了割り込み SRMK0 ビット 送信完了割り込み STMK0 ビット 16
割り込み要求フラグのクリア 割り込み要求フラグ レジスタ (IF0H) 対応する割り込み要求の発生または命令の実行によりセット リセット信号発生時または命令の実行によりクリア 割り込みが受け付けられた場合は自動的にクリア エラー割り込み SREIF0 ビット 受信完了割り込み SRIF0 ビット 送信完了割り込み STIF0 ビット 17
割り込み優先順位レベルの設定 優先順位指定フラグ レジスタ (PR00H, PR10H) PR00H レジスタと PR10H レジスタを組み合わせて, 対応するマスカブル割り込みの優先順位レベルを設定 エラー割り込み SREPR00 10 ビット 受信完了割り込み SRPR00 10 ビット 送信完了割り込み STPR00 10 ビット 18
UART0 の設定関数 (1/4) void R_UART0_Create(void) { ST0 = 0x0003; STMK0 = 1; STIF0 = 0; SRMK0 = 1; SRIF0 = 0; SREMK0 = 1; SREIF0 = 0; STPR10 = 1; STPR00 = 1; SRPR10 = 1; SRPR00 = 1; SREPR10 = 1; SREPR00 = 1; SMR00 = 0x0022; SCR00 = 0x8297; SDR00 = 0xce00; } NFEN0 = 0x01; SIR01 = 0x0007; SMR01 = 0x0122; SCR01 = 0x4697; SDR01 = 0xce00; SO0 = 0x0001; SOL0 = 0x0000; SOE0 = 0x0001; PM1 = 0x02; P1 = 0x04; PM1 &= 0xfb; R_UART0_Create() チャネルの動作停止 割り込みの禁止 割り込み要求フラグのクリア 割り込み優先順位レベルの設定 チャネル 0 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 1 19
UART0 の設定フロー (2/4) R_UART0_Create() チャネルの動作停止 割り込みの禁止 割り込み要求フラグのクリア 割り込み優先順位レベルの設定 チャネル 0 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 送信 1 20
送信チャネルの動作モードの設定 (1/4) シリアル モード レジスタ 00(SMR00) 動作クロックの選択 クロック 0=2MHz クロック 1=2MHz クロック 0=2MHz UART 通信モードでは設定固定 21
送信チャネルの動作モードの設定 (2/4) シリアル モード レジスタ 00(SMR00) スタート トリガ要因の選択 UART 送信モードでは設定固定 22
送信チャネルの動作モードの設定 (3/4) シリアル モード レジスタ 00(SMR00) 動作モードの設定 UART 通信モードでは設定固定 23
送信チャネルの動作モードの設定 (4/4) シリアル モード レジスタ 00(SMR00) 割り込み要因の選択 24
送信チャネルの通信動作の設定 (1/7) シリアル通信動作設定レジスタ 00(SCR00) 動作モードの設定 UART 送信モードでは設定固定 25
送信チャネルの通信動作の設定 (2/7) シリアル通信動作設定レジスタ 00(SCR00) データとクロックの位相選択 UART 通信モードでは設定固定 26
送信チャネルの通信動作の設定 (3/7) シリアル通信動作設定レジスタ 00(SCR00) エラー割り込み信号のマスク可否の選択 UART 送信モードでは設定固定 27
送信チャネルの通信動作の設定 (4/7) シリアル通信動作設定レジスタ 00(SCR00) パリティ ビットの設定 28
送信チャネルの通信動作の設定 (5/7) シリアル通信動作設定レジスタ 00(SCR00) データ転送順序の選択 29
送信チャネルの通信動作の設定 (6/7) シリアル通信動作設定レジスタ 00(SCR00) ストップ ビットの設定 30
送信チャネルの通信動作の設定 (7/7) シリアル通信動作設定レジスタ 00(SCR00) データ長の設定 31
送信チャネルの転送クロックの設定 シリアル データ レジスタ 00(SDR00) 動作クロックの分周設定 fmck = 2MHz 1 1 0 0 1 1 1 fmck/208 2MHz/208 9600Hz 32
UART0 の設定関数 (2/4) void R_UART0_Create(void) { ST0 = 0x0003; STMK0 = 1; STIF0 = 0; SRMK0 = 1; SRIF0 = 0; SREMK0 = 1; SREIF0 = 0; STPR10 = 1; STPR00 = 1; SRPR10 = 1; SRPR00 = 1; SREPR10 = 1; SREPR00 = 1; SMR00 = 0x0022; SCR00 = 0x8297; SDR00 = 0xce00; } NFEN0 = 0x01; SIR01 = 0x0007; SMR01 = 0x0122; SCR01 = 0x4697; SDR01 = 0xce00; SO0 = 0x0001; SOL0 = 0x0000; SOE0 = 0x0001; PM1 = 0x02; P1 = 0x04; PM1 &= 0xfb; R_UART0_Create() チャネルの動作停止 割り込みの禁止 割り込み要求フラグのクリア 割り込み優先順位レベルの設定 チャネル 0 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 1 33
UART0 の設定フロー (3/4) 1 RxD 端子のノイズ フィルタの設定 エラー フラグのクリア チャネル 1 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 受信 チャネル 0 の出力の設定 入出力端子の設定 return 34
受信チャネルの動作モードの設定 (1/4) シリアル モード レジスタ 01(SMR01) 動作クロックの選択 クロック 0=2MHz クロック 1=2MHz クロック 0=2MHz UART 通信モードでは設定固定 35
受信チャネルの動作モードの設定 (2/4) シリアル モード レジスタ 01(SMR01) スタート トリガ要因の選択 UART 受信モードでは設定固定 36
受信チャネルの動作モードの設定 (3/4) シリアル モード レジスタ 01(SMR01) 受信データのレベル反転の設定 37
受信チャネルの動作モードの設定 (4/4) シリアル モード レジスタ 01(SMR01) 割り込み要因の選択 UART 受信モードでは設定固定 38
受信チャネルの通信動作の設定 (1/3) シリアル通信動作設定レジスタ 01(SCR01) 動作モードの設定 UART 受信モードでは設定固定 39
受信チャネルの通信動作の設定 (2/3) シリアル通信動作設定レジスタ 01(SCR01) エラー割り込み信号のマスク可否の選択 40
受信チャネルの通信動作の設定 (3/3) シリアル通信動作設定レジスタ 01(SCR01) パリティ ビットの設定 データ転送順序の選択 ストップ ビットの設定 データ長の設定 偶数パリティ LSBファーストストップビット = 1ビットデータ長 = 8ビット 41
受信チャネルの転送クロックの設定 シリアル データ レジスタ 01(SDR01) 動作クロックの分周設定 fmck = 2MHz 1 1 0 0 1 1 1 fmck/208 2MHz/208 9600Hz 42
UART0 の設定関数 (3/4) void R_UART0_Create(void) { ST0 = 0x0003; STMK0 = 1; STIF0 = 0; SRMK0 = 1; SRIF0 = 0; SREMK0 = 1; SREIF0 = 0; STPR10 = 1; STPR00 = 1; SRPR10 = 1; SRPR00 = 1; SREPR10 = 1; SREPR00 = 1; SMR00 = 0x0022; SCR00 = 0x8297; SDR00 = 0xce00; } NFEN0 = 0x01; SIR01 = 0x0007; SMR01 = 0x0122; SCR01 = 0x4697; SDR01 = 0xce00; SO0 = 0x0001; SOL0 = 0x0000; SOE0 = 0x0001; PM1 = 0x02; P1 = 0x04; PM1 &= 0xfb; 1 RxD 端子のノイズ フィルタの設定 エラー フラグのクリア チャネル 1 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 チャネル 0 の出力の設定 入出力端子の設定 return 43
UART0 の設定フロー (4/4) R_UART0_Create() 1 チャネルの動作停止 RxD 端子のノイズ フィルタの設定 割り込みの禁止 エラー フラグのクリア 割り込み要求フラグのクリア 割り込み優先度の設定 チャネル 1 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 チャネル 0 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 チャネル 0 の出力の設定 入出力端子の設定 1 return 44
RxD 端子のノイズ フィルタの設定 ノイズ フィルタ許可レジスタ 0(NFEN0) ノイズ フィルタの使用可否 RxD0 端子 UART 受信モードでは設定固定 45
エラー フラグのクリア シリアル フラグ クリア トリガ レジスタ 01(SIR01) チャネルの各エラー フラグのクリア 受信チャネル ( チャネル 1) 46
チャネル 0 の出力の設定 (1/2) シリアル出力レジスタ 0(SO0) シリアル出力のバッファ レジスタ ユニット 0 のチャネル 0 SOE00=1 のときの書き換えは無視 シリアル出力許可レジスタ 0(SOE0) シリアル通信動作の出力許可 / 停止を設定 47
チャネル 0 の出力の設定 (2/2) シリアル出力許可レジスタ 0(SOE0) シリアル通信動作の出力許可 / 停止を設定 ユニット 0 のチャネル 0 シリアル出力レベル レジスタ 0(SOL0) データ出力レベルの反転を設定する 48
入出力端子の設定 ポート レジスタ (P1) ポートの出力ラッチの値を設定 TxD 端子 ポート モード レジスタ (PM1) ポートの入出力モードの選択 TxD 端子 RxD 端子 49
UART0 の設定関数 (4/4) void R_UART0_Create(void) { ST0 = 0x0003; STMK0 = 1; STIF0 = 0; SRMK0 = 1; SRIF0 = 0; SREMK0 = 1; SREIF0 = 0; STPR10 = 1; STPR00 = 1; SRPR10 = 1; SRPR00 = 1; SREPR10 = 1; SREPR00 = 1; SMR00 = 0x0022; SCR00 = 0x8297; SDR00 = 0xce00; } NFEN0 = 0x01; SIR01 = 0x0007; SMR01 = 0x0122; SCR01 = 0x4697; SDR01 = 0xce00; SO0 = 0x0001; SOL0 = 0x0000; SOE0 = 0x0001; PM1 = 0x02; P1 = 0x04; PM1 &= 0xfb; 1 RxD 端子のノイズ フィルタの設定 エラー フラグのクリア チャネル 1 の設定 動作モードの設定 通信動作の設定 転送クロックの設定 チャネル 0 の出力の設定 入出力端子の設定 return 50
UART0 の設定関数のコード生成 (1/3) 51
UART0 の設定関数のコード生成 (2/3) 転送完了割り込み バッファ空き割り込み 52
UART0 の設定関数のコード生成 (3/3) 53
main のフロー main R_UART0_Receive R_UART0_Start オーバラン エラー? HALT モードへ移行 受信割り込み禁止 受信エラー検出? Yes 受信エラーを判定し 対応したデータの送信 No 受信データを判定し 対応したデータの送信 R_UART0_Receive 受信割り込み許可 54
UART0 動作開始関数 void R_UART0_Start(void) { STIF0 = 0; STMK0 = 0; SRIF0 = 0; SRMK0 = 0; SREIF0 = 0; SREMK0 = 0; SO0 = 0x0001; SOE0 = 0x0001; SS0 = 0x0003; } 55
UART 動作の許可 シリアル チャネル開始レジスタ 0(SS0) 通信 / カウント開始の許可 受信 送信 56
正常受信のシーケンス メイン 割り込み HALT() 受信待ち R_UART0_Send() 格納先アドレスと受信回数 (1 回 ) を通知 R_UART0_Interrupt_Receive() 通知アドレスに受信データを格納 R_UART0_Callback_ReceiveEnd() 正常終了を通知 57
エラー受信のシーケンス メイン 割り込み HALT() 受信待ち R_UART0_Receive() 格納先アドレスと受信回数 (1 回 ) を通知 R_UART0_Interrupt_Error() エラーの判定 R_UART0_Callback_Error() エラー情報を通知 58
受信完了割り込み処理 interrupt void R_UART0_Interrupt_Receive(void) { uint8_t rx_data; } rx_data = RXD0; if (g_uart0rxlen > g_uart0rxcnt) { *gp_uart0rxaddress = rx_data; gp_uart0rxaddress++; g_uart0rxcnt++; if (g_uart0rxlen == g_uart0rxcnt) { R_UART0_Callback_ReceiveEnd(); } } void R_UART0_Callback_ReceiveEnd(void) { g_uart0rxerr = 0U; /* Clear error flag */ } 59
受信データの読み出し シリアル データ レジスタ 01(SDR01) 下位 8 ビットは受信バッファ レジスタ 動作クロックの分周設定 RXD0 60
エラー割り込み処理 interrupt void R_UART0_Interrupt_Error(void) { uint8_t err_type; } *gp_uart0rxaddress = RXD0; err_type = (uint8_t)(ssr01 & 0x0007U); SIR01 = (uint16_t)err_type; R_UART0_Callback_Error(err_type); void R_UART0_Callback_Error(uint8_t err_type) { g_uart0rxerr = err_type; /* Get error type */ } 61
エラー フラグの読み出し シリアル ステータス レジスタ 01(SSR01) 通信ステータス, エラー発生状況を表示するレジスタ 62
トリガによるエラー フラグのクリア シリアル フラグ クリア トリガ レジスタ 01(SIR 01) エラー フラグをクリアするためのトリガ レジスタ エラーフラグをクリア 1 1 1 10 10 10 フレーミングパリティオーバラン 63
送信のシーケンス メイン 割り込み R_UART0_Receive() 1 バイトデータの送信後 残りの送信回数と送信メッセージのアドレスを通知 R_UART0_Interrupt_Send() 1 バイトデータの送信 3 回 R_UART0_Callback_ReceiveEnd() 送信終了を通知 R_UART0_Interrupt_Send() 1 バイトデータの送信 64
UART0 データ送信関数 MD_STATUS R_UART0_Send(uint8_t* txbuf, uint16_t txnum) { MD_STATUS status = MD_OK; } if (txnum < 1U) { status = MD_ARGERROR; } else { gp_uart0txaddress = txbuf; g_uart0txcnt = txnum; STMK0 = 1U; /* disable INTST0 interrupt */ TXD0 = *gp_uart0txaddress; gp_uart0txaddress++; g_uart0txcnt--; STMK0 = 0U; /* enable INTST0 interrupt */ } return (status); 65
送信チャネルの転送クロックの設定 シリアル データ レジスタ 00(SDR00) 下位 8 ビットは送信バッファ レジスタ 動作クロックの分周設定 TXD0 66
送信完了割り込み処理 interrupt void R_UART0_Interrupt_Send(void) { if (g_uart0txcnt > 0U) { TXD0 = *gp_uart0txaddress; gp_uart0txaddress++; g_uart0txcnt--; } else { R_UART0_Callback_SendEnd(); } } void R_UART0_Callback_SendEnd(void) { g_uart0txend = 1U; /* Set transmission end flag */ } 67
END ルネサスエレクトロニクス株式会社