单片机 > 单片机程序设计 > 详情

LPC2106 中断系统

发布时间:2024-10-30 发布时间:
|

LPC2106/2105/2104包含3 个外部中断输入(EINT0  EINT1  EINT2  )。可用于将处理器从掉电模式唤醒。

外设功率控制寄存器(PCONP – 0xE01FC0C4)

PCONP寄存器允许将所选的外设功能关闭以实现节电的目的。有少数外设功能不能被关闭(看门狗定时器、GPIO、管脚连接模块和系统控制模块)。PCONP中的每个位都控制一个外设,见表 20。每个位所对应的外设编号见VPB 外设映射一节。

PCONP

功能

描述

复位值

0

保留

保留,用户软件不要向其写入1。从保留位读出的值未被定义。

NA

1

 PCTIM0

该位为1 时,定时器0 使能。为0 时,定时器0 被关闭以实现节电

1

2

 PCTIM1

该位为1 时,定时器1 使能。为0 时,定时器1 被关闭以实现节电

1

3

 PCURT0

该位为1 时,UART0使能。为0 时,UART0被关闭以实现节电。

1

4

 PCUART1

该位为1 时,UART1使能。为0 时,UART1被关闭以实现节电。

1

5

 PCPWM0

该位为1 时,PWM0 使能。为0 时,PWM0 被关闭以实现节电。

1

6

保留

保留给PWM1 。用户软件不要向其写入1。从保留位读出的值未被

NA

7

 PCI2C

该位为1 时,I

1

8

 PCSPI

2

1

9

 PCRTC

C 接口使能。为0 时,I

1

31:10

保留

2

NA

 

向量中断控制器

l  ARM PrimeCell TM向量中断控制器

l  32个中断请求输入

l  16个向量IRQ 中断

l  16个优先级,可动态分配给中断请求

l  软件中断产生

 

向量中断控制器(VIC)具有32个中断请求输入,可将其编程分为 3 类:FIQ 、向量IRQ 和非向量IRQ 。可编程分配机制意味着不同外设的中断优先级可以动态分配并调整。

快速中断请求(FIQ )要求具有最高优先级。如果分配给FIQ 的请求多于1 个,VIC 将中断请求“相或”后向ARM处理器产生FIQ 信号。当只有一个中断被分配为FIQ 时可实现最短的FIQ 等待时间,因为FIQ 服务程序只要简单地启动器件的处理就可以了。但如果分配给FIQ 级的中断多于1 个,FIQ 服务程序从VIC 中读出一个字来识别产生中断请求的FIQ 中断源是哪一个。

向量IRQ 具有中等优先级。该级别可分配32个请求中的16个。32个请求中的任意一个都可分配到16个向量IRQ slot 中的任意一个,其中slot0 具有最高优先级,而slot15 则为最低优先级。

非向量IRQ 的优先级最低。

VIC 将所有向量和非向量IRQ “相或”向ARM处理器产生IRQ 信号。IRQ 服务程序可通过读取VIC的一个寄存器立即启动并跳转到相应地址。如果有任意一个向量 IRQ 发出请求,VIC 则提供最高优先级请求IRQ 服务程序的地址,否则提供默认程序的地址。该默认程序由所有非向量 IRQ 共用。默认程序可读取任何VIC 寄存器以确定哪个IRQ 被激活。

VIC 中所有的寄存器都为字寄存器。不支持字节和半字的读和写操作。

关于向量中断控制器的其它信息请参阅ARMPrimeCell TM向量中断控制器的相关文档。

 

VIC 寄存器映射

地址

名称

描述

访问

复位值

0xFFFF F000 

 VICIRQStatus

IRQ 状态。该寄存器读出定义为IRQ 并使能的中断的状态。

RO

 0

0xFFFF F004 

 VICFIQStatus

FIQ 状态请求。该寄存器读取定义为 FIQ 并使能的中断的状态。

