S3C2440的UART详解

发布者:温雅如风最新更新时间:2015-10-15 来源: eefocus关键字:S3C2440  UART详解 手机看文章 扫描二维码
随时随地手机看文章
1、UART原理简介

在介绍2440的UART控制器之前,我们首先来了解一下UART的原理

UART:Universal Asynchronous Receiver/Transmitter(通用异步收发送器),用来传输串行数据,发送数据时,CPU将并行数据写入UART,UART按照一定格式在TxD线上串行发出;接收数据时,UART检测到RxD线上的信号,将串行收集放到缓冲区中,CPU即可读取UART获得的这些数据。

UART最精简的连线形式只有3根线,TXD用于发送,RXD用于接收,GND用于提供参考电平。UART之间以帧作为数据传输单位,帧由具有完整意义的若干位组成,它包含开始位、数据位、校验位和停止位。发送数据之前,互相通信的UART之间要约定好数据传输速率(波特率的倒数)、数据的传输格式(多少个数据位、是否使用校验位、奇校验还是偶校验、多少个停止位)。
        
2、S3C2440 UART的特性

S3C2440的通用异步收发器(UART)配有3个独立异步串行I/O(SIO)端口,每个都可以通过产生中断或DMA请求来进行CPU和UART之间的数据传输。如图1所示:每个UART包含一个波特率发生器、发送器、接收器和一个控制单元,

 

图1 2440UART方框图(带FIFO)

波特率发生器可以由PCLK、FCLK/n或UEXTCLK(外部输入时钟)时钟驱动。UART通过使用系统时钟可以支持最高115.2Kbps的比特率。如果是使用外部器件提供UEXTCLK的UART,则UART可以运行在更高的速度。发送器和接收器各包含一个64字节的FIFO和数据移位器。要发送数据时,先将数据写入到FIFO接着在发送前复制到发送移位器中,随后将数据从发送数据引脚(TXDn)移出;接收数据时,从接收数据引脚(RXDn)移入收到的数据,接着从移位器复制到FIFO。

 

3、S3C2440 UART的使用

对于S3C2440,使用UART之前,首选需要对2440的UART模块进行初始化,需要设置波特率、传输格式(多少个数据位、是否使用校验位、奇校验或偶校验、多少个停止位、是否使用流量控制)、选择所涉及的管脚为UART功能、选择UART通道的工作模式为中断模式或DMA模式。设置好之后,往相关寄存器写入数据即可发送,读取相关寄存器即可接收到数据,还可以通过查询状态寄存器或设置中断来获知数据是否发送完毕、是否接收到数据。

我用的开发板是天嵌的TQ2440,该开发板用SP3232EEN扩展了一个RS232串口,电路连接如图2 所示:

 

图2 RS232原理图

波特率发生器

每个UART的波特率发生器为发送器和接收器提供串行时钟,波特率发生器的时钟源可以选择S3C2440A的内部时钟系统或者UEXTCLK。波特率时钟是通过16和由UART波特率分频寄存器(UBRDIVn)指定的16位分频系数来分频源时钟(PCLK,FCLK/n或者UEXTCLK)产生的,UBRDIVn由下列表达式确定:

UBRDIVn=(int)(UART时钟/(波特率*16))-1

UART时钟:PCLK,FCLK/n或者UEXTCLK,例如,如果波特率为115200bps并且UART时钟为40MHz,则UBRDIVn为:

UBRDIVn=(int)(40000000/(115200*16))-1=(int)(21.7)-1(取最接近的整数)=22-1=21

 

       介绍发送和接收操作之前,先介绍几个重要的寄存器

UBRDIVn寄存器:设置波特率,S3C2440 UART的时钟源有两种选择:PCLK、UEXTCLK、FCLK/n,其中n的值通过UCON0-UCON2联合设置

ULCONn寄存器:设置传输格式

UCONn寄存器:它用于选择UART时钟源、设置UART中断方式

UFCONn寄存器、UFSTATn寄存器,UFCONn寄存器用于设置是否使用FIFO,设置各FIFO的触发阙值,即发送FIFO中有多少个数据时产生中断、接收FIFO中有多少个数据时产生中断。并可以通过设置UFCONn寄存器来复位各个FIFO。读取UFSTATn寄存器可以知道各个FIFO是否已经满,其中有多少个数据。

UMCONn寄存器、UMSTATn寄存器,这两类寄存器用于流量控制,具体看数据手册
UTRSTATn寄存器,它用来表明数据是否已经发送完毕、是否已经接收到数据

UERSTATn寄存器,用来表示各种错误是否发生

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

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

下面通过实际的代码来理解2440的UART

首选是UART的初始化,TQ2440将UART0引了一个接口出来,就介绍UART0吧

2440的UART引脚是挂接在GPH上的,所以使用UART之前需要先对GPH的引脚功能进行配置。[page]

