s3c2440的UART用法Word格式文档下载.docx
《s3c2440的UART用法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《s3c2440的UART用法Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
另一个很重要的地方就是设置波特率。
s3c2440波特率的时钟源有三个:
PCLK、FCLK/n和UEXTCLK。
时钟源的选择是由UCONn的第10位和第11位来完成的。
波特率的具体计算公式为:
时钟源频率÷
(波特率×
16)-1
这个计算结果很可能是小数,把该小数取最接近的整数,放入寄存器UBRDIVn中就完成了波特率的设置。
如我们选择波特率的时钟源为PCLK,它为50MHz,我们设置的波特率为115.2kHz,通过上式计算的结果为26.13,取整后得到26,那么我们把26放入UBRDIVn中即可。
由于我们没有使用FIFO和MODEM,所以可以不用设置FIFO控制寄存器UFCONn和MODEM控制寄存器UMCONn。
通过以上寄存器的设置,UART就可以正常传输数据。
接收到的数据是放到接收缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中。
由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,所在的地址是不同。
为了了解当前数据传输的各种状态,还需要一些状态寄存器。
传输状态寄存器UTRSTATn非常有用,它的第0位可以用来判断接受缓存器内是否有可接收的数据,第1位和第2位可以用来判断发送缓存器中是否为空,为空时可以发送数据。
由于在这里我们不进行传输数据时错误的判断,因此错误状态寄存器UERSTATn不需要,FIFO状态寄存器UFSTATn和MODEM状态寄存器UMSTATn在这里也不需要。
我们给出UART通信的两种方法:
查询和中断。
为了验证程序,使用任一款的串行通信软件来实现PC和s3c2440之间的通信即可。
首先给出的是查询程序。
它是在主程序的循环体内不断查询UART端口,当有数据来时,就接收数据,并再通过UART发送该数据。
然后根据所接收数据的不同,分别执行不同的内容,如点亮、熄灭LED,蜂鸣器响、或不响。
在这里,我们每次只完成一个字节的传输。
#definerGPBCON(*(volatileunsigned*)0x56000010)//PortBcontrol
#definerGPBDAT(*(volatileunsigned*)0x56000014)//PortBdata
#definerGPBUP(*(volatileunsigned*)0x56000018)//Pull-upcontrolB
#definerGPHCON(*(volatileunsigned*)0x56000070)//PortHcontrol
#definerGPHUP(*(volatileunsigned*)0x56000078)//Pull-upcontrolH
#definerULCON0(*(volatileunsigned*)0x50000000)//UART0Linecontrol
#definerUCON0(*(volatileunsigned*)0x50000004)//UART0Control
#definerUFCON0(*(volatileunsigned*)0x50000008)//UART0FIFOcontrol
#definerUMCON0(*(volatileunsigned*)0x5000000c)//UART0Modemcontrol
#definerUTRSTAT0(*(volatileunsigned*)0x50000010)//UART0Tx/Rxstatus
#definerUERSTAT0(*(volatileunsigned*)0x50000014)//UART0Rxerrorstatus
#definerUFSTAT0(*(volatileunsigned*)0x50000018)//UART0FIFOstatus
#definerUMSTAT0(*(volatileunsigned*)0x5000001c)//UART0Modemstatus
#definerUBRDIV0(*(volatileunsigned*)0x50000028)//UART0Baudratedivisor
//littleendian
#definerUTXH0(*(volatileunsignedchar*)0x50000020)//UART0TransmissionHold
#definerURXH0(*(volatileunsignedchar*)0x50000024)//UART0Receivebuffer
voidMain(void)
{
charch;
rGPBCON=0x015551;
rGPBUP=0x7ff;
rGPBDAT=0x1e0;
rGPHCON=0x00faaa;
//使用UART0功能
rGPHUP=0x7ff;
rULCON0=0x3;
//设置UART0无奇偶校验,一位停止位,8位数据
rUCON0=0x245;
//PCLK为时钟源,接收和发送数据为查询或中断方式
rUFCON0=0;
//
rUMCON0=0;
rUBRDIV0=26;
//设置波特率,PCLK为50MHz,波特率为115.2kHz
while(!
(rUTRSTAT0&
0x2));
//等待并判断发送缓存是否为空
rUTXH0=0xaa;
//是空,则发送0xAA字节
while
(1)
while(!
0x1));
//等待并判断接收缓存是否准备好
ch=rURXH0;
//接收一个字节数据
rUTXH0=ch;
//发送一个字节数据
switch(ch)//根据所接收数据的不同,执行不同的程序
{
case0x11:
//灭LED
rGPBDAT|=0x1e0;
break;
case0x22:
//亮LED
rGPBDAT&
=0x1f;
case0x33:
//蜂鸣器不响
=0x1e0;
case0x44:
//蜂鸣器响
rGPBDAT|=0x1;
default:
//LED灭,蜂鸣器不响
rGPBDAT=0x1e0;
}
}
下面是UART中断程序,它要比查询复杂一些,因为涉及到了中断处理,并且UART发送数据和接收数据是一个中断源。
主程序循环体内不执行任何程序,都在UART中断程序内执行。
当接收到0x55字节数据时,亮两个LED,当接收到其他数据时,发送该字节,并在发送部分执行亮4个LED程序。
#define_ISR_STARTADDRESS0x33ffff00
#definepISR_UART0(*(unsigned*)(_ISR_STARTADDRESS+0x90))
#defineU32unsignedint
#definerGPBUP(*(volatileunsigned*)0x56000018)//Pull-upcontrolB
//#definerGPHDAT(*(volatileunsigned*)0x56000074)//PortHdata
#definerSRCPND(*(volatileunsigned*)0x4a000000)//Interruptrequeststatus
#definerINTMSK(*(volatileunsigned