新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > FL2440 UART的用法

FL2440 UART的用法

作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
UART原理說明:

通用異步收發(fā)器簡稱UART,即“Universal Asynchronous Receiver Transmitter”,它用來傳輸串行數(shù)據(jù):發(fā)送數(shù)據(jù)時,CPU將并行數(shù)據(jù)寫入UART,UART按照一定格式在一根電線上串行發(fā)出;接收數(shù)據(jù)時,UART檢測另一根電線上的信號,將串行數(shù)據(jù)放在緩沖區(qū)中,CPU即可讀取UART獲得的數(shù)據(jù)。UART之間以全雙工方式傳輸數(shù)據(jù),最精簡的連線方式只有三根電線:TxD用于發(fā)送數(shù)據(jù),RxD用于接收數(shù)據(jù),Gnd用于給雙方提供參考電平。連線如下圖所示:

本文引用地址:http://m.butianyuan.cn/article/201611/316626.htm
為了增強數(shù)據(jù)的抗干擾能力、提高數(shù)據(jù)傳輸長度,通常將TTL/CMOS邏輯電平轉換為RS-232邏輯電平,3~12V表示0,-3~-12V表示1。S3C2440有3個獨立的UART通道,每個通道都可以工作于中斷、查詢或者DMA模式。
S3C2440UART的使用:
UART使用之前需要設置波特率、數(shù)據(jù)傳輸格式,配置相關管腳為UART功能,選擇工作模式是中斷、查詢還是DMA.。另外,S3C2440中每個UART都有一個深度為64字節(jié)的接收FIFO和發(fā)送FIFO。我們采用的配置方式不使用FIFO模式。
1. 將涉及的UART通道管腳設為UART功能
比如,UART通道0中,GPH2、GPH3分別用作TXD0、RXD0,即要使用UART通道0時,必須先將GPHCON寄存器中GPH2/3配置為TXD0/RXD0。
2. UBRDIVn寄存器:設置波特率
S3C2440的時鐘源有PCLK 、UEXTCLK、FCLK/n,其中n值是通過UCON0~UCON2聯(lián)合設置。
根據(jù)給定的波特率、所選擇的時鐘源頻率,可以通過以下公式計算UBRDIVn寄存器。
UBRDIVn=(int)(UART CLOCK /(BUAD RATE * 16)) - 1
時鐘源選擇PCLK為50MHz,波特率設置為115200赫茲,所以計算出的值為26.13,取整之后為26,即把26存到寄存器UBRDIV0即可。
3. ULCONn:設置傳輸格式
設置數(shù)據(jù)寬度、停止位寬度、檢驗模式、紅外模式。
4. UCONn寄存器
通過該寄存器來設置S3C2440中UART的接收模式、發(fā)送模式、接收中斷方式、發(fā)送中斷方式、時鐘選擇、FCLK分頻系數(shù)(FCLK/n中n的值)等等。
5.UTRSTATn寄存器
UTRSTATn寄存器用來表明數(shù)據(jù)是否發(fā)送完畢,是否已經(jīng)接受到數(shù)據(jù)。第0位可以用來判斷接受緩存器內是否有可接收的數(shù)據(jù),接收到數(shù)據(jù)自動設置為1;第1位和第2位可以用來判斷發(fā)送緩存器中是否為空,為空時可以發(fā)送數(shù)據(jù)。寄存器格式如下:
接收到的數(shù)據(jù)是放到接收緩存器URXHn中,要發(fā)送數(shù)據(jù)時,是把數(shù)據(jù)放入發(fā)送緩存器UTXHn中。由于UART是通過字節(jié)方式傳輸數(shù)據(jù)的,因此要區(qū)分是大端模式還是小端模式,也就是說這兩個寄存器在這兩種模式下,所在的地址是不同。
現(xiàn)在來看一段代碼,這段代碼采用的查詢的方式來使用UART的。每次完成一個字節(jié)的傳輸。

#include "2440addr.h"

void Main(void)

