脱公務員電子回路設計エンジニア

UARTをAPIROMを使用せずに実装

UART。まずはエコーバッグ

UARTはほんとに組込み現場で頻繁に使用するため、なるべく勉強になるようROM APIを使用せずに実装したいと思います。

プログラム

以下にプログラムを示します。参考テキストに記されているROMAPIを使用せずに作りました。
ちなみにROMAPIを使用しないコードサンプルは、LPC810のマニュアルの後半にCode Sampleが載っています。基本的にそれを参考にすれば作れるかと思います。Code Sampleは一部間違いがあるあることが分かりました。UARTの設定がマニュアルの記載だと一部DATになっていたり、UARTの後の番号の記載がないのでそのまま貼り付けるとコンパイルエラーになります。
 LPC_GPIO_PORT->B0の配列は、直接動作に関係なく、単にどこをプログラム走っているか分かるように外付けのダイオードを光らせているだけす。

#ifdef __USE_CMSIS
#include "LPC8xx.h"
#endif

#include <cr_section_macros.h>

#define Baudrate (9600)
//データシートコードサンプルから引用
#define UART_CFG_ENABLE (0x1 << 0)
#define UART_CFG_DATALEN(d) (((d) - 7) << 2)
//#define UART_CFG_NO_PARITY		デフォルトではノンパリティ
//#define UART_CFG_STOPLEN			//デフォルト1ストップビット
//#define UART_SYNCHRONOUS_MODE		//デフォルトは非同期
#define UART_STAT_RXRDY (0x1 << 0)
#define UART_STAT_TXRDY (0x1 << 2)
#define UART_STAT_TXIDLE (0x1 << 3)
//

#define COM_BUF_LEN	10

// TODO: insert other include files here
void SwitchMatrix_Init();
void GPIO_init();
void UART_Init();
void CR_LF();
// TODO: insert other definitions and declarations here

int main(void) {

    // TODO: insert code here
	SwitchMatrix_Init();
	GPIO_init();
	LPC_GPIO_PORT->B0[1]=0;
	UART_Init();

	volatile int i;
    // Enter an infinite loop, just incrementing a counter
	
    while(1) {
    	for(i = 0; i < COM_BUF_LEN; i++) {
    	LPC_GPIO_PORT->B0[1]=1;
    	while(~LPC_USART0->STAT & (UART_STAT_TXRDY | UART_STAT_RXRDY));
    	LPC_USART0->TXDATA = LPC_USART0->RXDATA;
    	}
    	while(~LPC_USART0->STAT & UART_STAT_TXIDLE);
    	//CR_LF();
    }
    return 0 ;
}

void UART_Init(){

	LPC_SYSCON->PRESETCTRL &=~(1<<3);	///UART0_RST_N
	LPC_SYSCON->PRESETCTRL |=(1<<3);	//UART0_RST_N ペリフェラルリセット クリアリセット
	LPC_SYSCON->UARTCLKDIV=1;			//divide by 1	1分周
	LPC_SYSCON->UARTFRGDIV=0xFF;		//デフォルトでFFを設定する
	LPC_SYSCON->UARTFRGMULT=0;
	LPC_USART0->BRG=0x4D;	//BRG=77
	//U_PCLK = UARTCLKDIV/(1 + MULT/DIV)
	//分数部分(1 + MULT/DIV)はSYSCONブロックの2つのUSART分数分周レジスタによって決定

	//USART Configuration register
	LPC_USART0->CFG |=UART_CFG_ENABLE;
	LPC_USART0->CFG |=UART_CFG_DATALEN(8);	//8bits データ長
}

void CR_LF(){
	LPC_GPIO_PORT->B0[1]=0;
	while(~LPC_USART0->STAT & (UART_STAT_TXRDY | UART_STAT_RXRDY));
	LPC_USART0->TXDATA=0x0a;
	LPC_USART0->TXDATA=0x0D;

}

void SwitchMatrix_Init()
{
    /* Enable SWM clock */
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7)|(1<<14);	//SWM & UART0 clockEnable

    /* Pin Assign 8 bit Configuration */
    /* U0_TXD */
    /* U0_RXD */
    LPC_SWM->PINASSIGN0 = 0xffff0004UL;

    /* Pin Assign 1 bit Configuration */
    /* SWCLK */
    /* SWDIO */
    /* RESET */
    LPC_SWM->PINENABLE0 = 0xffffffb3UL;
}

void GPIO_init(){
	LPC_SYSCON->SYSAHBCLKCTRL |=(1<<6);
	LPC_GPIO_PORT->DIR0 |=(1<<1);
	LPC_GPIO_PORT->B0[1]=1;
}

MCUCXpresso IDEでターミナルを使用する

 MCU Xpresso IDEには、Terminalがありますので、それでプログラムの動作を確認することができます。
IDEのパースペクティブ下段中央にTerminalのタブがあるので、これをクリックして、「Open a Terminal」という小さいタブがありますので、これをクリックするとCOMを開けます。
コマンドを送信するときは、Toggle Command input Fieldというところをクリックすると、Terminal下部にテキストを入れるものが現れるのでここに適当に半角の文字を打って、Enterキーを押すと、打ったコマンドがそのままTerminalに表示されます。

まずは基本から

 MCUXpresso IDEのマニュアル(以下IDE)にて、調べると、「Using Terminal View for UART communication with target」という項目に記載がありました。
 まず、ポイントをいかにまとめると

ちなみにターミナルが表示されていない場合は、上部メニューバーのWindow→Show View→Other→Terminalを選択すると、IDEの中央下部のウィンドウにTerminalが表示されるはずです。
 とまぁこの程度しか記載されていない。使い方分かんねぇ。

使用方法

ターミナルビューのOpen a Terminalをクリック。Lanch Terminalというウィンドウが表示されるので、Serial Terminalを選択します。

動作確認

上記に示した通り、IDEにTerminalがあるのででこれを使用して動作確認した買ったのですが、どうも調子が悪い様子。原因は確認中。
 Flash Magicも最近のものはTerminalがついていない様子。テキストに記載されている例はFlash Magicを使用しての方法で説明されているので、一応Fash Magicのバージョンを落としました。私はトランジスタ技術2014年2月号に付属していたCDよりインストールしてTerminalにて確認しました。他の手段としてはTera Term使用するのが一番簡単なん野のではないかと思います。