UART

概念

通用异步收发器简称UART( Universal Asynchronous Receiver and Transmitter),它用来传输串行数据。UART之间以全双工方式传输数据,最精简的连接方式只有3根线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平。
在这里插入图片描述
UART使用标准的TTL/CMOS逻辑电平(0-3.3V,0-5V等)来表示数据,高电平表示1,低电平表示0。对于远距离传输,通常转换为RS-232电平,3-12V表示0,-3 - -12V表示1。

TxD和RxD数据线以“位”为最小单位传输数据。帧具有完整意义的、不可分割的若干位组成,它包括:开始位,数据位,校验位和停止位。发送数据之前,UART之间要约好数据的传输速率(即每位所占据的时间,其倒数为波特率),数据的传输格式(即有多少个数据位、是否使用校验位,多少个停止位等)。
常用的传输格式为:115200,8n1
在这里插入图片描述
数据传输流程:
1 平时数据线处于“空闲状态”(1状态)
2.当要发送数据时,改变TxD数据线的状态(变为0)并维持1位的时间,这样接收方检测到开始位后,在等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。
3.UART一帧中可以有5-8个位的数据,发送方一位一位的改变数据线的状态将它们发送出去,首先发送最低位MSB
4.如果使用校验功能,UART在发送完数据位后,还要发送1个检验位。两种校验方法:奇校验和偶校验-数据位连同检验位中1的数目等于奇数或偶数。
5.最后发送停止位,数据线恢复到“空闲”状态(1状态)。停止位长度有1位、1.5位、2位。

s3c2440有3条独立的通道,每个通道都可以工作于 中断模式或DMA模式,即UART可以发出中断(数据发送完可以中断)或 DMA请求 以便在UART和CPU之间传输数据。

寄存器

GPH2,GPH3引脚设为TXD0,RXD0;
UBRDIVn:设置波特率,选择时钟源(PCLK,UEXTCLK,FCLK/n)。
ULCONn(UART LINE CONTROL):设置传输格式,8n1。
UCONn(UART CONTROL):选择时钟源(PCLK,UEXTCLK,FCLK/n),中断方式(中断/查询,DMA请求)等。
UFCON,UFSTAT(FIFO):设置各FIFO的触发阈值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。
UMCON,UMSTAT(MODEM):流控
UTRSTATn:用来表示数据是否已经发送完毕、是否已经接收到数据。
UTXHn:数据写入该寄存器,uart会将它保存到缓冲区并自动发送。
URXHn:接收到数据时,读取这个寄存器。

程序

/* 115200,8n1 */
void uart0_init(){
	/* 设置引脚用于串口 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));
	GPHCON |= ((2<<4) | (2<<6));
	GPHUP &= ~((1<<2) | (1<<3));  /* 使能内部上拉 */
	
	/* 设置波特率 */
	/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
	 *  UART clock = 50M
	 *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26 */
	UCON0 = 0x00000005;  /* PCLK,中断/查询模式 */
	UBRDIV0 = 26;

	/* 设置数据格式 */
	ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */
}

int putchar(int c){
	/* UTRSTAT0   UTXH0 */
	while (!(UTRSTAT0 & (1<<2)));	//等待,直到发送缓冲区中的数据已经全部发送出去
	UTXH0 = (unsigned char)c;	//发送数据
}

int getchar(void){
	while (!(UTRSTAT0 & (1<<0)));	//等待,直到接收缓冲区中有数据
	return URXH0;	//返回数据
}

int puts(const char *s){
	while (*s){
		putchar(*s);
		s++;
	}
}
int main(void){
	unsigned char c;	
	uart0_init();
	puts("Hello, world!\n\r");	
	while(1)	{
		c = getchar();
		if (c == '\r'){
			putchar('\n');
		}
		if (c == '\n'){
			putchar('\r');
		}
		putchar(c);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值