历史上的今天
返回首页

历史上的今天

今天是:2025年06月14日(星期六)

2020年06月14日 | s3c2440串口详解

2020-06-14 来源:eefocus

一、UART原理说明

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

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


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


数据传输如下图:

(1)、平时数据线处于“空闲”状态(1状态)

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

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

(4)、如果使用校验功能,UART在发送完数据后,还要发送1个校验位。有两种校验法:奇校验、偶校验(数据位连同校验位中,“1”的数目是奇数还是偶数)。


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


二、S3C2440 UART的特性

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


使用系统时钟时,s3c2440可以达到115.2Kbit/s;s3c2440UART的FIFO深度为64字节。发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到“发送移位器”中,发送移位器将数据一位一位地发送到TxD数据线上(根据设定的格式,插入开始位、校验位、停止位)。接收数据时,“接收移位器”将RxD数据线上的数据一位一位接收进来,然后复制到接收FIFO,CPU即可从中读取数据。


UART结构图

三、s3c2440UART的使用


在使用UART之前需要设置波特率、传输格式(有多少个数据位、是否使用校验位、是奇校验还是偶校验、有多少个停止位、是否使用流量控制);对于s3c2440还要设置相应的管脚位UART功能、选择UART通道工作模式为中断模式还是DMA模式,设置好后,往某个寄存器写入数据即可发送,读取某个寄存器即可得到接收到的数据。可以查询状态寄存器或设置中断来获知数据是否已经发送完毕、是否已经接收完毕。


具体操作方法:


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

比如UART0,GPH2、GPH3分别用作TxD0、RxD0,要使用串口通道0时,先设置GPHCON寄存器将GPH2、GPH3引脚功能设置为TxD0、RxD0。

2、UBRDIVn寄存器:设置波特率

s3c2440UART的时钟源有三种选择:FLCK/n(n值通过UCON0-UCON2联合设置)、UEXTCLK、PCLK。

根据给定的波特率、所选择的的时钟源的频率。可以通过以下公式计算UBRDIVn寄存器(n为0-2)的值,

给出了计算公式、例子及误差计算


3、ULCONn寄存器:设置传输格式

4、UCONn寄存器:串口控制寄存器


UCONn寄存器用来选择UART时钟源、设置UART中断方式等。


n的值有UCON0、UCON1、UCON2这3个寄存器的[15:12]一起来确定。


5、UFCONn寄存器、UFSTATn寄存器

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

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

不适用FIFO时可以认为FIFO深度为1,使用FIFO时s3c2440FIFO深度64。

6、UMOCONn寄存器、UMSTATn寄存器

这两类寄存器用于流量控制。

7、UTRSTATn寄存器

这个寄存器用来表示数据是否已经发送完毕、是否接收完毕。

8、UERSTATn寄存器

用来表示各种错误是否发生。

9、UTXHn寄存器

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

10、URXHn寄存器

当UART接收到数据,CPU读取这个寄存器,就可以获取数据。


四、UART使用程序


serial.h


void uart0_init(void);

void putc(unsigned char c);

unsigned char getc(void);

int isDigit(unsigned char c);

int isLetter(unsigned char c);


serial.c

#include "s3c24xx.h"

#include "serial.h"

 

#define TXD0READY   (1<<2)

#define RXD0READY   (1)

 

#define PCLK            50000000    // init.c中的clock_init函数设置PCLK为50MHz

#define UART_CLK        PCLK        //  UART0的时钟源设为PCLK

#define UART_BAUD_RATE  115200      // 波特率

#define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)

 

/*

 * 初始化UART0

 * 115200,8N1,无流控

 */

void uart0_init(void)

{

    GPHCON  |= 0xa0;    // GPH2,GPH3用作TXD0,RXD0

    GPHUP   = 0x0c;     // GPH2,GPH3内部上拉

 

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

    UCON0   = 0x05;     // 查询方式,UART时钟源为PCLK

    UFCON0  = 0x00;     // 不使用FIFO

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

    UBRDIV0 = UART_BRD; // 波特率为115200

}

 

/*

 * 发送一个字符

 */

void putc(unsigned char c)

{

    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */

    while (!(UTRSTAT0 & TXD0READY));

    

    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */

    UTXH0 = c;

}

 

/*

 * 接收字符

 */

unsigned char getc(void)

{

    /* 等待,直到接收缓冲区中的有数据 */

    while (!(UTRSTAT0 & RXD0READY));

    

    /* 直接读取URXH0寄存器,即可获得接收到的数据 */

    return URXH0;

}

 

/*

 * 判断一个字符是否数字

 */

int isDigit(unsigned char c)

{

    if (c >= '0' && c <= '9')

        return 1;

    else

        return 0;       

}

 

/*

 * 判断一个字符是否英文字母

 */

int isLetter(unsigned char c)

{

    if (c >= 'a' && c <= 'z')

        return 1;

    else if (c >= 'A' && c <= 'Z')

        return 1;       

    else

        return 0;

}

推荐阅读

史海拾趣

EUCHNER公司的发展小趣事

