マイクロコントローラUART LPC2138

第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++);
}

おすすめ

転載: www.cnblogs.com/justin-y-lin/p/12340711.html