历史上的今天
返回首页

历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | S3C2440的UART通信

2019-10-29 来源:51hei

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');

}


推荐阅读

史海拾趣

Galaxy ( Bel )公司的发展小趣事

风华邦科(FH-BK)公司发展的五个故事

故事一:技术创新引领发展

风华邦科自成立以来,便致力于技术创新与研发。公司于2019年引进了当时国内先进的一体成型电感生产设备,实现了全流程生产线,生产效率显著提升。此后,公司继续加大技术投入,2021年更是引进了5条全自动生产线,日均产量达到100万个电感器。这些技术革新不仅提高了生产效率,还确保了产品的高精度和高可靠性,使风华邦科在电子元器件细分市场上占据了领先地位。

故事二:国际化布局与专利突破

风华邦科在科技创新的道路上不断前行,不仅在国内市场取得显著成绩,还积极向国际市场拓展。公司注重知识产权的全球布局,已获得多项国外授权发明专利,包括在韩国和日本获得的关于掺杂钙钛矿锡酸钡材料及其制备方法的专利。这些国际专利的获得,标志着风华邦科在高端材料研发方面取得了重要突破,也为公司进一步开拓国际市场奠定了坚实基础。

故事三:产学研合作推动产业升级

风华邦科深知,单凭自身力量难以实现跨越式发展。因此,公司积极与高校及科研机构开展产学研合作,共同攻克技术难题。近年来,公司与清华大学、华中科技大学等高校开展了多项科研课题,涉及电子元器件的新材料、新工艺等多个领域。这些合作不仅提升了公司的技术研发能力,还促进了科技成果的转化与应用,推动了公司的产业升级与转型。

故事四:军品配套与质量管理

风华邦科在军用电子元器件领域也取得了显著成绩。公司始终坚持“安邦兴国、科技领先”的企业宗旨,不断加强技术创新和质量管理工作。公司通过了多项军工质量管理体系认证和保密资格认证,并列入总装备部《军用电子元器件科研生产单位目录》。公司现拥有七条完整的产品生产线,能够为用户提供电子元器件的一站式采购服务,产品广泛应用于航天、航空、船舶等军工领域。

故事五:环保生产与社会责任

在快速发展的同时,风华邦科始终不忘履行社会责任。公司积极响应国家环保政策,践行绿色生产理念。通过引入现代化自动化生产线、制定双碳实施方案、推广绿色工艺新技术等措施,公司有效降低了生产过程中的能耗和碳排放量。此外,公司还积极参与社会公益活动,为地方经济发展和社会进步贡献了自己的力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实基础。

雅特力(Artery)公司的发展小趣事

雅特力深知人才是企业发展的核心力量。因此,公司始终重视人才培养和团队建设。雅特力通过招聘优秀的专业人才、开展内部培训、设立激励机制等方式,打造了一支高素质、高效率的团队。这支团队不仅具备丰富的技术知识和实践经验,还具备高度的创新意识和团队协作能力。正是有了这样一支优秀的团队,雅特力才能够在激烈的市场竞争中脱颖而出,实现持续稳健的发展。

Dytran Instruments Inc公司的发展小趣事

尽管已经被收购并进行了业务整合,但Dytran并没有停止其创新的步伐。公司继续加大研发投入,推动传感器技术的不断创新和升级。同时,Dytran还积极探索新的应用领域和市场空间,以满足不断变化的客户需求。

在未来,Dytran将继续致力于为客户提供高质量、高性能的传感器产品和解决方案。同时,公司还将积极参与国际竞争和合作,推动传感器技术的国际化和标准化进程。通过不断创新和发展,Dytran有望在电子行业中继续保持其领先地位并实现更加辉煌的未来。

以上五个故事框架概述了Dytran Instruments Inc.公司在电子行业中的发展历程、技术创新、市场拓展、被收购与业务整合以及未来展望等方面的重要事件和里程碑。这些故事展示了Dytran如何凭借其技术实力和市场洞察力在竞争激烈的电子行业中脱颖而出并实现持续发展。

Abbatron公司的发展小趣事

随着技术的不断成熟和市场的不断扩大,Abbatron公司开始将目光投向国际市场。公司积极参与国际电子展会,与海外企业建立联系,逐渐打开了国际市场的大门。通过不断的市场拓展和国际化战略,Abbatron公司的品牌影响力逐渐提升,成为了国际电子市场上的一股重要力量。

