S3C2440的串口通信(UART)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


UART是通用异步收发器,它可以用作中断和主机之间的通信,因此得到了极其广泛的应用;

一、UART

uart是异步收发器,按照异步串行通信标准进行数据收发的电路;

异步串行通信标准 :115200(传输波特率)   
								  8(8bit传输) 
								  n(n表示无校验,e表示偶校验,o表示奇校验)
								  1 表示1为停止位
				  闲时为高   低位先发

start +  数据 + 校验 + stop
1位    5-8位    1位    1 、1.5 、2
低             可以无    高

二、2440的uart资源

2.1.uart配置流程

2440 有3个独立的uart

条件:
1. 协议初始化  115200  8  n  1
		ULCONn  8  n  1
 UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
2. 发送和接收数据缓存区
	UTXH  URXH
3. 发送和接收的操作时刻
	UTRSTATn  第1位 发送操作 0 正在发送  1发送完毕  
					    第0位 接收操作 0没有数据  1接收到数据
4. 电路使能  UCON 第3-2位发送使能  1-0位接收使能

2.2 RS232

rs232 异步串行全双工点对点通信协议,完成主机间通信;
电气特性如下:
-3v — -15v 表示1
+3v — +15v 表示0

rs232传输距离需要在15米以内距离短是rs232的缺点之一。实际使用其实就是1m左右;

RS-232还具有的缺点:

(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接(2440用到了max232芯片,将单片机输出的TTL电平转换成PC机能接收的232电平或将PC机输出的232电平转换成单片机能接收的TTL电平。)。
(2)传输速率较低,在异步传输时,波特率为20Kbps;
(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右。

2.3 RS232接口

RS232接口是PC机上串行接口标配,有DB9和DB25两种,通常为DB9;在本期分享中我也正是使用db9来实现串口通信的;下面是rs232的接口定义;
在这里插入图片描述
接下来看一下DB9接口的定义:
在这里插入图片描述
这里主要用到的实际是:2-rx 3-tx 5-gnd

uart有三个中断信号:uart使用中断的方式实现;
rx中断–》接收够数据 超时
tx中断–》发完数据
出错–》接收出错
从图上可知,GPH2和GPH3为UART的发送和接受引脚;
在这里插入图片描述
在这里插入图片描述

三. UART编程实现(无缓存)

这里先给出代码的原理,uart初始化的流程:
(1)配置具有uart功能的口为uart功能;如下图所示:
在这里插入图片描述
(2)设置uart的通信波特率,数据位,校验以及停止位;
UBRDIV0:设置分频倍数,这里设置为115200,结果取整数为26;
在这里插入图片描述
ULCON0:用来控制数据位,校验以及停止位;
UCON0:设置为中断轮询模式,且为pclk工作(50M)
在这里插入图片描述
UTRSTAT0:用来查看缓存区状态;
在这里插入图片描述
URXH0和UTXH0分别为发送和接收的缓冲寄存器,发送数据和接收到的数据都通过这两个寄存器进行运输;
在这里插入图片描述
代码如下:

#include "uart.h"

void uart_init()
{
	//IO 功能
	GPHCON &= ~0xf0;
	GPHCON |= 0xa0;     //设置GPH2/GPH3为 uart功能
	ULCON0 = 0x3; 		//8  n  1
	UBRDIV0 = 26;		//115200
	UCON0 = 0x5;  		//pclk工作 使能电路
}

void send_byte(char info)
{
	while(!(UTRSTAT0&2));  //阻塞等待发送完毕
	UTXH0 = info;		   //uart会自动发送
}

char recv_byte()
{
	char info = -1;
	while(!(UTRSTAT0&1));  //阻塞等待接收完毕
	info = URXH0;
	send_byte(info);	   //回显
	return info;
}

测试代码如下:

int main(void)
{
	char info = 'a';
	led_init();
	uart_init();
	while(1)
	{
		if (info > 'z')
		{
			info = 'a';
			send_byte('\n');
			send_byte('\r');
		}
		send_byte(info);
		delay(0x5ffff);
		info ++;
}

串口打印的现象为a-z的循环输出;

四. UART编程实现(中断)

大家到这里先可以了解一下中断的实现方式,到后续会具体对中断的实现机制做出详细介绍;

#include "uart.h"


void uart_init()
{
	//IO 功能
	GPHCON &= ~0xf0;
	GPHCON |= 0xa0; //设置GPH2/GPH3为 uart功能
	ULCON0 = 0x3; //8  n  1
	UBRDIV0 = 26;//115200
	UCON0 = 0x5;  //pclk工作 使能电路
	INTSUBMSK &= ~0x1; //使能uart0的rx中断
	INTMSK &= ~(1<<28);//使能uart0中断
}

void send_byte(char info)
{
	while(!(UTRSTAT0&2));  //阻塞等待发送完毕
	UTXH0 = info;//uart会自动发送

}


char recv_byte()
{
	char info = -1;
	while(!(UTRSTAT0&1));  //阻塞等待接收完毕
	info = URXH0;
	send_byte(info);
	return info;
}

void puts_(char * info)
{
	while(1)
	{
		if (*info == '\0')
			break;
		send_byte(*info);
		info++;
	}
}

void do_uart()
{
	char info = -1;
	info = URXH0;
	send_byte(info);
	SUBSRCPND |= 1;
	SRCPND |= 1<<28;
	INTPND |= 1<<28;		
}

总结

本期主要分享的是关于S3C2440的UART编程以及UART的硬件相关知识,它是一种非常常用的通信方式,有了这个串口通信方式,在后续学习中就可以对程序进行调试;希望小伙伴们掌握好UART的编程流程,加油哦!最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值