RO

 0

0xFFFF F008 

 VICRawIntr

所有中断的状态。该寄存器读出32个中断请求/ 软件中断的状态,不管中断是否使能或分类。

RO

 0

0xFFFF F00C 

 VICIntSelect

中断选择。该寄存器将32个中断请求的每个都分配为FIQ 或IRQ 。

R/W

 0

0xFFFF F010 

 VICIntEnable

中断使能。该寄存器控制将32个中断请求和软件中断中的哪些使能为FIQ 或IRQ 。

R/W

 0

0xFFFF F014 

 VICIntEnClr

中断使能清零。该寄存器允许软件将中断使能寄存器中的一个或多个位清零。

W

 0

0xFFFF F018 

 VICSoftInt

软件中断。该寄存器的内容与32个不同外设的中断请求“相或”。

R/W

 0

0xFFFF F01C 

 VICSoftIntClear

软件中断清零。该寄存器允许软件将软件中断寄存器中的一个或多个位清零。

W

 0

0xFFFF F020 

 VICProtection

保护使能。该寄存器允许特权模式下运行的软件对VIC 寄存器进行有限的访问。

R/W

 0

0xFFFF F030 

 VICVectAddr

向量地址。当发生一个 IRQ 中断时,IRQ 服务程序可读出该寄存器并跳转到读出的地址。

R/W

 0

0xFFFF F034 

VICDefVectAddr

默认向量地址。该寄存器保存了非向量中断的中断服务程序(ISR )地址。

R/W

 0

0xFFFF F100 

 VICVectAddr0

向量地址0。向量地址寄存器0-15 保存了16个向量IRQ slot 的中断服务程序地址。

R/W

 0

0xFFFF F104 

 VICVectAddr1

向量地址1 寄存器

R/W

 0

0xFFFF F13C

VICVectAddr15

向量地址15寄存器

R/W

0

0xFFFF F200

VICVectCntl0

向量控制0。向量控制寄存器0-15 分别控制16个向量IRQ slot 中的一个。Slot0优先级最高,而Slot15优先级最低。

R/W

0

~

~

~

~

~

0xFFFF F23C

VICVectCntl15

向量控制15寄存器

R/W

0






 

l  软件中断寄存器(VICSoftInt- 0xFFFFF018,读/ 写)

在执行任何逻辑之前,将该寄存器的内容与32个不同外设的中断请求相或。

1:强制产生与该位相关的中断请求。

0:不强制产生中断请求。向VICSoftInt写入0 无效,见VICSoftIntClear。

l  软件中断清零寄存器(VICSoftIntClear- 0xFFFFF01C ,只写)

该寄存器在不需读取软件中断寄存器的情况下,可用软件清零软件中断寄存器中的一个或多个位。

1:写入1 清零软件中断寄存器的相应位,并解除强制的中断请求。

0:写入0 不会影响VICSoftInt 中的相应位。

l  所有中断状态寄存器(VICRawIntr- 0xFFFFF008 ,只读)

1:对应位的中断请求或软件中断声明。

0:对应位的中断请求或软件中断未声明

l  中断使能寄存器(VICIntEnable- 0xFFFFF010,读/ 写)

读取该寄存器时,1 表示中断请求使能为FIQ 或IRQ 。

当写该寄存器时,1 使能中断请求或软件中断,0无效。见VICIntEnClear寄存器(表2)

l  中断使能清零寄存器(VICIntEnClr- 0xFFFFF014,只写)

1:写入1 清零中断使能寄存器中的对应位并禁止对应的中断请求。

0:写入0 不影响中断使能寄存器中的位

l  中断选择寄存器(VICIntSelect- 0xFFFFF00C,读/ 写)

1:对应的中断请求分配为FIQ。

0:对应的中断请求分配为IRQ 。

l  IRQ 状态寄存器(VICIRQStatus - 0xFFFFF000 ,只读)

