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分别为发送和接收的缓冲寄存器,发送数据和接收到的数据都通过这两个寄存器进行运输;

代码如下:

c 复制代码
#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;
}

测试代码如下:

c 复制代码
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编程实现(中断)

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

c 复制代码
#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的编程流程,加油哦!最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

相关推荐
Komorebi.py33 分钟前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh39 分钟前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
内核程序员kevin4 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
zy张起灵5 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
朝九晚五ฺ8 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream8 小时前
Linux的桌面
linux
xiaozhiwise9 小时前
Makefile 之 自动化变量
linux
意疏11 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu11 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器