第五章 中断
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
断使能。外设中断的启动一般都在外设的相关寄存器中设置,经过查询UART的
寄存器中,可以找到其有一个中断使能寄存器UxIER。该寄存器的描述如表5.1
所示。
UxIER
描述
复位值
0 RBR 中断使能。1:使能 RDA 中断;0:禁止 RDA 中断。
0
1 THRE 中断使能。1:使能 THRE 中断;0:禁止 THRE 中断。
同一个IRQ Slot的;(unsigned int)UART0_RcvByte的(unsigned int)
可以写也可以不写,从程序的健壮性考虑,最好写。
如果一个中断被分类成了向量中断,则去中断服务程序的地址将从相应的向
量地址寄存器中读取,对于其他没有设置成向量中断的,则从默认向量地址寄存
器中读取中断服务程序的入口地址。该寄存器为:VICDefVectAddr,该寄存
void __irq 中断服务程序名(void) { }
上面的格式中,__irq是ADS1.2中中断服务程序的关键字,在编写中断服 务程序的时候一定不可缺少。同时,作为中断服务程序,是没有输入参数也是没 有返回值的,所以两个都是void。
一般而言,中断服务程序的流程如图5.4所示。
中断程序入口
查询产生中断的原因
VICVectCntl015,该寄存器控制的是该IRQ Slot连接到哪一个外部设备中
和是否使能该IRQ Slot。注意:在VICVectCntl寄存器中可以禁止一个向量
IRQ slot,但不会禁止中断本身,该中断只是由原来的向量形式变为非向量形
式。该系列的寄存器描述如表5.3所示。
VICVectCntlx
进行一些属性的设置。LPC2214一共有16个IRQ Slot,其中slot0具有最高
优先级,而Slot15则为最低优先级。
每 一 个 中 断 槽 有 两 个 属 性 可 以 设 置 , 分 别 是 VIC 控 制 器 寄 存 器
(VICVectCntlx),VIC控制寄存器总共有16个,分别为VICVectCntl0~
器;而0x02是用来VICVectCntl2的第5为设置成1,从使能IRQ Slot2的中
断;0x06是UART0的中断源编号,从中断源与中断源编号表中可以查询到。
此外,每一个IRQ Slot还有一个对应的向量地址寄存器,该寄存器保存的
是该IRQ Slot的中断服务程序的入口地址,即该中断服务的程序名。向量地址
14
外部中断 0(EINT0)
位
中断源
15
外部中断 1(EINT1)
16
外部中断 2(EINT2)
17
外部中断 3(EINT3)
0 0
复位值
0 0 0
18
A/D0
0
19
I2C1
0
20
BOD
0
31:21 保留
0
表5.2 中断选择寄存器
在本章中我们将UART0的接收中断设置成IRQ类型,查询中断选择寄存器
中断使能清零寄 存器
VICIntEnClear
IRQ使能
CPU
图5.2 LPC2214中断模型 从图5.2可以看出,一个中断信号是否可以送到CPU出并让CPU是去处理主 要取决于以下几个因素:1、外部设备是否产生了中断;2、中断向量控制器是 否给外设分配了中断向量入口;3、FIQ、IRQ是否已经使能。 与LPC2214的其他片内外设一样,VIC也是通过寄存器来控制的,VIC 中 所有的寄存器都为字寄存器,不支持字节和半字的读和写操作。 中断的使用步骤如图5.3所示。
第五章 中断
在上一章的UART接收试验中,我们使用的是查询的方式来实现的,在查询 接收期间CPU就只能等待是否有数据传输进来而不能做其他的事情,查询接收占 据了CPU的全部可用时间,特别浪费CPU资源。如何把CPU从这种简单而又重复 的事件中解脱出来,充分利用CPU的全部有效时间是一个值得深入考虑的问题。 对于像UART这种异步发生的事件,现在的CPU一般会采用中断的方式进行处理。
所谓中断,即打断CPU目前正在执行的程序而转向执行其他程序的一种CPU 运行机制。如图5.1所示。
程序A
程序B
程序A
图5.1 CPU中断 CPU正在执行程序A,但是因为某些事件的发生使得CPU不得不暂时放弃目 前的程序A而转向执行程序B,在B程序执行完成之后再重新回来执行程序A。这 就是一个中断过程,其中程序A叫做被中断程序,而程序B叫做中断服务程序, 引起中断的事件叫做中断源。芯片内部许多部件都可以作为中断源,比如UART, 定时器等。 LPC2214的中断系统模型如图5.2所示。
器描述如表5.5所示。
VICDefVectAddr
描述
复位值
[31..0]
其他非向量中断的入口地址
0
表5.5 默认向量地址寄存器
5.4 中断服务程序
所谓中断服务程序,就是CPU被中断后转向执行的程序,实际上就是真正实
现中断处理功能的程序。在ADS1.2开发环境中,对于处理程序有一定的格式要
求。格式一般为:
外设1中断
IRQ Slot0
VIC控制寄存器 VICVectCntl0
向量地址寄存器 VICVectAddr0
FIQ使能
外设i中断 外设n中断
...
IRQ Slot15 VIC控制寄存器 VICVectCntl15 向量地址寄存器 VICVectAddr15
中断使能寄存器 VICIntEnable
(SSP) 接收超时条件(RTRIS)
11
接收溢出(RORRIS)
PLL
PLL 锁定(PLOCK)
12
计数器增加(RTCCIF)
RTC
报警(RTCALF)
13
外部中断 0(EINT0)
14
外部中断 1(EINT1)
15
外部中断
外部中断 2(EINT2)
16
外部中断 3(EINT3)
17
A/D0 A/D 转换器 0
因为FIQ服务程序只要简单地启动器件的处理就可以了,但如果分配给FIQ级的
中断多于1 个,FIQ服务程序需要读取FIQ状态寄存器来识别产生中断请求的
FIQ中断源。
5.3 分配中断槽
LPC2214的向量中断是通过中断槽(IRQ Slot)的方式来实现的,所谓中
断槽,就相当于了一个空的接口,这个接口可以连接很多外部设备,同时也可以
描述
复位值
4..0
分配给此优先级向量 IRQ 中断的中断源编号
0
该位为 1,使能当前优先级的向量 IRQ 中断。否则为禁
5
止
0
7..6
保留未使用
0
表5.3 向量中断控制寄存器
如表5.3所示,其[4..0]位应该写入的是中断源编号。中断源,即是能产
生中断的外设,在LPC2214中,中断源多达21个,每一个中断源都有一个中断
寄存器也总共有16个,分别是VICVectAddr0~VICVectAddr15。该系列寄
存器的描述如表5.4所示。
VICVectAddrx
描述
复位值
[31..0] 该向量中断的中断服务程序入口地址
0
表5.4 向量地址寄存器
在本章中,我们UART0的中断服务程序是UART0_RcvByte(),所以我们要
在我们以及选定的IRQ Slot2的向量地址寄存器中VICVectAddr2中写入我们
的中断服务程序入口地址UART0_RcvByte(),需要执行下面的程序:
VICVectAddr2 = (unsigned int)UART0_RcvByte;
注意:VICVectAddr2和VICVectCntl2必须成对出现,因为他们是属于
表,我们需要执行一下的程序:
VICIntSelect = VICIntSelect & (~(1<<6));
注意:快速中断请求(FIQ,Fast Interrupt reQuest)要求具有最高
优先级,如果分配给FIQ的请求多于1 个,VIC将中断请求“相或”后向ARM处
理器产生FIQ信号。当只有一个中断被分配为FIQ时可实现最短的FIQ等待时间,
7
字符超时指示(CTI)
PWM0 匹配 0-6(MR0, MR1, MR2, MR3, MR4, MR5, MR6)
8
模块
可能产生中断的原因
编号
I2C0 SI(状态改变)
9
SPI 中断标志(SPIF)
SPI0
模式错误(MODF)
10
Tx FIFO 至少一半为空(TXRIS)
SPI1 Rx FIFO 至少一半为满(RXRIS)
0
Rx 线状态中断使能。1:禁止 Rx 线状态中断;0:禁止 Rx 线
2 状态中断;
0
该中断状态可从 UxLSR[4:1]读出。
7 : 3 保留,用户软件不要向这些位写入 1。
未定义
表5.1 UxIER寄存器描述
从寄存器内容描述中我们可以看到,UART共有两个基本中断和一个混合中
断。两个基本中断分别是RBR中断和THRE中断。RBR中断即接收到有效数据中断,
源编号,用来相互区别,如表5.4所示。
模块
可能产生中断的原因
编号
WDT
看门狗中断(WDINT)
0
ARM 内核 保留给软件中断
1
ARM 内核 EmbeddedICE, DbgCommRx
2
ARM 内核 EmbeddedICE, DbgCommTx
3
定时器 0
匹配 0-3(MR0, MR1, MR2, MR3) 捕获 0-3(CR0, CR1, CR2, CR3)
当UART接收到有效数据时发生该中断。THRE中断即发送缓冲区空中断,发送完
成后产生的中断。还有一个线状态混合中断,对于这个混合中断的具体中断源可
以通过UxLSR寄存器查询得到。
本章我们将使用中断的方式从UART0接收数据,从UxIER寄存器的描述中可
知,要想通过中断的方式从UART接收数据,要将RBR中断使能位置1,即执行以
下的语句:
U0IER = U0IER | 0x01;
5.2 选择中断类型
LPC2214的中断可以分成IRQ和FIQ两种,所谓FIQ,是快速中断请求(FIQ,
Fast Interrupt reQuest ) 的 缩 写 , 而 IRQ 叫 中 断 请 求 ( Interrupt
reQuest),两者没有最大的区别在于处理的优先级不等,即当同时发生IRQ
4
定时器 1
匹配 0-3(MR0, MR1, MR2, MR3) 捕获 0-3(CR0, CR1, CR2, CR3)
5
Rx 线状态(RLS)
发送保持寄存器空(THRE)
UART0 Rx 数据可用(RDA)
6
字符超时指示(CTI)
Rx 线状态(RLS)
Leabharlann Baidu
发送保持寄存器空(THRE)
UART1 Rx 数据可用(RDA)
和FIQ时,优先响应FIQ,而后再响应IRQ。
每 一 个 中 断 源 选 择 IRQ 或 者 FIQ 类 型 中 断 是 通 过 中 断 选 择 寄 存 器
(Interrupt Select Register)来选择的,该寄存器记作VICIntSelect,
该寄存器的每一位刚控制了一个中断源,各中断源的位置与中断源列表所示相
18
I2C1 SI(状态改变)
19
BOD
掉电检测
20
表5.4 中断源与中断编号
本章中,我们将UART0的接收中断分配到IRQ Slot2中,查询向量中断控
制寄存器,我们要执行一下的程序才能实现:
VICVectCntl2 = 0x20 | 0x06;
其中,VICVectCntl2是我们需要设定的IRQ Slot2的向量中断控制寄存
中断源使能相关中断
选择中断类型
分配IRQ槽
设置中断服务程序地址
使能中断
图5.3 中断使用流程 上一章中,我们学习了如何通过UART口来控制LED闪亮的次数,在这一章
中我们将学习如何基于UART中断接收数据的方式来控制LED闪亮的速度。
5.1 使能中断源中断
能产生中断的外设叫做中断源,要想使用中断,第一步就要启动中断源的中
同。向相应的位写入1,则对应的中断分配为FIQ中断,写入0,则为IRQ中断。
如表5.2所示。
位
中断源
复位值
0
WDT
0
1
ARM 内核
0
2
ARM 内核
0
3
ARM 内核
0
4
定时器 0
0
5
定时器 1
0
6
UART0
0
7
UART1
0
8
PWM0
0
9
I2C0
0
10
SPI0
0
SPI1
11
(SSP)
0
12
PLL
0
13
RTC
中断处理
中断源中断结束处理
VIC中断结束处理
退出中断服务程序
图5.4 中断服务程序 对于ARM处理器而言,同一个外设一般会产生多种中断,所以在中断服务程 序中必须首先要找出发生中断的具体原因,然后才根据不同的中断原因进行中断 处理,同时因为产生中断发原因很多,在退出中断服务程序之前,必须要根据外 设的要求进行中断源中断结束前的处理,比如清除某个寄存器某位或者复位某个 寄存器等。在完成了中断源中断结束前处理后,还必须马上进行VIC中断结束处 理,在LPC2214中,VIC中断结束处理就要要复位VICVectAddr寄存器。 本章中使用的UART接收中断处理程序流程如图5.5所示。