该寄存器读取使能并分配为IRQ 的中断请求的状态,它不对向量和非向量IRQ 进行区分。

1:对应位的中断请求使能并分配为IRQ 并且声明。

l  FIQ 状态寄存器(VICFIQStatus - 0xFFFFF004,只读)

该寄存器读取使能并分配为FIQ 的中断请求的状态。如果有超过一个请求分配为FIQ ,FIQ 服务程序可读取该寄存器来确定是哪一个(几个)请求被激活。

1:对应位的中断请求使能并分配为FIQ 并且声明。

l  向量控制寄存器0-15 (VICVectCntI0-15- 0xFFFFF200-23C ,读/ 写)

Slot0优先级最高,Slot15 优先级最低。在VICVectCntl寄存器中禁止一个向量IRQ slot 不会禁止中断本身,中断只是变为非向量的形式。

VICVectCntl0-15

功能

复位值

5

1:向量IRQ 使能,当分配的中断请求或软件中断使能,被分配为IRQ 并声明时,可产生一个唯一的 ISR 地址对应位的中断请求使能并分配为FIQ 并且声明。

0

4 : 0

IRQ slot 的中断请求或软件中断的编号。作为一个良好的编程习惯,不要将把相同的中断编号分配给多于一个使能的向量IRQ slot 。但如果这样做了,当中断请求或软件中断使能,被分配为IRQ 并声明时,会使用slot 。 分配给此向量最低编号的

0

 

l  向量地址寄存器0-15 (VICVectAddr0-15- 0xFFFFF100-13C ,读/ 写)

这些寄存器保存16个向量IRQ slot 中断服务程序的地址。当一个或多个分配为向量IRQ slot 的中断请求使能,分配为IRQ ,声明并时,服务程序读取向量地址寄存器(VICVe cAddr )时会得到最高优先级slot的IRQ寄存器值。

l  默认向量地址寄存器(VICDefVectAddr– 0xFFFF F034 ,读/ 写)

这些寄存器保存非向量IRQ 中断服务程序的地址。当一个IRQ 服务程序读取向量地址寄存器, 并且没有IRQ slot 响应时,则返回该寄存器中的地址。

l  向量地址寄存器(VICVectAddr - 0xFFFFF030 ,读/ 写)

当发生一个IRQ中断时。IRQ 服务程序可读取该寄存器并跳转到读出的地址。

当任何分配给向量IRQ slot 的中断请求或软件中断使能,分配为IRQ 并声明时,读取该寄存器将返回最高优先级向量地址寄存器中的地址。否则返回默认向量地址寄存器中的地址。

l  保护使能寄存器(VICProtection  - 0xFFFFF020 ,读/ 写)

运行在用户模式下的软件使用该1 位寄存器来控制对VIC 寄存器的访问。

1:VIC 寄存器只能在特权模式下访问。

0:VIC 寄存器可在用户模式或特权模式下访问。

 

中断源

下表列出了每一个外设功能的中断源。每个外围设备都有一条中断线连接到向量中断控制器,但有些可能拥有几个内部中断标志。单个中断标志也有可能代表一个以上的中断。

模块

标志

VIC通道#

WDT

看门狗中断(WDINT)

0

-

保留给软件中断

1

ARM内核

EmbeddedICE, DbgCommRx

2

ARM内核

EmbeddedICE, DbgCommTx

3

定时器0

匹配0-3(MR0, MR1,  MR2,  MR3 )

捕获0-3(CR0, CR1, CR2, CR3 )

4

定时器1

匹配0-3(MR0, MR1,  MR2,  MR3 )

捕获0-3(CR0, CR1, CR2, CR3 )

5

UART0

Rx线状态(RLS )

发送保持寄存器空(THRE )

Rx数据可用(RDA)

字符超时指示(CTI)

6

UART1

Rx线状态(RLS )

发送保持寄存器空(THRE )

