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,则一定还会引起中断。
#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,则一定还会引起中断。
s3c2440UART用 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)