提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、UART
- 二、2440的uart资源
- 2.1.uart配置流程
- 2.2 RS232
- 2.3 RS232接口
- 三. UART编程实现(无缓存)
- 四. 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的编程流程,加油哦!最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!