CCWO Embedded Space

CCWOの日々の開発を発信するブログ

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の設定手順を見ていきます。

  1. モジュールスタート(消費電力低減機能の解除)
  2. ピンの設定
  3. SCI1の設定
  4. ユーザ関数の定義

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の設定
f:id:CCWO:20160822170603p:plain
データシート図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の設定は完了です。