当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > 裸机程序开发之UART

裸机程序开发之UART 时间:2018-09-26      来源:未知

Uart原理

发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线上的信号,串行收集然后放在缓冲区中,CPU即可读取UART获得这些数据。UART之间以全双工方式传输数据,精确的连线方法只有3根电线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双发提供参考电平,连线如下:

UART使用标准的TTL/CMOS逻辑电平(0~5v、0~3.3v、0~2.5v或0~1.8v)来表示数据,高电平表示1,低电平表示0。为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOD逻辑电平转换为RS-232逻辑电平,3~12v表示0,-3~-12v表示1

TxD、RxD数据线以位为小单位传输数据,而帧由具有完整意义的、不可分割的若干位组成,它包含开始位、数据位、校验位(需要的话)和停止位。发送数据之前,UART之间要约定好数据的传输速率(即每位所占据的时间,其倒数称为波特率)、数据的传输格式(即有多少个数据位、是否使用校验位、是奇校验还是偶校验、有多少个停止位)。

数据传输流程如下:

(1)平时数据线处于空闲状态(1状态)

(2)当要发送数据时,UART改变TxD数据线的状态(变为0状态)并维持1位的时间,这样接收方检测到开始位后,在等待1.5位的时间就开始一位一位地检测数据线的状态得到所传输的数据。

(3)UART一帧中可以有5、6、7或8位的数据,发送方一位一位地改变数据线的状态将他们发送出去,首先发送低位。

(4)如果使用校验功能,UART在发送完数据后,还要发送1位校验位。有两种校验方法:奇校验、偶校验——数据位连同校验位中,1的数据等于奇数或偶数。

(5)后,发送停止位,数据线恢复到空闲状态(1状态)。停止位的长度有3种:1位、1.5位、2位。

下图演示了UART使用7个数据位、偶校验、2个停止位的格式传输字符‘A’(二进制值为0b1000001)时,TTL/COM逻辑电平和RS-232逻辑电平对应的波形

TTL/COM逻辑电平

RS-232逻辑电平

用途;

Uart连接PC和开发板,输出调试信息

实现功能:

用uart2实现与主机PC的通讯,实现数据的发送接收

用到的是GPA1_0和GPA1_1

参数设置: 波特率: 115200 数据位: 8 校验位: 无 停止位: 1

硬件如何驱动:

1.GPIO GPA1_0 GPA1_1的相关GPIO设置成UART

GPA1CON[0] = 0X2 GPA1_0设置为UART_2_RXD

GPA1CON[1] = 0X2 GPA1_1 设置为UART_2_TXD

2.uart时钟设置

Exynos4412 UART的时钟源有八种选择: XXTI 、XusbXTI 、SCLK_HDMI24M 、SCLK_USBPHY0 、 SCLK_HDMIPHY 、SCLKMPLL_USER_T 、SCLKEPLL 、SCLKVPLL ,由 CLK_SRC_PERIL0 寄存器控制。

选择好时钟源后,还可以通过 DIVUART0 ~4设置分频系数 设置分频系数 ,由 CLK_DIV_PERIL0 寄存器控制。 从分频器得到的时钟被称为SCLK UART 。 SCLK UART 经过上图中的“ UCLK Generator”后,得到UCLK ,它的频率就是UART 的波特率。“ Generator UCLK Generator ”通过这 2个寄存器来设置: UBRDIVn 、UFRACVALn (在下面描述)。

设置波特率 UBRDEVn 、UFRACVALn

SCLK_UART 是100MHZ

我么这里是UART2,所以关于波特率涉及到的寄存器是UBRDEV2和UFRACVAL2

关于波特率和这两个寄存器之间的计算关系,datasheet写的很明白:

根据给定的波特率、所选择时钟源频率,可以通过以下公式计算 UBRDIVn 寄存器 (n 为 0~4,对应 5个 UART 通道 )的值。

UBRDIVn = (int)( UART clock / ( buad rate x 16) ) – 1

上式计算出来的 UBRDIVn 寄存器值不一定是整数, UBRDIVn 寄存器取其整数部分,小部分由 UFRACVALn 寄存器设置, UFRACVALn 寄存器的引入,使产生波特率更加精确。

我们这里 UART clock为100MHz,要求波特率为115200 bps,则:

100000000/(115200 x 16) – 1 = 54.25 – 1 = 53.25

UBRDIVn = 整数部分 = 53

UFRACVALn/16 = 小数部分 = 0.25

UFRACVALn = 4

所以设置寄存器 UBRDIV2 = 53 ,UFRACVAL2 = 4

3.设置uart相关参数

ULCON2[8] 红外线模式还是普通模式 ,我们选择普通模式 0

ULCON2[1:0] 数据位数 这里我们设置为8bit ,0x3

ULCON2[2] 停止位位数, 我们设置为1bit,0x0

ULCON2[5::3] 校验位 我们设置为无 0x0

综上,ULCON2 = 0b11 = 0x03

4.设置uart 收发模式 UCONn

UCON2 [1:0] = 01, 接收 poll模式

UCON2[3:2] = 01, 发送 poll模式

5.关闭发送接收FIFO

UFCON2 [0] = 0 关闭发送接收FIFO

6.没想到(//TODO?????)

#if 0

// disable AFC

UMCON[4] = 0b0

// RTS active

UMCON[0] = 0b1

7.实现发送数据

发送数据

将要发送的8bit数据放入UTXHn寄存器低8位

UTXH2 = txdata

检测数据是否发出完成

检测是否发送完毕,检测寄存器UTRSTAT2的bit 1是否置1,置1表示发送完成。

发送代码:

// write fifo

UTXH[0:7] = data;

// wait finish

while (!(UTRSTAT[1] == 0b1));

8.接收数据

将寄存器URXHn的低8位数据取出来。

但是要等到receive buffer data ready,也即是有数据可读。查看是否有数据可读可以查看寄存器UTRSTAT2的bit 0,置1表示有数据可读。

接收代码:

// wait for data

while (!(UTRSTAT[0] == 0b1));

// read fifo

data = URXH[0:7];

上一篇:什么是"文件表项"

下一篇:Arduino初探

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部