Rx数据可用(RDA)

字符超时指示(CTI)

Modem状态中断(MSI)

7

PWM0

捕获0-3(C R 0,   C R 1 ,   C R 2 ,   C R 3)

匹配0-6(MR0, MR1,  MR2,  MR3,  MR4,  MR5,  MR6 )

8

I2C

SI (状态改变)

9

SPI

 SPIF,   MODF

10

-

保留

11 

PLL

PLL 锁定(PLOCK)

12

RTC

RT CCIF(计数器增加),RTCAL F(报警)

13

系统控制

外部中断0(EINT0 )

14

系统控制

外部中断1(EINT1 )

15

系统控制

外部中断2(EINT2 )

16

 

VIC使用注意

l  FIQ

虽然可以选择多个中断源来产生FIQ请求,但是只有一个专门的中断服务程序来服务响应所有的FIQ请求。因此,如果分配为FI Q的中断多于一个,FIQ中断服务程序就必须读取VICFIQS t atus 的内容来决定如何处理中断请求。不过我们还是建议只将一个中断分配为FIQ 。多个FIQ 中断源会增加中断延迟。

l  清中断

在中断服务程序执行完毕后,对外设中断标志的清零将会对VIC 寄存器(VICRawlntr ,  VICFIQSt atus和VICIRQStatus )当中的对应位产生影响。另外,为了能够服务下次中断,必须在中断返回之前对VICVectAddr寄存器执行写操作。该写操作将清零内部中断优先级硬件当中对应的中断标志。

l  禁止VIC 中断

必须清零VICIntEn Clr寄存器中的对应位,该操作使VICIntEnable 寄存器的对应位清零。

这同样应用于VICSoftInt 和VICSoctIntClr。通过写 VICSoftIntClear来执行对 VICSoftInt新的清零操作之前, 必须执行VICSoftIntClear=0x0000 0000, 因为向VICSoftIntClear 寄存器任何位写入1对目标寄存器都是一次有效。

l  看门狗或无效喂狗中断无法清除

唯一的方法是在中断返回之前通过VICIntEnClr禁止VIC中断。    

在任何IRQ 请求(SPI,  I2C, UART0 或UART1 )产生之后,微控制器跳转到地址0x00000018执行代码。对于向量和非向量IRQ ,可在地址0x18放入下面指令:

LDR   pc, [ pc, #-0xFF0 ]  ;VICVectAddr 0xFFFFF030,

该指令将VICVectAddr寄存器中保存的地址装入PC。ARM7TDMI是三级流水线,PC超前于当前执行的指令8字节。 PC = (执行指令位置 + 8) – 0xFF0。

ARM7对终端响应流程

当发生异常中断时:

1.将寄存器LR设置为返回地址

2.保存当前程序状态寄存器。前一模式的CPSR -> 保存到异常中断对应的SPSR寄存器中。

3.关中断,CPSR中禁止IRQ中断,或同时禁止IRQ FIRQ中断,防止CPU响应同类型中断。

4.将PC值设置为对应异常中断的入口地址。IRQ 0x0000 0018  FIRQ 0x0000001C

以上由硬件自动完成。

 

从异常中断处理程序中返回需要由用户软件完成(编译器特殊标志 __irq)

1.恢复程序状态寄存器,将SPSR复制到CPSR中

2.恢复用户程序的运行。

 

中断处理完成后,恢复用户程序前,注意清除中断标志。

 

FIQ中断

建议只用一个。

向量IRQ中断

描述:

一旦发生向量IRQ中断,ARM处理器进入IRQ模式,PC指向IRQ异常入口0x18,同时向量IRQ服务程序的地址从相应通道的向量地址寄存器(VICVectAddr0~15)中复制到VIC的向量地址寄存器(VICVectAddr),PC根据VICVectAddr内的地址进行跳转,执行相应的服务程序。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32学习笔记4:外部中断