EUCHNER公司一直将质量和服务视为其生命线。公司严格控制产品质量,所有核心部件均自行生产,以确保产品的可靠性和稳定性。同时,公司还注重客户服务体验,为客户提供具有竞争力的价格及优质服务。无论是为大型汽车制造企业还是小型研究机构提供解决方案,公司都坚持与客户紧密合作并倾听他们的需求。通过持续提升质量和服务水平,EUCHNER公司逐渐赢得了客户的信任和忠诚。

Electech Electronics公司的发展小趣事

在快速发展的同时,Electech Electronics也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。此外,Electech Electronics还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了公司的社会责任感,也为公司的长期发展奠定了基础。

FILTRONIC公司的发展小趣事

在快速发展的同时,FILTRONIC始终将品质管理和客户服务放在首位。公司建立了完善的质量管理体系和客户服务体系,从原材料采购、生产制造到产品检测、售后服务等各个环节都严格把关。同时,FILTRONIC还积极倾听客户需求,不断优化产品和服务,以满足客户不断变化的需求。这些努力使得FILTRONIC在客户中树立了良好的口碑和品牌形象。

Benchmarq Microelectronics Inc公司的发展小趣事

Benchmarq Microelectronics Inc的创立源于几位工程师对半导体技术的深刻理解和市场需求的敏锐洞察。他们看到在快速发展的电子行业中,高性能、低功耗的半导体产品具有巨大的市场潜力。于是,他们决定共同创立Benchmarq Microelectronics Inc,致力于研发和生产先进的半导体产品。在创立初期,公司面临着资金短缺、技术挑战和市场竞争等多重困难。然而,通过团队的努力和合作,公司逐渐攻克了技术难关,推出了一系列受到市场欢迎的半导体产品,初步实现了盈利。

集创北方(CHIPONE)公司的发展小趣事

作为一家专注于显示芯片设计的企业,集创北方始终将技术创新作为核心竞争力。从早期的LED驱动芯片到后来的AMOLED驱动芯片,再到国内率先推出的TDDI芯片ICNL9920,集创北方不断推出具有竞争力的产品,满足了市场对于高质量显示芯片的需求。

HOPERF公司的发展小趣事

为了进一步提升生产效率和产品质量,HOPERF在无锡太湖科技园建立了3万平方米的现代化生产基地。该基地引进了德国、美国等地区的先进封装测试生产设备和高精密测试测量仪器,并严格按照ISO9001国际质量认证体系进行生产管理。这种高标准的生产管理流程确保了产品质量的可靠性和稳定性,赢得了国内外客户的广泛认可和信赖。

问答坊 | AI 解惑

IR推出三款新型25V DirectFET MOSFET

国际整流器公司(International Rectifier,简称IR)近日推出三款新型25V DirectFET MOSFET,包括IRF6622控制MOSFET、IRF6628和IRF6629同步MOSFET,主要应用于服务器和电信系统中的嵌入式CPU电源、VRM模块,以及嵌入式DC-DC转换器。 ...…

查看全部问答>

ARM学习之必备-基础教程

ARM学习之必备-基础教程…

查看全部问答>

TI(德州仪器)师姐回复师弟师妹们的问题

又到了一年一度找工作的时候了,这个也许对大家有用: 从西安交大BBS看到的,转过来给大家看一下,不过这个是2009校园招聘的信息,仅供参考~ 各位同学大家好!德州仪器今年的校园招聘开始了! 我毕业于交大电信学院,是去年加入TI的TSA。一年前 ...…

查看全部问答>

DSP电源解决方案

DSP电源解决方案…

查看全部问答>

s3c2440 USBD中断如何产生

s3c2440(s3c2410 s3c2443等也一样) 中断控制里有个INT_USBD中断 正常情况下,USB插入后会产生这个中断,这个中断是判断什么而产生的呢? 看了一下 文档里没有写的很详细的,有了解的人吗? …

查看全部问答>

代码阅读器第一个版本, 请大家试试

代码阅读器第一个版本,   请大家试试 http://code-search.kingofcoder.com/…

查看全部问答>

飞凌的ARM11开发板OK6410支持Android哪个版本?工作稳定吗?

我们打算做个Android的项目,在网上看飞凌的OK6410还不错,有用过的朋友能说一下OK6410支 持Android哪个版本?Android跑的怎么样?…

查看全部问答>

winavr+avrstudio系统怎么加入自己生成的函数库?

winavr+avrstudio系统怎么加入自己生成的函数库?现在只会生成函数库,例如:mylib.a,mylib.h但是把这两个文件的路径加入到项目的属性中,把头文件也包含到主程序中,编译的时候系统找不到库里面的函数。…

查看全部问答>

Quartues 2 仿真teshbench竟然出现了问题

在QUARYUS2 ->TOOL->RUN EDA SIMULATION TOOL 后 运行ModelSim 6.5出现如下报错。希望高手指教。Q385157936For example, ModelSim may display the following error message:# ** Error: (vsim-19) Failed to access library \'work\ ...…

查看全部问答>

将STC51单片机的P0.0口接在高电平上,若让其输出低,还能读到外接的高电平吗?

我看过51 IO口的构造图,觉得若先让其内部置0,则外部不管是什么电平,都将被拉成低电平,读入0。 但是我试验的结果是读入状态与先前IO口得输出无关。为什么呢?…

查看全部问答>