{

char ch;

rGPBCON = 0x155551;

rGPBUP = 0x7ff;

rGPBDAT = 0x560;

rGPHCON = 0x00faaa; /*使用UART0功能 0000 0000 1111 1010 1010 1010 管腳使能*/

rGPHUP = 0x7ff;

rULCON0 = 0x3; /*設置UART0無奇偶校驗,一位停止位,8位數(shù)據(jù) 設定數(shù)據(jù)傳輸格式*/

rUCON0 = 0x245; /*PCLK為時鐘源,接收和發(fā)送數(shù)據(jù)為查詢或中斷方式[4]沒有break信號[7]禁止fifo*/

rUFCON0 = 0;

rUMCON0 = 0;

rUBRDIV0 = 26; /*設置波特率,PCLK為50MHz,波特率為115.2kHz*/

while(!(rUTRSTAT0 & 0x2)); /*等待并判斷發(fā)送緩存是否為空*/

rUTXH0 = 0xaa; /*是空,則發(fā)送0xAA字節(jié)*/

while(1)

{

while(!(rUTRSTAT0 & 0x1)); /*等待并判斷接收緩存是否準備好*/

ch = rURXH0; /*接收一個字節(jié)數(shù)據(jù)*/

while(!(rUTRSTAT0 & 0x2)); /*等待并判斷發(fā)送緩存是否為空*/

rUTXH0 = ch; /*發(fā)送一個字節(jié)數(shù)據(jù)*/

switch(ch) /*根據(jù)所接收數(shù)據(jù)的不同,執(zhí)行不同的程序*/

{

case 0x11: /*滅LED*/

rGPBDAT |= 0x560;
break;

case 0x22: /*亮LED*/

rGPBDAT &= 0x1f;
break;

case 0x33: /*蜂鳴器不響*/

rGPBDAT &= 0x560;
break;

case 0x44: /*蜂鳴器響*/

rGPBDAT |= 0x1;
break;
default: /*LED滅,蜂鳴器不響*/

rGPBDAT = 0x560;
break;

}

}

}

中斷處理方式,UART有子中斷,要注意子中斷屏蔽的打開,由于UART中斷涉及到SUBSRCPND寄存器,因此在中斷處理程序中不僅要清SRCPND寄存器,還要清SUBSRCPND寄存器,它們的順序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否則就會引起一個中斷兩次響應的問題。因為是否中斷由SRCPND寄存器決定,而SRCPND寄存器的相關狀態(tài)位由SUBSRCPND寄存器決定,如果先清SRCPND寄存器,而還沒有清SUBSRCPND寄存器的話,SRCPND寄存器的相關位還是會被置1,而一旦被置1,則一定還會引起中斷。

#include "2440addr.h"

#define U32 unsigned int

void __irq uartISP(void)

{

char ch;

rSUBSRCPND |= 0x3;

rSRCPND = 0x1<<28;

rINTPND = 0x1<<28;

if(rUTRSTAT0 & 1) /*接收數(shù)據(jù)處理部分*/

{

ch = rURXH0; /*接收字節(jié)數(shù)據(jù)*/

if(ch==0x55)

rGPBDAT = ~0x60; /*亮兩個LED,蜂鳴器響*/

else

rUTXH0 = ch; /*發(fā)送字節(jié)數(shù)據(jù)*/

}

else /*發(fā)送數(shù)據(jù)處理部分*/

{

rGPBDAT = ~0x561; /*亮4個LED*/

}

}

void Main(void)

{

rGPBCON = 0x155555;

rGPBUP = 0x7ff;

rGPBDAT = 0x560;

rGPHCON = 0x00faaa;

rGPHUP = 0x7ff;

rULCON0 = 0x3;

rUCON0 = 0x5;

rUFCON0 = 0;

rUMCON0 = 0;

rUBRDIV0 = 26;

rSRCPND = 0x1<<28;

rSUBSRCPND = 0x3;

rINTPND = 0x1<<28;

rINTSUBMSK = ~(0x3); /*打開UART0發(fā)送和接收中斷屏蔽*/

rINTMSK = ~(0x1<<28); /*打開UART0中斷屏蔽*/

pISR_UART0 = (U32)uartISP;

while(1)

{

}

}

在"2440addr.h"里面的關于rUTXH0/rURXH0的定義。arm指令默認小端模式初始化,所以地址是這個。




關鍵詞: FL2440UAR

評論


技術專區(qū)

關閉