S5PV210 UART说明

通用异步收发器缩写UART,这是UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER。它被用来传送串行数据。当发送数据,CPU将并行数据写入UART,UART依照一定的格式在一根电线上串行发出;接收数据 时。UART检測还有一根电线的信号,将串行收集在缓冲区中。CPU就可以读取UART获得这些数据。

在S5PV210中。UART提供了4对独立的异步串口I/Oport,有4个独立的通道,每个通道能够工作于DMA模式或者中断模式。当中,通道0有 256byte的的发送FIFO和256byte的接收FIFO,通道1有64byte的的发送FIFO和64byte的接收FIFO,而通道2和3仅仅有 16byte的的发送FIFO和16byte的接收FIFO。

S5PV210的uart结构图例如以下:

UART使用标准的TTL/CMCOS逻辑电平来表示数据,为了增强数据抗干扰能力和提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平,查看原理图可知Mini210S使用的是MAX3232SOP芯片,使用的是TX0和DX0:



搜索“XuTXD0”,可知:



通过设置UART相关寄存器。我们就能够驱动UART工作,达到发送和接收字符的目的。

样例:

int main()
{
char c;
uart_init(); // 初始化串口
while (1)
{
c = getc (); // 接收一个字符c
putc(c+1); // 发送字符c+1
}
return 0;
}

在main函数中。先会调用uart_init()初始化UART。然后使用getc接收PC发过来的字符,再调用putc()将该字符+1回复给PC。

/*uart.c*/
void uart_init()
{
// 1 配置引脚用于RX/TX功能
GPA0CON = 0x22222222;
GPA1CON = 0x2222;
// 2 设置数据格式等
UFCON0 = 0x1; // 使能FIFO
UMCON0 = 0x0; // 无流控
ULCON0 = 0x3; // 数据位:8, 无校验, 停止位: 1
UCON0 = 0x5; // 时钟:PCLK。禁止中断,使能UART发送、接收 // 3 设置波特率
UBRDIV0 = UART_UBRDIV_VAL; // 35
UDIVSLOT0 = UART_UDIVSLOT_VAL; // 0x1
}

上述代码共同拥有3个步骤。以下我们来一一解说每个步骤:

第一步 配置引脚用于RX/TX功能

參考UART引脚连接图,我们须要设置GPA0CON和GPA1CON寄存器使GPA0和GPA1引脚用于UART功能。



第二步 设置数据格式等

<1> ULCON0用来设置数据格式,见下图

Word Length = 11,8bit的数据;

Number of Stop Bit = 0,1bit的停止位;

Parity Mode = 000,无校验;

Infrared Mode =0,使用普通模式;

所以ULCON0=0x3

<2> 9UCON0是UART的配置寄存器。见下图



Receive Mode = 01 ,使用中断模式或者轮询模式。

Transmit Mode = 01,使用中断模式或者轮询模式。

Send Break Signal = 0。普通传输。

Loop-back Mode = 0,不使用回环方式;

我们採用轮询的方式接受和发送数据,不使用中断,所以bit[6-9]均为0;

Clock Selection = 0。使用PCLK作为UART的工作时钟;

我们不使用DMA,所以bit[16]和bit[20]均为0;

所以UCON0 = 0x5

<3> UFCON0和UMCON0

这两个寄存器比較简单,UFCON0用来使能FIFO,UMCON0用来设置无流控。

第三步 设置波特率

波特率即每秒传输的数据位数。涉及两个寄存器:UBRDIV0和UDIVSLOT0



波特率设置相关公式:UBRDIVn + (num of 1’s in UDIVSLOTn)/16 = (PCLK / (bps x 16)) ?1

当中,由Maximum Operating Frequency for Each Sub-block图可知。UART工作于PSYS下,所以PCLK即PCLK_PSYS = 66.5MHz,我们的波特率bps设置为115200,所以

(66.5MHz/(115200 x 16)) – 1 = 35.08 = UBRDIVn + (num of 1’s in UDIVSLOTn)/16,所以我们设置UBRDIV0=35。UDIVSLOT0=0x1

getc()和putc()的代码例如以下:

// 接收一个字符

char getc(void)

{

while ((UFSTAT0 & 0xff) == 0); // 假设RX FIFO空,等待

return URXH0; // 取数据

}

// 发送一个字符