void uart0_init(void)
{
    GPHCON  |= 0xaa;    // GPH0,GPH1,GPH2,GPH3分别nCTS0,nRTS0,TXD0,RXD0
    GPHUP   = 0x7ff;     //内部上拉被禁止

UFCON0  = 0x00;     // 不使用FIFO
    UMCON0  = 0x00;     // 不使用流控


    ULCON0  = 0x03;     // 8N1(8个数据位,无校验,1个停止位)
    UCON0   = 0x245;    

// 查询方式,UART时钟源为PCLK,中断请求方式为Tx-电平,Rx-脉冲
   rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );   //设置波特率
}

接下来几个是进行数据的发送和接收的函数

//======此函数的作用是向UART发送一个字符,不用FIFO,直接用UART发送

void Uart_SendByte(char data)

{

if(data==' ')

{

while(!(rUTRSTAT0 & 0x2));

取出rUTRSTAT0(UART0发送/接收寄存器)寄存器中的第2位,含义为Transmit buffer是否为空,为1时表示空。在发送缓冲器为空时,再发送

// Delay(1);                 //because the slow response of hyper_terminal

       WrUTXH0(' ');  //将数据写入到UART0发送缓冲器中

}

while(!(rUTRSTAT0 & 0x2));   //Wait until THR is empty.

//  Delay(1);

WrUTXH0(data);

}              

//========发送字符串的函数

void Uart_SendString(char *pt) 

{

    while(*pt)

        Uart_SendByte(*pt++);

}

 

//C语言的可变参数,为了达到printf的功能

//例如:Uart_Printf(“my name is %s”a[10]) ;就相当于Uart_SendString(“my name is XX”);XX是a[10]的内容

void Uart_Printf(char *fmt,...)  

{

       va_list ap;

       char string[256];

 

       va_start(ap,fmt);

       vsprintf(string,fmt,ap);

       Uart_SendString(string);

       va_end(ap);

}

 

//==等待,直到UART的发送器为空,就是发送完毕

void Uart0_TxEmpty()

{

while(!(rUTRSTAT0 & 0x4));  //Wait until Tx shifter is empty.

}

 

//===从终端上获取敲入的字符,返回值为char类型。RdURXH0有数据时,返回URXH的数据。当URXH没有数据时,总是等待,直到有数据。

 

char Uart_Getch(void)

{

while(!(rUTRSTAT0 & 0x1)); //接收缓冲器接收到有效数据

return RdURXH0();   //从UART0接收缓冲器(URXH0)接收数据

}

//===Uart_GetKey 这个与Uart_Getch 不同的是,当URXH没有数据时返回0。有数据时,返回数据,这个函数可以用来查看当前URXH中的值。

char Uart_GetKey(void)

{

if(rUTRSTAT0 & 0x1)    //Receive data ready

return RdURXH0();

else

return 0;

}

//==这个函数用于从终端得到一个字符串,并储存到string中

void Uart_GetString(char *string)

{

    char *string2 = string;

    char c;

    while((c = Uart_Getch())!=' ')//’ ’是回车键

    {

        if(c=='')//’’是backspace按键

        {

            if( (int)string2 < (int)string )

            {

                Uart_Printf(" ");//因为backspace,所以删除最后一个显示的字符

                string--;

            }

        }

        else

        {

            *string++ = c;       //不是回车和退格键,则储存到string中

            Uart_SendByte(c);   //每输入一个字符,都将它输出到终端中

        }

    }

    *string='';

    Uart_SendByte(' ');

}

关键字:S3C2440  UART详解 引用地址:S3C2440的UART详解

上一篇:S3C2440定时器4中断测试程序
下一篇:s3c2440的摄像接口拍照应用

推荐阅读最新更新时间:2024-03-16 14:35