ATC [American Technical Ceramics]公司的发展小趣事

随着全球经济的日益一体化,国际合作成为许多公司拓展市场的重要途径。假设ATC在某次国际技术交流会上与一家欧洲知名电子企业达成了合作协议,双方共同开发了一款新型陶瓷电容器。这款电容器不仅性能卓越,而且成本相对较低,因此在全球市场上受到了广泛的欢迎。通过这次合作,ATC不仅提升了自身的技术实力,也进一步拓展了海外市场。

Analytic Instruments Corp公司的发展小趣事

随着技术的不断成熟和产品线的不断丰富,Analytic Instruments Corp开始积极拓展市场。公司通过与行业内的知名企业和研究机构建立合作关系,成功地将产品打入多个重要的应用领域。同时,公司还加大了品牌宣传力度,通过参加行业展会、举办技术研讨会等方式,提升了品牌知名度和影响力。

问答坊 | AI 解惑

关于STM32定时器,无法关闭自动重载的问题

今天调试STM32定时器的时候,初始化完定时器再打开,就发现它不停的延时-中断,可我只是想让它中断一次啊,以后我用它的时候再开启,请大家帮忙分析一下我的代码,谢谢! int main(void) {   RCC_Config();//RCC   NVIC_I ...…

查看全部问答>

设备重启后更改的系统配置和文件丢失

我的wince的设备,安装了软件后,如果Windows目录下,重启后就丢失了 还有设置的系统配置也是,重启后就无效了,需要重新配置 似乎所有的文件变化和配置都恢复到原来的了 不是只有硬启动才恢复出厂设置吗 为什么会这样呢 我的机子是有一个开机 ...…

查看全部问答>

【SQL Server CE2.0】link错误

重开一帖,相关的帖子是: http://topic.eeworld.net/u/20090307/08/000b153c-b1d5-4ab3-bad9-239ed1c00805.html 请问SQL CE 2.0下的例子:Samples\\eVC\\eVCReplRdaHPC,怎么可以在ARMV4I下编译成功? 这个工程本身只支持SHx系列的CPU,也可 ...…

查看全部问答>

寻深圳 wince 兼职开发人员

寻深圳 wince 兼职开发人员 条件:1、有wince项目开发经验,精通 wince 平台下的应用程序开发。       2、工作内容:windows PC软件向wince移植。       3、开发人员必须在深圳。 详细工作内容,开发 ...…

查看全部问答>

汽车电池电压表电路采用了LED

http://www.songzhige.com/post/1890.html汽车电池电压表电路采用了LED电路说明这是一个非常有用的电路上安装时,你的车给你汽车电池的电压在LED点阵显示form.The电路是基于四个比较LM324.The的四运放反相输入IC的,留在参考电压5.6V,5.2V,4.8V, ...…

查看全部问答>

关于CMD里的OBJ及LIB问题

最近在看CKFA的CMD,其中 MEMORY{PAGE 0:    /* Program Memory */           /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */    ...…

查看全部问答>

【贡献闲置】书和芯片

一本EDA技术及应用(VHDL) 在学校二手书店买的 七成新,可是因为学了verilog 这本书也没用了   51系列单片机  :   2片AT89C52 (DIP  一块全新,一块8成新) 430系列单片机:   2片430F1121A( 贴片&n ...…

查看全部问答>

SPI通讯问题

我用两块S12XS的单片机,把SPI连接起来,做通讯用,一块作为主设备,一块作为从设备,连接起来通讯的时候,为什么在让主设备在BDM的调试下能够正常通讯,而用BDM供电,或者电源供电的时侯SPI都不能正常的通讯,连SCK时钟都没了。从设备用BDM调试的 ...…

查看全部问答>

心电应用指南

最近业余时间在看这发面的内容,看到了ECG和EEG的指南,提供了从模拟到数字整条信号链的器件支持以及解决方案,非常好的资料。第二个资料则介绍了利用ucos做心电,相似的资料,合并到一块,方便大家查阅。…

查看全部问答>

解决linux新手最常见的一些问题

跟我来,我们一切来探讨和解决几个新手的常见问题:     1. 消除XWindows下的死机现象     我们可以用两个常用的方法来消除这种现象:     第一,用键盘上的复合键“Ctrl+Alt+Backspace”来关闭当前正在运行的 ...…

查看全部问答>