void putc(char c)

{

while (UFSTAT0 & (1<<24)); // 假设TX FIFO满,等待

UTXH0 = c; // 写数据

}



通 过读UTRSTAT0 发送/接收状态寄存器,当Receive buffer data ready= 1时说明接收到数据,读URXH0寄存器能够得到8bit的数据;当Transmitter empty = 1时说明能够发送数据,写8bit的数据到UTXH0。

完整代码地址:https://github.com/zhouhui321/gec210-nos/tree/master/uart_putchar

版权声明:本文博主原创文章,博客,未经同意不得转载。

ARM裸编程系列---UART的更多相关文章

  1. ARM NEON 编程系列2 - 基本指令集

    ARM NEON 编程系列2 - 基本指令集 前言 本系列博文用于介绍ARM CPU下NEON指令优化. 博文github地址:github 相关代码github地址:github NEON指令集 主 ...

  2. ARM NEON编程系列1-导论

    ARM NEON 编程系列1 - 导论 前言 本系列博文用于介绍ARM CPU下NEON指令优化. 博文github地址:github 相关代码github地址:github NEON历史 ARM处理 ...

  3. 关于在arm裸板编程时使用printf问题的解决方法

    在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不 ...

  4. ARM的体系结构与编程系列博客——ARM处理器系列介绍

    ARM处理器系列介绍 现在到了3月,过年过得过于舒服了.系列博客也停更了近半月,我果然是个慢(lan)性(gui)子,那么趁着到校的第一天晚上,就写一篇博客来继续我的系列博客了!众所周知,ARM处理器 ...

  5. ARM裸板开发:04_MMU 链接地址与运行地址不一致时,(SDRAM)初始化程序地址无关码问题的分析

    ARM裸板开发过程,程序的链接地址设置为为0x30000000,而前期的启动代码以及相关硬件的初始化代码需要在内部iRAM(steppingstone,起始地址0x0)的4K中运行.链接地址与运行地址 ...

  6. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  7. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  8. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  9. 【linux草鞋应用编程系列】_6_ 重定向和VT100编程

    一.文件重定向     我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "hello world&q ...

随机推荐

  1. PNG 文件结构

    PNG图像文件介绍 PNG图像文件格式 PNG是可携式网络图像(portable network graphics)的英文缩写.PNG是从网络上开始发展的,目的是替代GIF和JPG格式,PNG图像文件 ...

  2. Windows phone 8 学习笔记

    Windows phone 8 学习笔记(1) 触控输入  http://www.apkbus.com/android-138547-1-1.html Windows phone 8 学习笔记(2) ...

  3. Servlet过滤器——日志记录过滤器

    1.概述 在实际的项目开发过程中,经常需要在项目运行时,记录并在控制台中输出运行时的日志信息,便于查看项目的运行状况.本实例将介绍如何应用过滤器实现日志记录.运行本实例,将在控制台中输出项目运行时的日 ...

  4. 获取TBitMap图像缓冲区,提高图像处理速度

    使用Dephi进行图像处理可以有多种方法,最常用的应该算是TBitmap,它提供方便的图像存取能力,结合Canvas可进行画线.画圆.图像拷贝等操作.不过在进行大量的图像处理操作时,为了获得更高的速度 ...

  5. Java字符串找出4个字节长度的字符

    不解释,直接上代码:  由于Iteye代码贴四个字节的UTF-8字符出错,特能图的方式发布几个特殊字符:  public class Byte4Check { public static void m ...

  6. vc 加载bmp位图并显示的方法

    方法一.显示位图文件 HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,_T(“xxx.bmp”),Image_Bitmap,0,0,Lr_CreateDibSectio ...

  7. Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...

  8. 基于raw os 的事件触发系统

    Raw os的事件触发系统有以下特点: 1 基于UML的状态机理念设计,实现了有限状态机(fsm)以及层次状态机(HSM). 2 实现了活动对象(ACTIVE OBJECT)的特性,一个活动对象包含了 ...

  9. objective-c 中数据类型之中的一个 几何数据类型(CGPoint,CGSize,CGRect)

    // CGPoint 结构体数据原型, 用于声明一个点: /* Points. */ struct CGPoint { CGFloat x; CGFloat y; }; typedef struct ...

  10. Microsoft JET Database Engine 错误 '80004005'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。