历史上的今天
返回首页

历史上的今天

今天是:2024年09月06日(星期五)

正在发生

2019年09月06日 | S3C2410 通用异步收发UART 串口通信

2019-09-06 来源:eefocus

一、UART原理说明


通用异步收发器简称UART,用来传输串行数据。


发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出。


接收数据时,CPU检测另一根电线上的信号,讲串行收集放在缓冲区中,CPU即可读取UART获得这些数据。


UART之间通过全双工方式传输数据,最简单只有三根线TxD(发送数据),RxD(接收数据),GnD(双方参考电平),连线如下图所示。

(PS:单工、半双工、全双工 

单工数据传输只支持数据在一个方向上传输;

半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;


全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力)


硬件连接图如下:

UART使用标准的TTL/CMOS逻辑电平(0~5V 、0~3V、 0~2.5V 或 0~1.8V)来表示数据 ,高电平表示1,低电平表示0。


为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平(3~12V表示0,-3~-12V表示1)。


其中, MAX3232为电平转换芯片, 利用双电荷泵在3.0V至5.5V电源供电时能够实现真正的RS-232性能,将ARM处理器芯片输出的


电压转换为符合RS232规范的串口电压。 即TXD0引脚经MAX3232芯片电压转换后成为串口引脚RS232TXD0, RXD0引脚经


MAX3232芯片电压转换后成为串口引脚RS232RXD0。


TXD 和RXD以”位“为最小传输数据,一帧数据由不可分割的若干位组成,它包含开始位、数据位、校验位(可选)和停止位。


二、UART的使用


发送数据之前,UART之间要约定好数据的传输速度(每位所占的时间,即波特率),数据的传输格式(有多少数据位、是否使用校验位、


是奇校验还是偶校验、有几位停止位、是否使用流量控制)。


对于S3C2410和S3C2440,还有选择所涉及管脚为UART功能,选择UART通道的工作模式为中断或者DMA模式。设置好之后,往某个寄存器写入数据即可发送,读取某个寄存器即可得到接收到的数据。可以通过查询状态寄存器或者设置中断来获知数据是否已经发送完毕。是否已经收到数据。


所用的寄存器如下:


1、设置涉及管脚为UART功能


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


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


4、UCON寄存器:设置时钟源、中断方式等


5、UFCONn寄存器、UFSTATn寄存器:FIFO设置


6、UMCONn寄存器、UMSTATn寄存器:流量控制


7、UTRSTATn寄存器:数据是否发送完毕、是否收到数据


8、UERSTATn寄存器:错误是否发生


9、UTXHn寄存器:数据写入,然后自动放入缓存区,然后发送。


10、URXHn寄存器:收到数据时,读该寄存器即可得到数据。


PS:详细的寄存器信息去芯片手册查找。


三、UART操作实例


目的:


在PC机上通过键盘敲入任意字符,ARM将接受到的字符通过串口发出并在PC端的secureCRT上显示。


开发板通过串口输出字符串。

代码详解:


本实例串口参数设置如下:


使用串口0,三线连接,波特率115200,PCLK为50MHZ,一位起始位,八位数据位,没有校验位,一位停止位,不使用FIFO缓存,普通轮询模式,不使用中断。




1、UART初始化


#define GPHCON *(volatile unsigned int *)0x56000070

#define ULCON0 *(volatile unsigned int *)0x50000000

#define UCON0 *(volatile unsigned int *)0x50000004

#define UTRSTAT0 *(volatile unsigned int *)0x50000010

#define UTXH0 *(volatile unsigned int *)0x50000020

#define URXH0 *(volatile unsigned int *)0x50000024

#define UBRDIV0 *(volatile unsigned int *)0x50000028

 

#define TXD0READY   (1<<2)

#define RXD0READY   1

 

#define GPH_URAT 10<<4

#define GPH_MSK 15<<4

 

void uart_init(void)

