RXマイコンのソフト開発(4)UART送信でHelloWorld

RXマイコン(RX631)のソフト開発の4回目です。今回は、UARTでHello Worldを出力したいと思います。

今回の記事に関しては、ほとんど以下のマウス本を参考にしています。

環境

  • パソコン: Windows10 64 bit
    • 統合開発環境: e2studio 2021-01をインストール
    • コンパイラ: Renesas CCRX v3.03.00をインストール
    • 書き込みソフト: Renesas Flash Programmer V3.08.01(無償版) をインストール
  • ターゲットデバイス: R5F5631PDDFL(RX631 48ピン)

UARTの回路

図1:UARTの回路
図1:UARTの回路

作成したUART部分の回路図は図1です。TXDのポートは P26/TXD1 です。TXD1を使って、RXマイコンからPCにデータを送信したいと思います。

プログラムフロー

プログラムの処理の流れは図2です。

図2:プログラムのフローチャート
図2:プログラムのフローチャート

いつものようにクロックの初期化とコンペアマッチタイマー0(CMT0)の初期化を行っています。次に、シリアルコミュニケーションインターフェース1(SCI1)を初期化します。その後、メインルーチンに入り、スイッチの押し込みを検知したら HelloWorld を UART 送信します。

プログラム

重要なプログラム部分だけ示します。sci.csci.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 とすることで以下のように設定されます。

  • クロックの分周比  a:1
  • ストップビットの数:1
  • パリティビットなし
  • データ長:8ビット
  • 動作モード:調歩同期式

ビットレート B については、BRRレジスタを設定することで決定します。SCI1.SEMR.BIT.ABCS=1のとき、BRRの値は以下のように計算されます。

\displaystyle{
BRR=\frac{\rm PCLK}{16 \times a \times B } - 1
}

 B=38400 bpsとしたい場合は、BRRの値は以下のようになります。

\displaystyle{
BRR=\frac{50\times 10^6}{16 \times 1 \times 38400 } - 1 =80.4
}

プログラム中では、小数点以下を四捨五入して、 BRR=80 としています。

最後に、SCI1.SCR.BIT.TE=1 で、シリアル送信を許可しています。

UART送信する関数

UART送信する関数については、マウス本のHPで公開している sci.csci_printf 関数を使わせていただきました。

マウス本のHP:https://takeyuta.wixsite.com/mouse

プログラムの実行

PCとマウスを接続したら、TeraTerm を開いて、図3のように「設定」→「シリアルポート」を実行します。

図3:TeraTermの設定1
図3:TeraTermの設定1

シリアルポートの設定では、ボーレートを38400に設定して、「OK」を左クリックします(図4)。

図4:TeraTermの設定2
図4:TeraTermの設定2

マウスのプッシュスイッチを押すと、図5のように TeraTermHello World が表示されます。

図5:プログラムの実行結果
図5:プログラムの実行結果

おわりに

今回でUART送信ができました。次の記事では、ADCを使ってバッテリーの電圧を測定したいと思います。

参考文献

お問い合わせフォーム プライバシーポリシー

© 2021 Setoti All rights reserved.