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

相关推荐
vip4513 分钟前
Linux 经典面试八股文
linux
大霞上仙5 分钟前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
孤客网络科技工作室1 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
极客小张2 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
AndyFrank3 小时前
mac crontab 不能使用问题简记
linux·运维·macos
筱源源3 小时前
Kafka-linux环境部署
linux·kafka
算法与编程之美3 小时前
文件的写入与读取
linux·运维·服务器
xianwu5434 小时前
反向代理模块
linux·开发语言·网络·git
Amelio_Ming4 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh