您的位置 首页 解答

FL2440 UART的用法

UART原理说明:通用异步收发器简称UART,即UniversalAsynchronousReceiverTransmitter,它用来传输串行数据:发送数据时,CPU将并…

UART原理阐明:

通用异步收发器简称UART,即“Universal Asynchronous Receiver Transmitter”,它用来传输串行数据:发送数据时,CPU将并行数据写入UART,UART依照必定格局在一根电线上串行宣布;接纳数据时,UART检测另一根电线上的信号,将串行数据放在缓冲区中,CPU即可读取UART取得的数据。UART之间以全双工方法传输数据,最精简的连线方法只要三根电线:TxD用于发送数据,RxD用于接纳数据,Gnd用于给两边供给参阅电平。连线如下图所示:

为了增强数据的抗干扰才能、进步数据传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平,3~12V标明0,-3~-12V标明1。S3C2440有3个独立的UART通道,每个通道都能够作业于中止、查询或许DMA形式。
S3C2440UART的运用:
UART运用之前需求设置波特率、数据传输格局,装备相关管脚为UART功用,挑选作业形式是中止、查询仍是DMA.。别的,S3C2440中每个UART都有一个深度为64字节的接纳FIFO和发送FIFO。咱们选用的装备方法不运用FIFO形式。
1. 将触及的UART通道管脚设为UART功用
比方,UART通道0中,GPH2、GPH3别离用作TXD0、RXD0,即要运用UART通道0时,有必要先将GPHCON寄存器中GPH2/3装备为TXD0/RXD0。
2. UBRDIVn寄存器:设置波特率
S3C2440的时钟源有PCLK 、UEXTCLK、FCLK/n,其间n值是经过UCON0~UCON2联合设置。
依据给定的波特率、所挑选的时钟源频率,能够经过以下公式核算UBRDIVn寄存器。
UBRDIVn=(int)(UART CLOCK /(BUAD RATE * 16)) – 1
时钟源挑选PCLK为50MHz,波特率设置为115200赫兹,所以核算出的值为26.13,取整之后为26,即把26存到寄存器UBRDIV0即可。
3. ULCONn:设置传输格局
设置数据宽度、中止位宽度、查验形式、红外形式。

4. UCONn寄存器
经过该寄存器来设置S3C2440中UART的接纳形式、发送形式、接纳中止方法、发送中止方法、时钟挑选、FCLK分频系数(FCLK/n中n的值)等等。
5.UTRSTATn寄存器
UTRSTATn寄存器用来标明数据是否发送结束,是否现已承受到数据。第0位能够用来判别承受缓存器内是否有可接纳的数据,接纳到数据主动设置为1;第1位和第2位能够用来判别发送缓存器中是否为空,为空时能够发送数据。寄存器格局如下:
接纳到的数据是放到接纳缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中。由于UART是经过字节方法传输数据的,因而要区别是大端形式仍是小端形式,也就是说这两个寄存器在这两种形式下,地点的地址是不同。
现在来看一段代码,这段代码选用的查询的方法来运用UART的。每次完结一个字节的传输。

#include “2440addr.h”

void Main(void)

{

char ch;

rGPBCON = 0x155551;

rGPBUP = 0x7ff;

rGPBDAT = 0x560;

rGPHCON = 0x00faaa; /*运用UART0功用 0000 0000 1111 1010 1010 1010 管脚使能*/

rGPHUP = 0x7ff;

rULCON0 = 0x3; /*设置UART0无奇偶校验,一位中止位,8位数据 设定数据传输格局*/

rUCON0 = 0x245; /*PCLK为时钟源,接纳和发送数据为查询或中止方法[4]没有break信号[7]制止fifo*/

rUFCON0 = 0;

rUMCON0 = 0;

rUBRDIV0 = 26; /*设置波特率,PCLK为50MHz,波特率为115.2kHz*/

while(!(rUTRSTAT0 & 0x2)); /*等候并判别发送缓存是否为空*/

rUTXH0 = 0xaa; /*是空,则发送0xAA字节*/

while(1)

{

while(!(rUTRSTAT0 & 0x1)); /*等候并判别接纳缓存是否准备好*/

ch = rURXH0; /*接纳一个字节数据*/

while(!(rUTRSTAT0 & 0x2)); /*等候并判别发送缓存是否为空*/

rUTXH0 = ch; /*发送一个字节数据*/

switch(ch) /*依据所接纳数据的不同,履行不同的程序*/

{

case 0x11: /*灭LED*/

rGPBDAT |= 0x560;
break;

case 0x22: /*亮LED*/

rGPBDAT &= 0x1f;
break;

case 0x33: /*蜂鸣器不响*/

rGPBDAT &= 0x560;
break;

case 0x44: /*蜂鸣器响*/

rGPBDAT |= 0x1;
break;
default: /*LED灭,蜂鸣器不响*/

rGPBDAT = 0x560;
break;

}

}

}

中止处理方法,UART有子中止,要注意子中止屏蔽的翻开,由于UART中止触及到SUBSRCPND寄存器,因而在中止处理程序中不只要清SRCPND寄存器,还要清SUBSRCPND寄存器,它们的次序必定是先清SUBSRCPND寄存器,再清SRCPND寄存器,不然就会引起一个中止两次呼应的问题。由于是否中止由SRCPND寄存器决议,而SRCPND寄存器的相关状况位由SUBSRCPND寄存器决议,假如先清SRCPND寄存器,而还没有清SUBSRCPND寄存器的话,SRCPND寄存器的相关位仍是会被置1,而一旦被置1,则必定还会引起中止。

#include “2440addr.h”

#define U32 unsigned int

void __irq uartISP(void)

{

char ch;

rSUBSRCPND |= 0x3;

rSRCPND = 0x1<<28;

rINTPND = 0x1<<28;

if(rUTRSTAT0 & 1) /*接纳数据处理部分*/

{

ch = rURXH0; /*接纳字节数据*/

if(ch==0x55)

rGPBDAT = ~0x60; /*亮两个LED,蜂鸣器响*/

else

rUTXH0 = ch; /*发送字节数据*/

}

else /*发送数据处理部分*/

{

rGPBDAT = ~0x561; /*亮4个LED*/

}

}

void Main(void)

{

rGPBCON = 0x155555;

rGPBUP = 0x7ff;

rGPBDAT = 0x560;

rGPHCON = 0x00faaa;

rGPHUP = 0x7ff;

rULCON0 = 0x3;

rUCON0 = 0x5;

rUFCON0 = 0;

rUMCON0 = 0;

rUBRDIV0 = 26;

rSRCPND = 0x1<<28;

rSUBSRCPND = 0x3;

rINTPND = 0x1<<28;

rINTSUBMSK = ~(0x3); /*翻开UART0发送和接纳中止屏蔽*/

rINTMSK = ~(0x1<<28); /*翻开UART0中止屏蔽*/

pISR_UART0 = (U32)uartISP;

while(1)

{

}

}

在"2440addr.h"里边的关于rUTXH0/rURXH0的界说。arm指令默许小端形式初始化,所以地址是这个。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/274429.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部