{

GPHCON=(~GPH_MSK)&GPHCON;         //GPH2 3位清零

GPHCON=GPH_URAT|GPHCON;   //GPH2 3赋值设为TXD0和RXD0

 

UBRDIV0=0x1A; //设置波特率为115200

 ULCON0=0x03;//设置8数据位,1停止位,无校验位UCON0=0x05;//设置为普通轮询}



2、发送字符函数

本实例不使用FIFO,发送字符前需要先判断上一个字符是否已经被发送出去。如果没有,则不断查询UTRSTAT0寄存器的位[2],当他为1时表示已经发送完毕。这时可向UTXH0寄存器中写入要发送的字符。

void uart_txd(char c) //发送字符

{

while(! (UTRSTAT0&TXD0READY));    //等待,直到发送缓冲区中的数据已经全部发出去

UTXH0=c;   //写入欲发送的字符,UART自动发送

}



3、发送字符串函数


void uart_txd(char *c) //发送字符串

{

 

 

    for (; *c != ''; c++)

    {

    while(!(UTRSTAT0 & TXD0READY));     //不断查询,直到可以发送数据

        UTXH0 = *c ;                        //发送数据

    }

 

 

}


4、接收字符函数

读取数据之前,要先查询UTRSTAT0寄存器的[1]位,当为1的时候,表示接收缓存区中有数据。于是,即可读取URXH0得到数据。

char uart_rxd(void)//接收字符

{

while(! (UTRSTAT0&RXD0READY));      //等待,直到接收缓存区中有数据来到

return URXH0;     //直接读取URXH0,即可获得数据

}


5、主函数

int main(void)

{

uart_init();  //初始化(波特率115200,8N1)

/*        S3C2440可以,但2410乱码

**                                     

char ch[]="===========nrhello word!nr===========nr";      //    /n为换行   /r为跳到行首

char c;

int j;

for(j=0;j<39;j++)    //显示字符串

{

uart_txd(ch[j]);         

}

**

*/

uart_txd("===========nrhello word!nr===========nr");    //显示字符串

 

while(1)                          //串口接收数据后,再发送到PC secureCRT

{

c=uart_rxd();

uart_txd(c);

}

 

return 0;

}


推荐阅读

史海拾趣

Esterline Power Systems公司的发展小趣事

Esterline Power Systems深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了完善的培训体系,为员工提供多元化的培训和发展机会。同时,公司还注重营造良好的企业文化氛围,鼓励员工积极参与团队合作和创新实践。这些举措不仅提高了员工的专业技能和综合素质,也增强了公司的凝聚力和竞争力。

FCT Electronics公司的发展小趣事

随着电子产品的日益复杂化,FCT Electronics意识到技术创新是保持竞争力的关键。公司投入大量资源进行研发,成功开发出一系列高性能的测试设备。其中,一款多功能集成电路测试系统因其高效、稳定、可靠的特点,被众多电子制造商所采纳,为FCT Electronics赢得了极高的声誉。

Hoffman_Enclosures__Inc.公司的发展小趣事

1945年,一位名叫Harry Hoffman的年轻人凭借对工厂安全的深刻关注,发明了压力机安全保护装置。这一装置能够在操作人员的手处于危险区域时迅速停止机器,有效保护了工人的安全。这一创新不仅为Hoffman公司奠定了技术基础,也标志着公司正式步入工业电气机柜和温控产品的研发与制造领域。Harry Hoffman的这项发明不仅解决了当时工厂安全的一大难题,也为公司后续的发展奠定了坚实的基础。

台湾肯尼威(CANNYWELL)公司的发展小趣事

面对不断变化的市场需求和技术环境,肯尼威始终坚持以创新为引领。公司不断投入研发资源,推出了一系列具有创新性的产品。例如,针对特殊需求的客户,公司推出了定制化的电源滤波器解决方案;同时,还开发了新型的三相电源滤波器等产品,满足了市场的多样化需求。这些创新不仅提升了公司的技术实力,也为公司赢得了更多的市场份额。

Galaxy Semi-Conductor Co Ltd公司的发展小趣事

山西飞虹光电科技集团有限公司原以煤炭、洗煤和焦化等生产为主,但在响应山西省委、省政府转型跨越发展的号召下,公司于2010年向高科技产业基地转型。在临汾·甘亭新型工业园区投资16.5亿元建设了“山西陆合飞虹光电科技园”,专注于研发和生产化合物半导体外延片、芯片以及大功率半导体激光器等高科技产品。飞虹光电科技集团通过技术创新,在大功率激光外延片、芯片及LED红、蓝、紫光材料等方面填补了山西省的多项空白,并荣获多项国内外专利及科技奖项。

CETC公司的发展小趣事

CETC自成立以来,一直致力于电子科技领域的研发创新。在某次关键技术的攻关中,CETC的科研团队经过数月的艰苦努力,成功突破了某型雷达的核心技术,使我国在该领域达到了国际先进水平。这一成果的取得不仅提升了CETC的技术实力,也为公司在国内外市场赢得了良好的声誉,为公司的后续发展奠定了坚实基础。

问答坊 | AI 解惑

傅立叶变换的物理意义

  傅立叶变换(F.T.)对每个电子工程师来说应该都不陌生,但我们不应该只是记住一个 的公式,其背后的物理意义才是掌握和自如运用各种变换的核心。         寒假前老师把我们叫过去给了个入门讲座。他特地 ...…

查看全部问答>

西门子S7-200仿真软件贡献

西门子S7-200仿真软件给大家学习!…

查看全部问答>

wince 注册表中哪里可以更改系统时间?

我想在wince 注册表中设置系统时间并且生成NK,这样档NK重新烧写后,显示为设置的值,而不是一个随机的值。 请问什么键可以更改系统时间?…

查看全部问答>

谁能给我发个netsvwrap.msi安装包 谢谢 微软已经不提供下载了 急用 38572681@163.com

谁能给我发个netsvwrap.msi安装包 谢谢 微软已经不提供下载了 急用 38572681@163.com…

查看全部问答>

现今 嵌入式开发中C代码确实比C++ 代码有明显或较大的效率上的优势么 ?

嵌入式开发中C代码确实比C++ 代码有明显或较大的效率上的优势么 ? 硬件发展的今天 两者之间的区别究竟多大呢? 真的不用C++么? 谢谢!…

查看全部问答>

[求救]SOT23封装的型号查询

高手麻烦赐教,我有几个SOT23封装的管子,不知道型号是什么的,我把这几个管子的光刻发上来,麻烦有谁知道的回复,谢谢了WZE、WZS、WZP、3VW、WTZ、9EW、3NW这7个管子我量不像是三极管,倒是像稳压管 本文来自电子工程师之家:http://www.eehome.cn/ ...…

查看全部问答>

请大家帮我看看定时器的程序

我想用STM32F103ZE的TIM2定时器做基本的定时器用,产生4ms左右的中断。定时器的初始化程序如下: void TIM2_Configuration(void) {   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;   /* Time base con ...…

查看全部问答>

串口0中的 TXD RXD 连在一起可以通讯吗?

串口0中的 TXD RXD 连在一起可以通讯吗? 现在碰到一个问题:单片机通过串口与外部进行通讯,但是外部器件的发送接收端是用一个IO口的,所以,单片机中的TXD RXD脚要连在一起,发送数据的时候通过 TXD发出,接收数据的时候通过RXD接收,这样可以吗 ...…

查看全部问答>

用t1作为中断写的程序,但运行不了,why?

想编写一个p1.1输出方波为100ms(t1做中断)的程序,用汇编我调试好了,但是c却没反应!不知道哪里出错了    #include<reg51.h> sbit p0=P1^0;void main() {    TMOD=0X10; TH1=0X3C; TL1=0XB0 ...…

查看全部问答>

串口发送中断打开后就不停的循环中断,必须软件设置终止,是吗

串口发送中断打开后就不停的循环中断,必须软件设置终止,是吗…

查看全部问答>