LPC1768串口使用


 Lpc1768內置了四個串口通訊模塊,都是異步通訊模塊,其中,串口0/2/3是普通串口通訊,串口1與 UART0/2/3 基本相同,只是增加了一個 Modem 接口和 RS-486/EIA-486 模
式,不支持 IrDA,我們今天以串口0來演示串口的使用.

  首先,使用串口0要打開串口0的時鍾

 

然后要配置相應的輸入輸出IO口為串口通訊功能

 

然后,要控制串口0的時鍾源,1768的大部分外設時鍾都可以選擇從cpu時鍾中進行分頻

 

接着,需要設置串口的通訊位,停止位以及波特率等

 

通過該寄存器能夠設置波特率

 

通過該寄存器可以設置通訊模式

記住,初始化完成之后需要將除數鎖存變為0,使其他人不能隨意修改波特率,接着對串口的fifo進行控制

 

使能相應的中斷

 

然后在系統中使能相應中斷通道,串口就可以用了.

在串口中斷處理程序中,先清除通道中斷掛起,然后清除串口相應掛起,取出數據,就可以了,詳細的代碼示例如下

void DebugSerialInit(u32 baud)

{

    LPC_SC->PCONP |= (1<<3);                //打開UART0功率、時鍾控制位

    LPC_PINCON->PINSEL0 &= ~(0x03<<4);

    LPC_PINCON->PINSEL0 |= (0x01<<4);       //p02 tx0

    LPC_PINCON->PINSEL0 &= ~(0x03<<6);

    LPC_PINCON->PINSEL0 |= (0x01<<6);       //p03 rx0

    LPC_UART0->LCR = 0x83;                  //設置串口數據格式,8位字符長度,1個停止位,無校驗,

                                            //使能訪問除數鎖存器 ,設定波特率

    LPC_SC->PCLKSEL0  &= ~(0x03<<6);        //uart0 pclk = sysclock

    LPC_SC->PCLKSEL0  |= (0x01<<6);         //uart0 pclk = sysclock

   

    LPC_UART0->DLM = ((SystemCoreClock/16)/baud) / 256;     //除數高八位  , 沒有小數情況

    LPC_UART0->DLL = ((SystemCoreClock/16)/baud) % 256;     //除數第八位

   

    LPC_UART0->LCR = 0x03;                  //禁止訪問除數鎖存器,鎖定波特率

 

    LPC_UART0->FCR  = 0x00;                 //禁止FIFO

    NVIC_ClearPendingIRQ(UART0_IRQn);

    NVIC_SetPriority(UART0_IRQn,NVIC_EncodePriority(SYS_NVIC_GROUP,UART0_PreemptPriority,UART0_SubPriority));

    NVIC_EnableIRQ(UART0_IRQn);              /* enable irq in nvic              */

    LPC_UART0->IER = 0x01;                  //使能接收中斷

}

 

串口中斷處理程序如下

 

void UART0_IRQHandler(void)

{

    u8 Res;

    NVIC_ClearPendingIRQ(UART0_IRQn);

    Res = LPC_UART0->RBR;       //讀取接收數據,讀取中斷自動清零  

    DebugSerialSendChar(Res);

}

 

注意一點,在不使用小數寄存器的情況下,115200的的波特率,串口的外設時鍾最好在100M,否則串口的波特率的誤差比較大,容易造成通訊失敗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM