微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM中断方式串口编程

ARM中断方式串口编程

时间:11-09 来源:互联网 点击:

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?

  1. /Copyright(c)
  2. 西安邮电学院
  3. graduateschool
  4. XNMS实验室
  5. Author:冀博
  6. Time:2011年1月20日
  7. http://blog.csdn.net/tigerjb
  8. --------------FileInfo-------------------------------------------------------------------------------
  9. Filename:UART0_while
  10. LastmodifiedDate:2011-01-20
  11. LastVersion:1.0
  12. Descriptions:通过上位机给串口发送8字节数据,ARM2200接收到串口数据后,把数据又发送回上位机
  13. ------------------------------------------------------------------------------------------------------*/
  14. /
  15. Modifiedby:TIGER0-JOHN
  16. Modifieddate:2011-1-21
  17. Version:2.0
  18. Descriptions:测试成功
  19. 在用中断的时候在Startup.S文件中的InitStack子

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

网站地图

Top