ARM中断方式串口编程
RxFIFO中的所有字节并复位指针逻辑。该位自动清零。
l第2位:表示Tx FIFO的复位。
置1:会清零UART0 TxFIFO中的所有字节并复位指针逻辑。改位自动清零。
l第[5:3]位:保留位,用户不能对其进行操作。从保留位读出的值未被定义。
l第[7:6]位:表示Rx触发选择
00:触发点为0(默认为1字节)
01:触发点为1(默认为4字节)
10:触发点为2(默认为8字节)
11:触发点为3(默认为14字节)
注:这两个位决定在激活中断之前,接收UART0 FIFO必须写入个字符。
(2)U0IER(中断使能寄存器)
A作用:U0IER用于使能4个UART0中断源
B长度:8位寄存器
C每一位的含义:
l第0位:表示RBR中断使能
置1:使能RDA中断
置0:禁止RDA中断
注:U0IEER第零位使能UART0接收数据可用中断。它还控制(CTI)字符接收超时中断。
l第1位:表示THRE中断使能
置1:使能THRE中断
置0:禁止THRE中断
l第2位:表示Rx线状态中断使能
置1:使能Rx线状态中断
置0:禁止RX线状态中断
注:U0IER第二位使能UART0 Rx线状态中断。该中断的状态可从U0LSR[4:1]读出
l第[7:3]位:是保留位
注:用户不能向其写入1.
4>串口初始化程序:
*
*作者:tiger-john
*时间:2011年1月18日
*名称:UART0_Init
*功能:UART0初始化通讯波特率115200,8位数据位,1位停止位,无奇偶校验
*接收FIFO触发点为8字节,使能RDR(接收数据)中断
*入口参数:bps串口波特率
*出口参数:无
/
voidUART0_Init(uint32 bps)
{
uint16Fdiv;
PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;//设置UART0的引脚
U0LCR = 0x83;//置为除数锁存位,进行配置
Fdiv = (Fpclk>>4)/bps;
U0DLM = Fp>>8;
U0DLL = Fdiv%256;
U0LCR = 0x03;//清除除数锁存位,并设置工作模式
U0FCR = 0x81;//使能FIFO,并设置触发点为8字节
U0IER = 0x01;//允许RBR中断,即接收中断
}
5.中断初始化
先来看一下UART0和VIC之间的关系:
1>中断初始化流程:
l选择中断为向量中断或快速中断
l分配中断通道
l设置UART0向量地址
l使能UART0中断
2>关于ARM中断编程方法和寄存器的使用在此不做涉及(如果想知道的话,可以看这篇文章http://blog.csdn.net/tigerjb/archive/2010/11/30/6045409.aspx
3>中断初始化程序:
/
*作者:tiger-john
*时间:2011年1月18日
*名称:Interrupt_Init
*功能:初始化串口中断,给串口中断选择为向量中断,分配向量通道号1给串口
*入口参数:无
*出口参数:无
/
void Interrupt_Init (void)
{
VICIntSelect = 0x00000000;//设置所有通道为IRQ中断
VICVectCntl1 = (0x20 | 6);// UART0中断通道分配到IRQ slot 1
VICVectAddr1 = (uint32)UART0_Exception; //设置UART0向量地址
VICIntEnable = 1 < 6;//使能串口中断
}
6.用中断编写接收函数
1>中断服务函数流程
l清除串口中断标识寄存器(U0IIR)
l清除中断标志
l读取接收FIFO中的数据
2>中断函数服务函数中需要配置的寄存器
(1)U0IIR中断标识寄存器。
l第0位:表示中断挂起
置1:表示没有挂起的中断
置0:表示至少有一个中断挂起
l第[3:1]位:中断标识,这三位表示了对应UART0 Rx FIFO的中断。
001:表示发送中断(THRE)
010:表示接收数据可用中断(RDA)
011:表示接收线状态中断(RLS)
110:表示字符超时中断(CTI)
l第[7:4]:是保留位
注:
1.U0IIR提供的状态码可用于指示一个挂起中断的中断源和优先级。
2.在访问U0IIR过程中,中断被冻结
3.如果在访问U0IIR时,产生了中断,该中断被记录。在下次访问U0IIR时可以读出,避免中断的丢失。
3>中断服务函数程序:
/* *名称:IRQ_UART0()
*功能:串口UART0中断接收8个字节的数据
*入口参数:无
*出口参数:无
/
uint8rcv_buf[8];// UART0数据接收缓冲区
void__irq IRQ_UART0(void)
{uint8i;
uint32 data;
data = U0IIR;//清除中断表示寄存器标志
VICVectAddr = 0;//清除中断
for(i=0; i<8; i++)
{
rcv_buf[i] = U0RBR;//读取FIFO的数据
}
}
7.看一个总程序:
view plaincopy to clipboardprint?
- /Copyright(c)
- 西安邮电学院
- graduateschool
- XNMS实验室
- Author:冀博
- Time:2011年1月20日
- http://blog.csdn.net/tigerjb
- --------------FileInfo-------------------------------------------------------------------------------
- Filename:UART0_while
- LastmodifiedDate:2011-01-20
- LastVersion:1.0
- Descriptions:通过上位机给串口发送8字节数据,ARM2200接收到串口数据后,把数据又发送回上位机
- ------------------------------------------------------------------------------------------------------*/
- /
- Modifiedby:TIGER0-JOHN
- Modifieddate:2011-1-21
- Version:2.0
- Descriptions:测试成功
- 在用中断的时候在Startup.S文件中的InitStack子
ARM中断方式串口编 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)