通用异步收发器简称UART,即“Universal Asynchronous Receiver Transmitter”,它用来传输串行数据:发送数据时,CPU将并行数据写入UART,UART按照一定格式在一根电线上串行发出;接收数据时,UART检测另一根电线上的信号,将串行数据放在缓冲区中,CPU即可读取UART获得的数据。UART之间以全双工方式传输数据,最精简的连线方式只有三根电线:TxD用于发送数据,RxD用于接收数据,Gnd用于给双方提供参考电平。连线如下图所示:
#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指令默认小端模式初始化,所以地址是这个。
上一篇:S3C2440的LCD简单应用与实现
下一篇:系统时钟和定时器——看门狗定时器
推荐阅读最新更新时间:2024-03-16 15:04