s3c2440硬件篇之九:LCD
背景知识 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S3C2410/2440等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。 2. S3C2440内部LCD控制器结构图: 我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器: a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成; b:R
[单片机]
<font color='red'>s3c2440</font>硬件篇之九:LCD
S3C2440 Boot Loader引导代码功能简述
【前言】开始学习ARM的时候,基本上都要从裸机编程开始。为了减低入门的门槛,很多时候只要修改模板里的主函数main.c,可是,久而久之,就会产生些疑问,问什么下载了这些C代码编译链接生成出来的BIN就能在ARM上跑了呢?原因就在于,有几个文件已经不声不响的帮我们提前干了很多的事,而这些事C语言是干不了的,只能由汇编完成,美其名曰:ARM汇编引导代码。其实不光“裸奔”需要,Boot Loader也同样需要。那么到底这些汇编帮我干了些什么呢?笔者就结合S3C2440的Boot Loader引导代码简单分析整理下。 【一】变量及相关宏定义 开始首先用GET(相当于C语言里的#include)伪指令包含进来了三个头文件option.i
[单片机]
s3c2440裸机-LCD编程(三、框架准备和LCD初始化)
1.准备框架 为了让程序更加好扩展,体现出”高内聚、低耦合 的特点,能够兼容各种不同型号的lcd,假如有两款尺寸大小的lcd,如何快速的在两个lcd上切换? 首先我们抽象出lcd_3.5.c和lcd_4.3.c的共同点,比如都有初始化函数init(),我们可以新建一个lcd.c,然后定义一个结构体: struct lcd_opr{ void (*init)(void); }; 用户不接触lcd_3.5.c和lcd_4.3.c,只需要在lcd.c里通过指针访问对应的结构体的函数,也就调用了不同init(),如下图所示: 我们的目的是在LCD显示屏上画线、画圆(geomentry.c)和写字(font.c)其核心是画点
[单片机]
<font color='red'>s3c2440</font>裸机-LCD编程(三、框架准备和LCD初始化)
代码重定位(S3C2440)
nand启动,需要重定位 S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SDRAM发送命令,但是不能直接给Nand Flash发送命令,CPU无法直接访问Nand Flash,因为之间还隔了个Nand Flash控制器。 问:那为什么还可以nand启动? 答:1.nand启动时,前4k代码由硬件自动复制到SRAM。2.此时SRAM的基地址为0地址,CPU从SRAM的0地址开始运行。 问:那么问题来了,烧录至Nand Flash的bin文件大于4k怎么办? 答:前4k代码需要把整个程序读出,复制到SDRAM。然后去SDRAM执行程序。 把程序从nand读出复制到SDRAM的
[单片机]
代码重定位(<font color='red'>S3C2440</font>)
S3C2440的汇编中常用的位置无关和位置相关指令
看了一段时间的S3C2440的bootloader后,感觉 在bootloder程序中经常会用到B,BL指令。他们是位置无关的代码,指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实现位置无关性。 在bootloder也用到了位置无关的指令LDR(只对PC操作时才位置无关),例如LDR PC, =Main(程序跳转到SDRAM处执行); S3c2440从NandFlash启动时,会将nandflash的前4KB的数据复制到s3c2440中的一个stepstoning中,而stepstoning在NandFlash启动时被映射到0地址处,所以s3c2440
[单片机]
基于S3C2440的ARM9基础程序设计及分析
最近学习了ARM9基础程序的设计,记录下所学心得,希望对初学者提供一些帮助。学习ARM程序要注意方法,先去芯片手册的相应模块部分的结构原理框图,搞清楚所使用的模块的基本原理,然后根据框图搞清楚需要设置哪些对应的寄存器,再根据时序图搞明白相应寄存器应该怎样设置,再接着理清楚你所写程序的大概流程,最后就可以动手写程序了。 如果把流程理清楚了,你的程序基本上已经成功一半了。 我使用的是S3C2440 ARM芯片, 一 LED流水灯程序 流程: 1,设置端口控制寄存器将LED对应端口设为输出模式 (GPxCON)。 2,向端口对应的数据寄存器发送数据(GPxDAT)。 实现: //这段宏定义了使对应LED亮应该送的数据 #
[单片机]
Linux平台上S3C2440的物流配送系统设计
引言      现代的物流系统已经进入了信息化的阶段。信息化配送系统对信息化物流有着重要的影响。物流配送信息化,就是运用现代信息系统与电子化手段加强对企业物流链管理,形成企业物流的支撑体系,进而实现物流配送的高效率与高效益。本文通过嵌入式系统模块与GPS定位技术的融合,加上计算机控制中心,形成一个比较完善的物流配送系统。在物流配送过程中,通过这个系统对整个物流配送过程进行监控与管理。 1 相关核心技术概述 1.1 移动定位技术     目前的移动定位技术已经非常成熟,最主要的有3类:     ①利用卫星进行后方交汇的定位技术,即GPS(Global Positioning System,全球定位系统),是由美国建
[嵌入式]
基于嵌入式和无线收发模块的教学楼节能系统
目前,国内各大高校中,同学们的自觉节能意识薄弱,在教室光线足够亮时也开灯,课上完离开教室后灯还亮着的现象普遍存在;而且,学校节能规划极为欠缺,教室的灯光控制由专门的管理人员手工管理,教室极多,管理人员管理不过来,这样就造成不必要的电能浪费和经济损失。本文将嵌入式技术、新兴的ZIGBEE 无线通信技术和传感器技术相结合设计了教学楼节能控制系统,以便能为学校节能及国家节能做出微薄贡献。 1 教室楼节能系统方案 教学楼智能节能系统按功能分由主控制器、ZigBee无线传输网络、亮度检测三部分组成。其中,主控制器负责接受来自ZIGBEE 网络的数据,并根据数据做出相应的判断和处理;ZIGBEE 无线传输网络负责主控制器和亮度检测部分的通
[单片机]
基于嵌入式和无线收发模块的教学楼节能系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved