tiny4412开发板的串口介绍与操作

2020-03-25来源: eefocus关键字:tiny4412  开发板  串口

UART原理说明:


通用异步收发器简称UART,即"Universal Asynchronous Receiver Transmitter",它用来传输串行数据:发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;接收数据时,UART检测另一根电线上的信号,将串行收集放在缓冲区中,CPU即可读取UART获得这些数据。UART之间以全双工方式传输数据,最精简的连线方法只有三根电线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平,连线如图1所示:

图1. UART连线图


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


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


数据传输流程如下:


(1)平时数据线处于"空闭"状态(1状态)。

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

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

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

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


图2演示了UART使用7个数据位、偶较验、2个停止位的格式传输字符"A"(二进制值为0b1000001)时,TTL/CMOS逻辑电平对应的波形。

图2. TTL/CMOS逻辑电平下,传输"A"时的波形


UART还有其他功能,比如流量控制等,想深入了解的读者请自行查阅相关资料。


Exynos4412的UART特性:


Exynos4412中UART,有4个独立的通道,每个通道都可以工作于中断模式或DMA模式,即UART可以发出中断或DMA请求以便在UART、CPU间传输数据。UART由波特率发生器、发送器、接收器和控制逻辑组成。


使用系统时钟时,Exynos4412的UART波特率可以达到4Mbps。波特率可以通过编程进行控制。


Exynos4412 UART的通道0有256字节的发送FIFO和256字节的接收FIFO;通道1、4有64字节的发送FIFO和64字节的接收FIFO;通道2、3有16字节的发送FIFO和16字节的接收FIFO。发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到"发送移位器"(Transmit Shifter)中,发送移位器将数据一位一位地发送到TxDn数据线上(根据设定的格式,插入开始位、较验位和停止位)。接收数据时,"接收移位器"(Receive Shifter)将RxDn数据线上的数据一位一位接收进来,然后复制到接收FIFO中,CPU即可从中读取数据。


Exynos4412 UART的每个通道支持的停止位有1位、2位,数据位有5、6、7或8位,支持较验功能,另外还有红外发送/接收功能。Exynos4412 UART结构如图3所示:

图3. Exynos4412 UART结构图


Exynos4412 UART的使用:

图4. 设置Serial连接图


如图4所示,我们在使用UART与PC通信的时候,PC端需要设置波特率、数据位、是否使用校验位、有多少个停止位、是否使用流控等。UART是工作在异步模式下,接收器自身实现帧的同步,因此要实现通信,Exynos4412的UART也要作相同的设置,另外还要选择所涉及管脚为UART功能、选择UART通道的工作模式为中断模式或DMA模式。设置好之后,往某个寄存器写入数据即可发送,读取某个寄存器即可得到接收到的数据。在中断模式(查询模式)下,我们一般通过查询状态寄存器或设置中断来获知数据是否已经发送完成、是否已经接收到数据。下面详细讲解上述设置过程。


1.将所涉及的UART通道管脚设为UART功能


比如UART通道0中,GPA0_0、GPA0_1分别用作RXD0、TXD0,要使用UART通道0时,先设置GPA0CON寄存器将GPA0_0、GPA0_1引脚的功能设为RXD0、TXD0。


2.选择UART的时钟源

图5. 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经过图5中的"UCLK Generator"后,得到UCLK,它的频率就是UART的波特率。"UCLK Generator"通过这2个寄存器来设置:UBRDEVn、UFRACVALn(在下面描述)。


表1 CLK_SRC_PERIL0的寄存器格式

由于在iROM的代码中设置了相关时钟的寄存器,我们在试验的使用选择XusbXTI作为时钟源。


表2 CLK_DIV_PERIL0的寄存器格式

3.设置波特率:UBRDIVn寄存器(UART BAUD RATE DIVISOR)、UFRACVALn寄存器


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


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

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


例如,当UART clock为100MHz时,要求波特率为115200bps,则:

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

UBRDIVn = 整数部分 = 53

UFRACVALn/16 = 小数部分 = 0.25

UFRACVALn = 4

4.设置传输格式:ULCONn寄存器(UART LINE CONTROL)


ULCONn寄存器(n为0~4)格式如表3所示。


表3 ULCONn寄存器格式

我们这里设置为,普通模式、无校验位、一帧中有一个停止位和8位的数据位。


UART通道被设为红外模式时,其串行数据的波形与正常模式稍有不同,有兴趣的读者请自行阅读数据手册。


5.设置UART工作模式:UCONn寄存器(UART CONTROL)


Exynos4412的UCONn寄存器格式,如表4所示。


表4 UCONn寄存器格式

我们写程序时使用中断或查询方式。


6.UFCONn寄存器(UART FIFO CONTROL)、UFSTATn寄存器(UART FIFO STATUS)


UFCONn寄存器用于设置是否使用FIFO,设置各FIFO的触发阀值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。并可以通过设置UFCONn寄存器来复位各个FIFO。


读取UFSTATn寄存器可以知道各个FIFO是否已经满、其中有多少个数据。

不使用FIFO时,可以认为FIFO的深度为1,使用FIFO时Exynos4412的FIFO深度最高可达到256。这两类寄存器各位的含义请读者查阅数据手册。


7.UMCONn寄存器(UART MODEM CONTROL)、UMSTATn寄存器(UART MODEM STATUS)


这两类寄存器用于流量控制,这里不介绍。


8.UTRSTATn寄存器(UART TX/RX STATUS)


UTRSTATn寄存器用来表明数据是否已经发送完毕、是否已经接收到数据,格式如下表4所示。下面说的"缓冲区",其实就是图3中的FIFO,不使用FIFO功能时可以认为其深度为1。


