UART原理阐明:
通用异步收发器简称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指令默许小端形式初始化,所以地址是这个。