S3C2440的UART详解2440

article/2025/11/9 1:38:15

转载出处:http://www.cnblogs.com/idle_man/archive/2010/12/19/1910548.html

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、S3C 2440UART的特性

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的引脚功能进行配置。

void uart0_init(void)
{GPHCON  |= 0xaa;    // GPH0,GPH1,GPH2,GPH3分别nCTS0,nRTS0,TXD0,RXD0GPHUP   = 0x7ff;     //内部上拉被禁止
UFCON0  = 0x00;     // 不使用FIFOUMCON0  = 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_terminalWrUTXH0('\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='\0';Uart_SendByte('\n');
}








http://chatgpt.dhexx.cn/article/kpjOD8xQ.shtml

相关文章

《Linux驱动:s3c2440 lcd 驱动分析--终结篇》

文章目录 一&#xff0c;前言二&#xff0c;LCD原理和硬件分析2.1 LCD原理解析2.2 硬件电路2.2.1 LCD背光电路2.2.2 LCD屏2.2.3 S3c2440主控 三&#xff0c;LCD应用平台总线-设备-驱动模型3.1 lcd 设备的加载和注册3.2 lcd 驱动的加载和注册3.2.1 编译进内核&#xff0c;加载驱…

JZ2440ARM裸机学习笔记

第1节 eop常见问题 1、未连接op/eop到电脑 2、有其他程序在使用op/eop&#xff08;同一时间只能有一个程序使用它&#xff09; 3、JTAG线未接 4、开发板未上电 5、oflash xxx.bin 时当前文件夹下没有xxx.bin 6、烧写完后没有正确设置启动开关 7、烧写完后&#xff0c;op…

裸机系列——2440时钟

自己的总结&#xff1a; 1.2440 有俩个PLL &#xff0c;UPLL 和MPLL 。UPLL 用于USB 时钟UCLK &#xff0c;MPLL 对应FCLK .HCLK 、PCLK 。ARM 启动时直接使用外部晶振作为CPU 时钟&#xff0c;对应2440 为12Mhz 。只有在设置了时钟寄存器M P S 三个值&#xff0c;具体的寄…

【mini2440】S3C2440的串口

1. 基本电路 2. 相关寄存器 2.1 引脚 2.2 框图 2.3 串口 3. 相关代码 S3C2440A 中的时钟控制逻辑可以产生必须的时钟信号&#xff0c;包括 CPU 的 FCLK&#xff0c;AHB 总线外设的 HCLK 以及 APB 总线外设的 PCLK。S3C2440A 包含两个锁相环&#xff08;PLL&#xff09;&#…

mdk+2440

目前仍然有许多人在使用ADS1.2编译ARM9的程序&#xff0c;这款编译器实属经典&#xff0c;但是已经多年停止更新、维护了。这篇文章主要讲解ARM公司受够Keil之后力推的一款编译器MDK。 MDK的使用上和ADS1.2有很多相似之处&#xff0c;从ADS1.2过渡到MDK也是非常容易的一种事情。…

2440 时钟设置

首先需要知道时钟的概念&#xff1a; 1、是用来同步系统信号; 就举例来说&#xff1a; 如果你cpu用i2c传输一个数据给从机设备&#xff0c;那么你传输数据时从设备怎么知道数据有没有到达&#xff0c;多久检测一次数据线&#xff1f;&#xff1f;这个就需要时钟同步&#xff0c…

FL2440开发板简介及其烧录

目录 FL2440开发板简介 FL2440开发板 FL2440硬件资源列表 开发板存储系统&#xff1a; FL2440开发板烧录 FL2440烧录流程&#xff1a; 烧录准备工作 烧录文件: 硬件准备&#xff1a; 烧录过程 J-link操作&#xff1a; u-boot下烧录&#xff1a; 开发板启动流程&…

大数据分析平台和工具,主要有哪些?

1.Disco Disco最初由诺基亚开发&#xff0c;这是一种分布式计算框架&#xff0c;与Hadoop一样&#xff0c;它也基于MapReduce。它包括一种分布式文件系统以及支持数十亿个键和值的数据库。 支持的操作系统&#xff1a;Linux和OSX。 2.HPCC 作为Hadoop之外的一种选择&#x…

大数据分析平台的搭建方式有哪些

随着大数据时代的到来&#xff0c;数据价值的概念逐渐深入人心&#xff0c;许多企业开始搭建自己的大数据分析平台&#xff0c;以便在数据洪流中把握行业未来的发展方向。做任何事情之前&#xff0c;首先要设定目标和思路&#xff0c;然后根据确定的目标、思路和实际情况制定可…

