微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c2440的UART用法

s3c2440的UART用法

时间:11-19 来源:互联网 点击:
equest status
#define rINTMSK(*(volatile unsigned *)0x4a000008)//Interrupt mask control
#define rINTPND(*(volatile unsigned *)0x4a000010)//Interrupt request status
#define rSUBSRCPND(*(volatile unsigned *)0x4a000018)//Sub source pending
#define rINTSUBMSK(*(volatile unsigned *)0x4a00001c)//Interrupt sub mask

void __irq uartISP(void)
{
char ch;

rSUBSRCPND |= 0x3;
rSRCPND = 0x1<28;
rINTPND = 0x1<28;

if(rUTRSTAT0 & 1)//接收数据处理部分
{
ch = rURXH0;//接收字节数据
if(ch==0x55)
rGPBDAT = ~0x61;//亮两个LED
else
rUTXH0 = ch;//发送字节数据
}
else//发送数据处理部分
{
rGPBDAT = ~0x1e1;//亮4个LED
}
}

void Main(void)
{

rGPBCON = 0x015551;
rGPBUP= 0x7ff;
rGPBDAT = 0x1e0;

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)
{

}
}

最后还要强调几点关于非FIFO模式下UART中断的一些注意事项:
1.对于s3c2440来说,接收数据是被动的,发送数据是主动的,因此一般来说,接收数据用中断方式,发送数据用查询方式较好;
2.在中断方式下,当接收到数据时,尽管可能该数据无用,但也一定要读取它,否则下次再接收数据时,不会再引起中断,因为接收数据缓存器被上次接收到的数据所霸占,只要没有读取它,它就永远在那里;
3.由于UART中断涉及到SUBSRCPND寄存器,因此在中断处理程序中不仅要清SRCPND寄存器,还要清SUBSRCPND寄存器,它们的顺序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否则就会引起一个中断两次响应的问题。因为是否中断由SRCPND寄存器决定,而SRCPND寄存器的相关状态位由SUBSRCPND寄存器决定,如果先清SRCPND寄存器,而还没有清SUBSRCPND寄存器的话,SRCPND寄存器的相关位还是会被置1,而一旦被置1,则一定还会引起中断。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top