- RXマイコンのソフト開発(1)クロック設定とLチカ
- RXマイコンのソフト開発(2)スイッチのチャタリング対策
- RXマイコンのソフト開発(3)スピーカーから音を出す
- RXマイコンのソフト開発(4)UART送信でHelloWorld
- RXマイコンのソフト開発(5)ADCでバッテリーの電圧測定
- RXマイコンのソフト開発(6)RSPIでMPU6000から角速度取得
- RXマイコンのソフト開発(7)モータドライバーDRV8836の動作
- RXマイコンのソフト開発(8)磁気式エンコーダーAS5047
RXマイコン(RX631)のソフト開発の4回目です。今回は、UARTでHello Worldを出力したいと思います。
今回の記事に関しては、ほとんど以下のマウス本を参考にしています。
環境
- パソコン: Windows10 64 bit
- ターゲットデバイス: R5F5631PDDFL(RX631 48ピン)
UARTの回路
作成したUART部分の回路図は図1です。TXDのポートは P26/TXD1 です。TXD1を使って、RXマイコンからPCにデータを送信したいと思います。
プログラムフロー
プログラムの処理の流れは図2です。
いつものようにクロックの初期化とコンペアマッチタイマー0(CMT0)の初期化を行っています。次に、シリアルコミュニケーションインターフェース1(SCI1)を初期化します。その後、メインルーチンに入り、スイッチの押し込みを検知したら HelloWorld を UART 送信します。
プログラム
重要なプログラム部分だけ示します。sci.c と sci.h を除いた全てのソースコードはGitHubの「4_uart」フォルダの中にソースコードがありますので、詳細を知りたい場合はご覧ください。
メイン関数
main.c:メイン関数のソースコード
#include "interface.h" #include "sci.h" #include "init_rx631.h" void main(void){ init_rx631(); // Overall Initialization while(1){ if(g_sw_chg){ // Enter when SW is pressed g_sw_chg = 0; sci_printf("Hello World\n\r"); } } }
メイン関数では、RX631の初期化を行い、割り込み関数によってスイッチの押し込みフラグが立ったら、フラグを下げて、sci_printf でHelloWorldをUART送信します。
SCI1の初期化
初期化関数のソースコードが以下です。SCI に関してはユーザーズマニュアルの p.1357「35. シリアルコミュニケーションインターフェース(SCIc、SCId)」に記述があります。
init_rx631.c:初期化関数のソースコード
#include "init_rx631.h" #include "iodefine.h" /*** Function Declaration ***/ static void init_clock(void); static void init_cmt0(void); static void init_sci1(void); /*---- RX631 Initialization ----*/ void init_rx631(void){ SYSTEM.PRCR.WORD = 0xA503; // Unprotect // MainCLK, SUBCLK and RTC Initialization init_clock(); // CMT0 Initialization init_cmt0(); // SCI1 Initialization init_sci1(); SYSTEM.PRCR.WORD = 0xA500; // Reprotect } ~略~ static void init_sci1(void){ MSTP(SCI1) = 0; // SCI1 Module Stop Release MPC.PWPR.BIT.B0WI = 0; // PFSWE bit write enable MPC.PWPR.BIT.PFSWE = 1; // PmnPFS Register write enable MPC.P26PFS.BIT.PSEL = 0x0A; // set to TXD1 MPC.PWPR.BYTE = 0x80; // Reprotect PORT2.PMR.BIT.B6 = 1; // set to Peripheral SCI1.SMR.BYTE = 0x00; // PCLK/1, asynchronous, // 1 stop bit, no parity bit, data length=8bit SCI1.SEMR.BIT.ABCS = 1; // 1bit transfer in 8 cycles SCI1.BRR = 80; // 38400 bps, error=0.47% SCI1.SCR.BIT.TE = 1; // Enable serial transmission }
SCI1の初期化では、MTU3の初期化と同様にモジュールストップ状態の解除と端子機能の変更を行います。
その後、SCI1の設定を行います。SCI1.SMR.BYTE=0x00 とすることで以下のように設定されます。
- クロックの分周比 :1
- ストップビットの数:1
- パリティビットなし
- データ長:8ビット
- 動作モード:調歩同期式
ビットレート については、BRRレジスタを設定することで決定します。SCI1.SEMR.BIT.ABCS=1のとき、BRRの値は以下のように計算されます。
bpsとしたい場合は、BRRの値は以下のようになります。
プログラム中では、小数点以下を四捨五入して、 としています。
最後に、SCI1.SCR.BIT.TE=1 で、シリアル送信を許可しています。
UART送信する関数
UART送信する関数については、マウス本のHPで公開している sci.c のsci_printf 関数を使わせていただきました。
マウス本のHP:https://takeyuta.wixsite.com/mouse
プログラムの実行
PCとマウスを接続したら、TeraTerm を開いて、図3のように「設定」→「シリアルポート」を実行します。
シリアルポートの設定では、ボーレートを38400に設定して、「OK」を左クリックします(図4)。
マウスのプッシュスイッチを押すと、図5のように TeraTerm に Hello World が表示されます。
おわりに
今回でUART送信ができました。次の記事では、ADCを使ってバッテリーの電圧を測定したいと思います。