目前大数据技术平台有很多,主要可以分为哪几类?

大数据的处理过程可以分为大数据采集、存储、结构化处理、隐私保护、挖掘、结果展示(发布)等&#xff0c;各种领域的大数据应用一般都会涉及到这些基本过程&#xff0c;但不同应用可能会有所侧重。对于互联网大数据而言&#xff0c;由于其具有独特完整的大数据特点&#xff0c;…

有哪些好的数据来源或者大数据平台?

分享下我自己平时收集的..共100多个O_O 网站分析类&#xff1a; 百度指数 - 以百度海量网民行为数据为基础的数据分享平台 Google趋势 - 了解 Google中热度上升的搜索 360指数 - 基于360搜索的大数据分享平台 Alexa - 网站排名 Google Analytics - Google出品&#xff0c;可…

大数据平台的软件有哪些?

查询引擎 一、Phoenix 简介&#xff1a;这是一个Java中间层&#xff0c;可以让开发者在Apache HBase上执行SQL查询。Phoenix完全使用Java编写&#xff0c;代码位于GitHub上&#xff0c;并且提供了一个客户端可嵌入的JDBC驱动。 Phoenix查询引擎会将SQL查询转换为一个或多个H…

[BigData]16家大数据分析平台

&#xfeff;&#xfeff; 对今天的企业来说&#xff0c;数据分析已经成为生死攸关的选择。我们分析一些著名的供应商&#xff0c;从Hadoop创业者到传统的数据库市场参与者。 革命 – 这个词汇十分准确地描述了我们所处的这个数据分析的时代。企业一方面紧紧握住大量不同类型的…

大数据网站汇总(数据搜集、大数据竞赛、)

一. 国家级大数据平台 1.1 国家大数据平台&#xff1a; 数据_中国政府网 (www.gov.cn) 1.2 司法大数据平台&#xff1a;中国司法大数据服务网 (court.gov.cn) 1.3 中国经济社会大数据研究平台&#xff1a;中国经济社会大数据研究平台 (cnki.net) 1.4 中国知网CNKI-总库&a…

linux cat命令的作用,Linux命令cat使用详解

cat命令功能&#xff1a; cat命令主要用来实现查看文件、创建文件、及合并、追加文件内容等功能。 cat命令主要参数&#xff1a; -n 或 –number&#xff1a;对输出文档的行数进行编号&#xff0c;从1开始。 -b 或 –number-nonblank&#xff1a;和 -n 功能相似&#xff0c;不同…

Windows 中使用 Linux 命令

如果要在 Windows 中运行 Linux 命令&#xff0c;那么 Cygwin 是一个推荐的工具。Cygwin 创建于 1995 年&#xff0c;旨在提供一个原生运行于 Windows 中的 POSIX 兼容环境。Cygwin 是由 Red Hat 员工和许多其他志愿者维护的自由开源软件。 二十年来&#xff0c;Windows 用户使…

设置 linux 命令别名

前言&#xff1a; 在操作 linux 的时候可能会碰到一些非常长的命令&#xff0c;这个命令平时用的比较频繁&#xff0c;每次输入执行感觉非常麻烦有木有。如果把一段长的命令设置成一个短的别名&#xff0c;是不是很方便&#xff1f; 1. alias 命令引入 找台 linux 机器执行一…

Linux命令之-telnet

使用telnet测试端口连通性 telnet命令是TELNET协议的用户接口&#xff0c;它支持两种模式&#xff1a;命令模式和会话模式&#xff0c;虽然telnet支持许多命令&#xff0c;但大部分情况下&#xff0c;我们只是使用它查看目标主机是否打开了某端口&#xff08;默认是23&#xf…

Linux 命令执行流程

今天继续给大家介绍Linux基础知识&#xff0c;本文主要内容是Linux命令执行的流程&#xff0c;不仅介绍了当我们键入一个Linux命令时系统的执行流程&#xff0c;还介绍了Linux系统中内部命令与外部命令的区别、PATH环境变量的作用等等。 Linux的命令执行流程如下&#xff1a; 1…

Linux命令之sync

概述 sync 命令可以强制将内存中的文件缓冲写入磁盘&#xff0c;更新块信息。 在 linux/unix 系统中&#xff0c;在文件或数据处理过程中一般先放到内存缓冲区中&#xff0c;等到适当的时候再写入磁盘&#xff0c;以提高系统的运行效率。这样虽然可以提高磁盘写入数据的效率&a…