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;
}
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使用するのが一番簡単なん野のではないかと思います。