S3C2440的UART通信

发布者:莫愁前路最新更新时间:2019-10-29 来源: 51hei关键字: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)(n=0,1,2)指定的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的引脚功能进行配置。

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=='n')

{

while(!(rUTRSTAT0 & 0x2));

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

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

       WrUTXH0('r');  //将数据写入到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())!='r')//’r’是回车键

    {

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

        {

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

            {

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

                string--;

            }

        }

        else

        {

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

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

        }

    }

    *string='';

    Uart_SendByte('n');

}


关键字:S3C2440  UART通信  控制器 引用地址:S3C2440的UART通信

上一篇:ARM S2C2410A控制5个LED流水灯
下一篇:ARM汇编指令大全详解

推荐阅读最新更新时间:2024-11-08 12:17

基于嵌入式系统的以太网控制器设计
  引言   目前,随着计算机技术、通信技术得飞速发展,使得使得我们通过计算机进行网络互连的同时,许多领域的嵌入式设备如工业控制、数据采集、数控机床和智能仪表等也有接入网络的需求。伴随着信息家电出现,嵌入式设备的网络化必将拥有更广阔的发展前途。在这个过程里,首先要解决的问题使嵌入式设备如何实现网络互连。   基于以太网技术的网络化控制系统NCS(NetworkedControl System)是继现场总线控制了当前通信技术中的以太网及网络技术,很好地统一了底层的控制网络协议,建立了良好的兼容接口,因此成为了当前及后工业控制领域应用和研究的热点。随着以高性能嵌入式微处理器和嵌入式操作系统为核心的嵌入式技术的发展与推广使用,网络节
