第VII章UART
導入された機能
LPC2138 UARTマイクロコントローラは、各コントローラは、UART受信・送信FIFO(16各バイト)を有し、二つのコントローラを有し、RX FIFOは1/4/8/14バイトを受信したときに割り込みが設けられていてもよいトリガー。
UARTコントローラは、基準クロックPCLKです。
UARTコントローラ原理
概略的な内部UARTコントローラから分かるように、UARTは、コントローラ割り込み主部分(U0IER&U0IIR)、フレームコントロール(U0LCR)、ボーレート設定(U0FDR&U0DLL&U0DLM)によって構成され、FIFO構成(U0FCR)いくつかの部分(U0THR&U0RBR)を送受信します。
彼らは、UARTの初期化、U0FDR、値U0DLL、U0DLM PCLKは、第1の周波数とボーレートによって算出し、コンフィギュレーションデータU0LCRフレームフォーマット(例えば、8個のデータビット、1ストップビット、パリティなしに職務を実行しますビット)、次に()トリガー割り込みを受信したバイト数を含む操作のFIFOモードを設定し、最後U0FCRによって割り込みを可能にします。読み取りと書き込みの機能や割り込みサービス機能の実現もあります。
次のようにボーレートが計算されます。
UARTプロトコル
UARTプロトコルは、私の前の書き込みのブログを参照してください。
デバッグUARTシリアルポートのインスタンス
#include <lpc213x.h> #include "serial.h" #define CR 0x0D void serial1_isr(void) __irq { /* The U1IIR must be read in order to ** clear the interrupt prior to exiting the ** Interrupt Service Routine. */ if ((U1IIR & 0x0E) == 0x04) { /* Receive Interrupt */ sendchar(U1RBR); } if (U1LSR & 0x20) { /* Transmit Interrupt */ } } void serial_init(void) { /* configure P0.8~9 as TXD1 & RXD1 */ PINSEL0 &= 0xFFF0FFFF; PINSEL0 |= 0x00050000; /* 8bits, no Parity, 1 Stop bit */ U1LCR = 0x83; /* 9600 bauds while PCLK is 30MHz */ U1DLL = 0xC3; U1DLM = 0x00; U1FDR = 0x10; /* DLAB = 0 */ U1LCR = 0x03; /* Reset & Enable FIFO, configure Rx FIFO trigger level 0 (1 character) */ U1FCR = 0x07; /* Enable RDA & THRE Interrupts */ U1IER = 0x03; /* UART1 ISR */ VICVectCntl1 = 0x20 | 7; VICVectAddr1 = (unsigned int)serial1_isr; VICIntEnable = 0x80; } int sendchar(char ch) { if ('\n' == ch) { while (!(U1LSR & 0x20)); U1THR = CR; } while (!(U1LSR & 0x20)); return (U1THR = ch); } void sendhex(char hex) { int i = 0; char half[2] = {0}; half[0] = hex >> 4; half[1] = hex & 0x0F; sendstr("0x"); for (i = 0; i < 2; i++) { if (half[i] > 9) sendchar('A' + (half[i] - 10)); else sendchar('0' + half[i]); } } void sendstr(char *p) { while (*p) sendchar(*p++); }