表5 UTRSTATn寄存器格式

9.UERSTATn寄存器(UART ERROR STATUS)


用来表示各种错误是否发生,位[0]至位[3]为1时分别表示溢出错误、较验错误、帧错误、检测到"break"信号。读取这个寄存器时,它会自动清0。


需要注意的是,接收数据时如果使用FIFO,则UART内部会使用一个"错误 FIFO"来表明接收FIFO中哪个数据在接收过程中发生了错误。CPU只有在读出这个错误的数据时,才会觉察到发生了错误。要想清除"错误 FIFO",则必须读出错误的数据,并读出UERSTATn寄存器。


10.UTXHn寄存器(UART TRANSMIT BUFFER REGISTER)


CPU将数据写入这个寄存器,UART即会将它保存到缓冲区中,并自动发送出去。


11.URXHn寄存器(UART RECEIVE BUFFER REGISTER)


当UART接收到数据时,CPU读取这个寄存器,即可获得数据。


示例程序详解,主要涉及到三个文件,start.S文件主要设置栈等基本的功能;uart.c文件主要就是初始化串口和定义操作串口用到的函数。main.c文件主要做相关的操作。


start.S文件内容如下:


.text

.global _start

_start:

ldr sp, =0x02027400 //调用C函数之前必须设置栈,栈用于保存运行环境,给局部变量分配空间;

//参考ROM手册P14,我们把栈指向BL2的最上方;

//即:0x02020000(iROM基地址)+5K(iROM代码用)+8K(BL1用)+16K(BL2用)

bl main //跳转到C函数中执行

 

halt: //死循环

b halt

uart.c文件的内容如下,已经在里面做了详细的注释,这里不再做详细的介绍。


//串口0使用的引脚

#define GPA0CON (*(volatile unsigned int *)0x11400000)

//选择时钟源

#define CLK_SRC_PERIL0 (*(volatile unsigned int *)0x1003C250)

//设置uart0的分频系数

#define CLK_DIV_PERIL0 (*(volatile unsigned int *)0x1003C550)

#define UBRDIV0 (*(volatile unsigned int *)0x13800028)

#define UFRACVAL0 (*(volatile unsigned int *)0x1380002C)

#define UFCON0 (*(volatile unsigned int *)0x13800008)

#define ULCON0 (*(volatile unsigned int *)0x13800000)

#define UCON0 (*(volatile unsigned int *)0x13800004)

#define UTXH0 (*(volatile unsigned int *)0x13800020)

#define URXH0 (*(volatile unsigned int *)0x13800024)

#def

[1] [2]
关键字:tiny4412  开发板  串口 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492499.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:tiny4412裸机程序——代码重定位
下一篇:tiny4412开发板icache操作程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

tiny4412内核自带led驱动分析
内核版本:linux-3.5 平台:tiny4412一、关于混杂设备此版本内核led驱动使用的是混杂设备misc,具体misc.c的实现路径:linux-3.5/drivers/char/misc.c这就很大程度简化了我们的驱动代码,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数(共用的注册函数),这说明led设备是作为杂项设备出现在内核中的,在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。二、关于gpio:查找tiny4412
发表于 2020-03-10
tiny4412内核自带led驱动分析
Tiny6410 简单的LED字符设备驱动
首先分析原来:1.查看用户手册led1、led2、led3、led4 连接的分别是 GPK4、GPK5、GPK6、GPK72、查询6410芯片手册下面还需要3个步骤:1、设置GPIO为OUTPUT。   将GPK4、GPK5、GPK6、GPK7设置为输出output=0001   即GPKCON0的19:28都配置为00012、设置GPIO的数据。   将GPKDATA的4:7位赋值为03、设置GPKUP为上拉。   将GPKUP的4:7位设置为103、代码led_driver.c#include <linux/module.h> 
发表于 2020-03-10
Tiny6410 简单的LED字符设备驱动
tiny6410 linux混杂设备 led驱动
#include <linux/miscdevice.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/ioctl.h>#include <linux/cdev.h>#include <linux/device.h>#include <linu
发表于 2020-03-09
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(1)
平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動概述這篇博客以一個簡單的按鍵中斷來演示一下有了設備樹後的中斷的使用,其中涉及到新版kernel的pinctrl和gpio子系統。在tiny4412的底板上有四個key,如下:上圖中,在沒有按鍵的時候,對應的GPIO是被拉高的,當按下鍵的時候,對應的GPIO被拉低,從而產生一個下降沿中斷。有了上面的準備,首先我們需要修改設備樹,添加相應的節點和相關的屬性: 1 diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b
发表于 2020-02-17
基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動平臺tiny4412 ADKLinux-4.4.4u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動我們以控制tiny4412上的LED1和LED2爲例,使用的GPIO是GPM4_0和GPM4_1對應的原理圖如下:datasheet如下:在samsung的pinctrl驅動中加一些調試用的log: 1 diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio
发表于 2020-02-16
Dialog DA14531 SmartBond TINY开发套件,打造低成本物联网系统
专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起备货Dialog Semiconductor的DA14531 SmartBond TINY™开发套件。这是一款用于功率测量和应用开发的全新开发套件,基于DA14531 SmartBond TINY片上系统 (SoC)。该SoC是一款微型超低功耗蓝牙5.1 SoC,具有低功耗、高性价比的特性,可以应用于各种新型物联网 (IoT) 设备,包括不断增长的互联医疗产品市场。 贸泽电子分销Dialog DA14531 SmartBond TINY开发套件的Pro和USB版本。DA14531开发套件Pro版包含一块蓝牙低功耗主板
发表于 2020-02-11
Dialog DA14531 SmartBond TINY开发套件,打造低成本物联网系统
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved