S3C2440A 內(nèi)部集成的UART(通用異步收發(fā)器)單元提供三個獨立的異步串行I/O端口,也就是通常所說的串口。串口是用途廣泛的通訊口,很多工業(yè)現(xiàn)場總線都以串口為基礎(chǔ)。在這里,串口不僅可以用來與外部設(shè)備進行數(shù)據(jù)通訊,還可以用來觀察系統(tǒng)的運行狀況,例如前面已經(jīng)使用過的利用串口終端工具觀察程序運行情況的方法。 S3C2440A 的UART 單元提供三個獨立的異步串行I/O 端口,每個都可以在中
斷或DMA 兩種模式下工作。它們支持的最高波特率為115. 2 kbps。每個UART 通道包含2 個64 位FIFO 分別供接收和發(fā)送使用。
S3C2440A 的UART 具有以下可配置的參數(shù)項目:可編程的波特率,紅外收/發(fā)模式,l 或2 個停止位,5 位、6 位、7 位或8 位數(shù)據(jù)寬度和奇偶校驗位。每個UART模塊包含以下幾個部件:波特率發(fā)生器,發(fā)送器,接收器和控制單元。波特率發(fā)生器可以以PCLK、FCLK或UEXTCLK作為時鐘源。發(fā)送器和接收器包含64字節(jié)的FIFO和移位寄存器。要被發(fā)送的數(shù)據(jù),首先被寫入FIFO,然后被拷貝到發(fā)送移位寄存器中,最后從數(shù)據(jù)輸出端口(TxDn)依次被移位輸出。被接收的數(shù)據(jù)也同樣從數(shù)據(jù)接收端口(RxDn)依次被移位輸入到移位寄存器,然后被拷貝到FIFO中。
這里以uart0簡單介紹它的使用。
ULCON0 用于選擇 模式、校驗、停止位、數(shù)據(jù)位
UCON0 用于使能 發(fā)送、接收
UBRDIV0 設(shè)置uart0波特率,波特率 = PCLK/(UBRDIV0+1) /16
UTRSTAT0 接收和發(fā)送完畢的標志,用于軟件查詢
URXH0 接收數(shù)據(jù)寄存器,存放接收到的數(shù)據(jù)
UTXH0 發(fā)送數(shù)據(jù)寄存器,用于發(fā)送
這是個uart0的簡單收發(fā)程序:
//********************************************************************
#define bps 115200
char ch; void Main(void)
{
int i;
……硬件初始化……
uart0_init();
Uart_Printf(" uart串口實驗\n\n\n");
Uart_Printf(" 請發(fā)送一個字符\n");
while(1)
{
ch=receive_byte();
transmit_string("你剛發(fā)送了:");
transmit_byte(ch);
transmit_byte('\n');
}
} void uart0_init(void)
{
rGPHCON = rGPHCON & ~(0xf<<4) | 2<<4 | 2<<6 ; //GPH2、3 選為 TXD、RXD
rUMCON0 = 0x0; //關(guān)閉控制流功能
rULCON0 = 0<<6 | 0<<3 | 0<<2 | 3; //普通模式、無校驗、1位停止位、8位數(shù)據(jù)位
rUCON0 = 1<<2 | 1; //發(fā)送模式:允許、接收模式:允許
rUBRDIV0=(U32)(PCLK/(bps*16))-1; //設(shè)置波特率,pclk 為ARM 時鐘頻率,bps 為傳輸波特率
} char receive_byte(void) //接收一個字節(jié)
{
while(!(rUTRSTAT0&0x1)); //等待接收到數(shù)據(jù)
return rURXH0&0xff; //返回數(shù)據(jù)
}
void transmit_byte(char data) //發(fā)送一個字節(jié)
{
while(!(rUTRSTAT0 & 0x2)); //等待發(fā)送緩存區(qū)為空
rUTXH0=data; //發(fā)送數(shù)據(jù)
}
void transmit_string(char* p) //發(fā)送一個字符串
{
while(*p != '\0')
transmit_byte(*p++);
}
//*******************************************************************
結(jié)果如圖:

當然也可以用中斷來處理,這里接收用中斷做。
//********************************************************************
#define bps 115200
char ch; void Main(void)
{
int i;
……硬件初始化……
uart0_init();
Uart_Printf(" uart串口實驗\n\n\n");
Uart_Printf(" 請發(fā)送一個字符\n");
while(1); //等待中斷
} void uart0_init(void)
{
rGPHCON = rGPHCON & ~(0xf<<4) | 2<<4 | 2<<6 ; //GPH2、3 選為 TXD、RXD
rUMCON0 = 0x0; //關(guān)閉控制流功能
rULCON0 = 0<<6 | 0<<3 | 0<<2 | 3; //普通模式、無校驗、1位停止位、8位數(shù)據(jù)位
rUCON0 = 1<<2 | 1; //發(fā)送模式:允許、接收模式:允許
rUBRDIV0=(U32)(PCLK/(bps*16))-1; //設(shè)置波特率,pclk 為ARM 時鐘頻率,baud 為傳//輸波特率
rSUBSRCPND = 1; //SUBSRCPND的RXD0位 清0
rSRCPND = 1<<28; //SRCPND的UART0位 清0
rINTPND = 1<<28; //INTPND的UART0位 清0
pISR_UART0 = (U32)receive_int; //申請中斷向量
rINTSUBMSK = rINTSUBMSK & ~(1); //禁止RXD0的屏蔽
rINTMSK = rINTMSK & ~(1<<28); //禁止UART0的屏蔽
} char receive_byte(void) //接收一個字節(jié)
{
while(!(rUTRSTAT0&0x1)); //等待接收到數(shù)據(jù)
return rURXH0&0xff; //返回數(shù)據(jù)
}
void transmit_byte(char data) //發(fā)送一個字節(jié)
{
while(!(rUTRSTAT0 & 0x2)); //等待發(fā)送緩存區(qū)為空
rUTXH0=data; //發(fā)送數(shù)據(jù)
}
void transmit_string(char* p) //發(fā)送一個字符串
{
while(*p != '\0')
transmit_byte(*p++);
}
void receive_int(void) __irq
{
transmit_string("(中斷)你剛發(fā)送了:");
transmit_byte(rURXH0&0xff);
transmit_byte('\n');
rSUBSRCPND = 1; //SUBSRCPND的RXD0位 清0
rSRCPND = 1<<28; //SRCPND的UART0位 清0
rINTPND = 1<<28; //INTPND的UART0位 清0
}
//*******************************************************************
運行正常:

|