[单片机]
基于嵌入式系统的以太网<font color='red'>控制器</font>设计
基于16位控制器的汽车车身电子控制系统解决方案
随着汽车车身控制应用复杂性的不断提高,对16位微控制器(MCU)的性能要求也越来越高。以前曾用机械方法控制的门控、座椅调节、车内照明和空调系统现在都改成了电子控制。许多半导体厂商包括摩托罗拉公司所提供的大量专用半导体解决方案使这些新的电子控制应用成为可能。这些新的解决方案不仅提供了必要的控制功能,还提供了旧机械系统所不能提供的高级诊断能力。消费者希望新型汽车中的控制系统能及时对车内发生的任何系统工作故障发出报警信息。 本文主要介绍摩托罗拉公司的MC9S12DP256 16位MCU和若干个外围IC产品,这些产品专为适应汽车系统中常见的恶劣环境而设计,此外,还详细讨论这些产品提供的高级诊断功能。 电源系统 电源系统是任何汽
[单片机]
盘点IIC-China 2008闪存微控制器产品
MCU市场相比较其他IC产品来说,一直是众半导体厂家兵家必争之地,近年来这一领域的热点正逐渐向闪存微控制器转移。在第十三届国际集成电路研讨会暨展览会( IIC -China 2008)深圳站,众多半导体顶尖厂商带来了最新的闪存MCU产品及方案,其中不乏近年来迅速崛起的国内MCU厂家。 走进NEC的展台,一款使用柠檬电池供电的MCU立刻吸引了大家的眼球。据介绍,这款78K0R系列的MCU待机模式电流低至2.5uA,是此次NEC重磅推出的全闪存“All Flash”通用微控制器中的一个系列。NEC的工程师表示,与传统的掩膜ROM微控制器相比,闪存控制器系统开发周期更短。微控制器可以在程序完成前订购,也可以在微控制器安装完成后写入程序
[焦点新闻]
赛普拉斯 TrueTouch® 触摸屏控制器
2012 年 2 月 14 日,北京讯,加州圣何塞讯——赛普拉斯半导体公司(纳斯达克股票代码:CY)日前宣布其单芯片 Gen4 TrueTouch® 控制器可支持 Microsoft® 公司的全新 Windows 8 操作系统。Windows 8 经过精心设计,可为平板电脑、笔记本电脑和台式 PC 用户提供丰富的触摸体验。TrueTouch 控制器可提供业界最佳抗噪性、最快刷新率、最低功耗以及最高精确度。赛普拉斯和 Microsoft 通力合作以确保其产品与 Windows 8 的兼容性,目前已经成为 Microsoft on-boarding 计划中的一员,为 Windows 8 的正式发布做好准备。 Gen4 系列经过彻底
[电源管理]
义隆电子推出符合工业规格的低功耗微控制器
义隆电子股份有限公司日前推出符合工业规格的微控制器(MCU)新品——EM78P159N系列8位MCU,该产品具有低功耗,拥有抗干扰及抗静电的能力,同时操作温度范围可达-45℃~85℃,可以广泛的应用于小家电产品。 EM78P159N的详细规格为1K×13位ROM,48字节RAM,I/O最大可达15个,另提供三种工作模式——IRC、ERC、Crystal三组的中断资源,以及快速的唤醒模式、一组8bit计时/计数器、Watch Dog Timer。为符合客户需求,EM78P159N提供18pin/20 pin, DIP/SOP等多种包装。此外,还有14pin封装,编号为EM78P154N。 义隆电子自2004年起,全面提升8位微控
[新品]
S3C2440-裸机篇-08 | 使用S3C2440操作SDRAM(配置内存控制器
1. 前言 提起SDRAM,大家都会觉得太难了,要编程写出SDRAM的控制时序更是难上加难,对的,没错!一年前我也是这样想的,学习这一节内容的时序觉得非常难,视频看了好几遍不太懂,对于SDRAM的控制原理更是没看懂,一年后回过头来再看视频,茅塞顿开,看不懂的原因是因为:我自己把它想的太难了,其实,它很简单,总共也就5行代码,设置5个寄存器即可。 简单的原因要归功于S3C2440内部的内存控制器,它的作用就是负责向外部扩展的存储类设备提供控制信号,所以当CPU要去访问属于SDRAM时,只需要去访问属于SDRAM的映射地址即可,内存控制器会发出信号,控制时序去和SDRAM打交道,写入数据或者是读出数据。 尽管我们不用手写操作时
[单片机]
S3C2440-裸机篇-08 | 使用<font color='red'>S3C2440</font>操作SDRAM(配置内存<font color='red'>控制器</font>)
内嵌微控制器的无线数据发射器的特性及应用
    摘要: 简要介绍内嵌AVR RISC微控制器的无线数据发射器AT86RF401的功能、内部结构、引脚排列及典型的应用电路。     关键词: 线数据传输 无线发射器 微控制器 概 述 AT86RF401是单片机集成内嵌AVR RISC微控制器的RF无线数据发射器,输出频率范围为250~450MHz,最大输出功率+6dBm,发射率10Kband。芯片内嵌AVR RISC微控制器、2KB(1K×16b)的Flash程序存储器、128B(字节)的可下载的EEPROM数据存储器、128B的RISC SRAM、看门狗定时器、6个通用I/O、在系统可编程。工作电压2.0~
[嵌入式]
新能源汽车控制器详解:VCU、ECU、MCU和电池BMS
新能源汽车中的各种控制器主要包括:整车控制器(VCU)、发动机控制器(ECU)、电机控制器(MCU)和电池管理系统(BMS)。 新能源汽车的三电技术,包括电池、电驱和电控。电池部分阐述了动力电池系统的构成;电驱部分讲解了传动机构、电机和电机控制器的功能; 一、整车控制器(VCU) 1. 功能 1.1 驱动系统控制 1.2 整车能量管理和优化 1.3 整车通信和网络管理 1.4 故障处理与诊断 1.5 汽车状态显示 2. 工作模式 2.1 自检模式 2.2 启动模式 2.3 起步模式 2.4 行驶模式 2.5 制动模式 2.6 停车模式 2.7 故障模式
[汽车电子]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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