Renesas RX621 UART
UARTを用いて、RX621のデバッグをします。
SIM I/Oを用いて今回はpritnfをSCI1にリダイレクト出来るようにします。
(printfを自身で作成するのもアリかと思います。)
回路はRX621→SCI1→FT231XS→COM(パソコン)となります。
embedded-blog.ccwo.net
手順はRX631と同様になるため、さくさく説明していきます!
まず、lowsrc.c、lowsrc.hとSCI.c、SCI.hという名前で次のファイルをプロジェクトに追加します。
(lowsrc.c、lowsrc.hは上記RX631のUARTの記事を参照)
e2 stduio左側プロジェクトエクスプローラのプロジェクトフォルダ内のsrcフォルダを右クリックし,
新規→ソース・ファイルからlowsrc.c
新規→ヘッダ・ファイルからlowsrc.h
新規→ソース・ファイルからSCI.c
新規→ヘッダ・ファイルからSCI.h
を作成します。
ソースコードの追加はプロジェクトファイルのsrcフォルダに直接作成することでも可能です。
つぎに、hardware_setup.cにてSCI.hをインクルードし、HardwareSetup関数でSCI.cのSCI1_initialize関数を呼びます。
SCI.h
#ifndef SCI_H_ #define SCI_H_ void SCI1_initialize(void); #endif /* SCI_H_ */
SCI.c
#include "iodefine.h" #include "machine.h" #include "SCI.h" void SCI1_initialize(void){ MSTP(SCI1) = 0; // Wake up SCI1 PORT3.ICR.BIT.B0 = 1; // Enable P30 receive buffer SCI1.SCR.BIT.TIE = 0; // Disable TXI SCI1.SCR.BIT.RIE = 0; // Disable RXI, ERI SCI1.SCR.BIT.TE = 0; // Disable TX SCI1.SCR.BIT.RE = 0; // Disable RX SCI1.SCR.BIT.MPIE = 0; // Normal Mode SCI1.SCR.BIT.TEIE = 0; // Disable TEIE SCI1.SCR.BIT.CKE = 0; // SCK is port SCI1.SMR.BIT.CM = 0; // Asynchronous communication method SCI1.SMR.BIT.CHR = 0; // 8bit SCI1.SMR.BIT.PM = 0; // None parity SCI1.SMR.BIT.STOP = 0; // None stop bit SCI1.SMR.BIT.MP = 0; // Disable multiple processor SCI1.SMR.BIT.CKS = 0; // PCLK SCI1.BRR = 12; // 115200bps nop(); SCI1.SCR.BIT.TE = 1; // Enable TX SCI1.SCR.BIT.RE = 1; // Enable RX } void charput(char c) { while(SCI1.SSR.BIT.TEND == 0); SCI1.TDR = c; SCI1.SSR.BIT.TEND = 0; } char charget(void){ char data; data = SCI1.RDR; SCI1.SSR.BIT.RDRF = 0; return data; }
次に、reset_program.c内の
//#ifdef __cplusplus // Use SIM I/O //extern "C" { //#endif //extern void _INIT_IOLIB(void); //extern void _CLOSEALL(void); //#ifdef __cplusplus //} //#endif
とreset_program.cのPowerON_Reset_PC関数内の
//_INIT_IOLIB(); //_CLOSEALL();
のコメントアウトを外します。
これで準備は完了しました。
main文にて、printf関数を用いてデバッグを行います。
#include "iodefine.h" #include "machine.h" #include <stdio.h> void main(void) { static unsigned int i; while(1){ printf("Hello RX World!\n"); for(i = 0; i < 65000; i++) nop(); } }
これでTeraTerm等でCOM接続をし、Hello RX World!と表示されれば成功です。
ただ、printfを高速で連続に呼び出すと、送信バッファが溜まってしまいますので、空関数nopを使ってdelayをとっています。
nop関数を使うためにはmachine.hをインクルードする必要があります。
それでは、SCI1の設定手順を見ていきます。
- モジュールスタート(消費電力低減機能の解除)
- ピンの設定
- SCI1の設定
- ユーザ関数の定義
1.モジュールスタート
MSTP(SCI1) = 0; // Wake up SCI1
消費電力低減機能を解除します。RX631のようにアクセスロックはないので、そのまま解除します。
MSTPCTRレジスタがiodefine.hでMSTP(****)というようにデファインされているのでこれを使用します。
2.ピンの設定
PORT3.ICR.BIT.B0 = 1; // Enable P30 receive buffer
P30の受信バッファを有効にします。RX631とくらべて、ピンひとつずつに周辺機能を割り当てる機能は一部にしか用意されておらず、モジュール開始と同時に切り替わる仕様であると思います。
3.SCI1の設定
データシート図29.7を参考に、レジスタを設定していきます。
SCI1.SCR.BIT.TIE = 0; // Disable TXI SCI1.SCR.BIT.RIE = 0; // Disable RXI, ERI SCI1.SCR.BIT.TE = 0; // Disable TX SCI1.SCR.BIT.RE = 0; // Disable RX SCI1.SCR.BIT.MPIE = 0; // Normal Mode SCI1.SCR.BIT.TEIE = 0; // Disable TEIE SCI1.SCR.BIT.CKE = 0; // SCK is port SCI1.SMR.BIT.CM = 0; // Asynchronous communication method SCI1.SMR.BIT.CHR = 0; // 8bit SCI1.SMR.BIT.PM = 0; // None parity SCI1.SMR.BIT.STOP = 0; // None stop bit SCI1.SMR.BIT.MP = 0; // Disable multiple processor SCI1.SMR.BIT.CKS = 0; // PCLK SCI1.BRR = 12; // 115200bps nop(); SCI1.SCR.BIT.TE = 1; // Enable TX SCI1.SCR.BIT.RE = 1; // Enable RX
ほぼ初期化手順通りで大丈夫です。
4.ユーザ関数の定義
今回はprintfにリダイレクトするため、SCI1でcharget,charputを定義しています。
他のSCIを用いてprintfをする場合はSCIの番号を変えれば可能です。
これでSCIの設定は完了です。