微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S3C2410内置的UART控制器

S3C2410内置的UART控制器

时间:11-21 来源:互联网 点击:

equest to Send :如果在AFC模式下,该位将由UART控制器自动设置;否则的话就必须由用户的软件来控制。
Auto Flow Control :选择是否使能自动流控(AFC)。

图5-16
UTRSTATn (UART TX/RX Status Register)见图5-17
Receive buffer data ready :当接收缓冲寄存器从UART接收端口接收到有效资料时将自动置“1”。反之为“0”则表示缓冲器中没有资料。
Transmit buffer empty :当发送缓冲寄存器中为空,自动置“1”;反之表明缓冲器中正有资料等待发送。
Transmitter empty :当发送缓冲器中已经没有有效资料时,自动置“1”;反之表明尚有资料未发送。

图5-17
UERSTATn (UART Error Status Register)见图5-18
Overrun Error :为“1”,表明发生Overrun错误。
Frame Error :为“1”。表明发生Frame(帧)错误。

图5-18
UFSTATn :(UART FIFO Status Register)见图5-19
Rx FIFO Count :接收FIFO中当前存放的字节数。
 Tx FIFO Count :发送FIFO中当前存放的字节数。
 Rx FIFO Full :为“1“表明接收FIFO已满。
 Tx FIFO Full :为“1“表明发送FIFO已满。

图5-19
UMSTATn :(UART FIFO Status Register)见图5-20
Clear to Send :为“0”表示CTS无效;为“1”表示CTS有效。
Delta CTS :指示自从上次CPU访问该位后,nCTS的状态有无发生改变。
为“0”则说明不曾改变;反之表明nCTS信号已经变化了。

图5-20
UTXHn 和 URXHn 分别是UART发送和接收资料寄存器
这两个寄存器存放着发送和接收的资料,当然只有一个字节8位资料。需要注意的是在发生溢出错误的时候,接收的资料必须要被读出来,否则会引发下次溢出错误

UBRdivn :(UART Baud Rate Divisor Register)见图5-21


图5-21

接着我们通过结合代码来看看具体在程序中怎样来操作UART的流程:

先来看看在C代码中对用到的UART多个寄存器的定义:

#define UART_CTL_BASE 0x50000000 //UART0的寄存器的起始地址也就是ULCON0的地址
#define UART0_CTL_BASE UART_CTL_BASE
#define bUART(x, Nb) __REGl(UART_CTL_BASE + (x)*0x4000 + (Nb)) //因为考虑到UART1与UART0相应的寄存器地址相差0x4000所以这里也考虑到了对UART1和UART2的使用,而上面__REGl的定义:

#define __REG(x) (*(volatile unsigned long *)(x))
#define __REGl(x) __REG(x)
#define bUARTb(x, Nb) __REGb(UART_CTL_BASE + (x)*0x4000 + (Nb)) //#define __REGb(x) (*(volatile unsigned char *)(x))

#define oULCON 0x00
#define oUCON 0x04
#define oUFCON 0x08
#define oUMCON 0x0c
#define oUTRSTAT 0x10
#define oUERSTAT 0x14
#define oUFSTAT 0x18
#define oUMSTAT 0x1c
#define oUTXHL 0x20
#define oUTXHB 0x23
#define oURXHL 0x24
#define oURXHB 0x27
#define oUBRdiv 0x28

#define ULCON0 bUART(0, oULCON)
#define UCON0 bUART(0, oUCON)
#define UFCON0 bUART(0, oUFCON)
#define UMCON0 bUART(0, oUMCON)
#define UTRSTAT0 bUART(0, oUTRSTAT)
#define UERSTAT0 bUART(0, oUERSTAT)
#define UFSTAT0 bUART(0, oUFSTAT)
#define UMSTAT0 bUART(0, oUMSTAT)
#define UTXH0 bUART(0, oUTXHL)
#define URXH0 bUART(0, oURXHL)
#define UBRdiv0 bUART(0, oUBRdiv)

#define UTRSTAT_TX_EMPTY (1 < 2)
#define UTRSTAT_RX_READY (1 < 0)
#define UART_ERR_MASK 0x0f

再来看看真正对UART的操作:

void init_uart(void)
{
ULCON0 = vULCON0; //#define vULCON0 0x03 表示每帧有8个数据位,1个停止位,不进行奇偶校验,正常模式
UCON0 = vUCON0; //#define vUCON0 0x245 表示接收模式和发送模式都是中断或轮询模式,当发生接收异常时,产生接收错误中断,发送中断类型为Level,接收中断类型为Pulse,波特率时钟源为PCLK
UFCON0 = vUFCON0;
UMCON0 = vUMCON0;
UBRdiv0 = 12;
}

void putc(char c)
{
char i;

while (!(UTRSTAT0 & UTRSTAT_TX_EMPTY)) { //不断的查询,直到发送缓冲寄存器和和移位寄存器都不为空,就可以发送数据
;
}

for (i=0; i<10; i++) {
;
}

UTXH0 = c; //直接将要发送的字符赋值给发送寄存器发送出去
}

unsigned char getc(void)
{
while (!(UTRSTAT0 & UTRSTAT_RX_READY)) {
;
}

return URXH0; //直接从接收寄存器中返回接收到的1个字节的数据
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top