• 沒有找到結果。

中断源

在文檔中 1.1 嵌入式系统 (頁 191-194)

第5章 LPC2000系列ARM硬件结构

如果存储器组配置成 32 位宽度,地址线 A0 和 A1 无用。如果存储器组配置成 16 位宽,

1. 将 P0.8、P0.9 设置为 TxD1、RxD1 功能 PINSEL0 = 0x00050000;

5.8 向量中断控制器(VIC)

5.8.5 中断源

表 5.63 列出了每一个外设功能的中断源。每个外围设备都有一条中断线连接到向量中 断控制器,但有些中断源可能拥有几个内部中断标志(比如 RTC 中断,就有 RTCCIF 和 RTCALF 两个中断标志),或者单个中断标志也有可能代表一个以上的中断(比如 I2C 中断,

中断标志为SI,包括了起始信号、发送数据和接收数据等等中断)。

中断源与VIC 连接示意图见图 5.29。

表 5.63 连接到向量中断控制器的中断源

模块 标志 VIC 通道号

WDT 看门狗中断(WDINT) 0

- 保留给软件中断 1

ARM 内核 EmbeddedICE, DbgCommRx 2

ARM 内核 EmbeddedICE, DbgCommTx 3

- - 182

- - 183 5.8.6 VIC 使用事项

VIC 中断与片内 RAM 调试。如果在片内 RAM 中调试程序(JTAG 调试)时需要使 用中断,那么必须将中断向量重新映射到地址 0x00000000。这样做是因为所有的 异常向量都位于地址0x00000000 及以上。通过将寄存器 MEMMAP(位于系统控 制模块当中)配置为用户RAM 模式来实现这一点。另外,用户代码编译连接时应 该使中断向量表装载到地址0x40000000。

多个 FIQ 中断。虽然可以选择多个中断源(通过 VICIntSelect)来产生 FIQ 请求,

但是只有一个专门的中断服务程序来响应所有出现的 FIQ 请求。因此,如果分配 为FIQ 的中断多于一个,FIQ 中断服务程序就必须读取 VICFIQStatus 的内容来识 别产生中断请求的 FIQ 中断源是哪一个,然后再进行相应中断处理。不过我们还 是建议只将一个中断分配为FIQ。多个 FIQ 中断源会增加中断处理程序的延迟。

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

VIC 中断禁能操作。若要禁止 VIC 中断,必须清零 VICIntEnable 寄存器中的对应 位 , 这 可 以 通 过 写 VICIntEnClr 寄 存 器 实 现 。 这 同 样 应 用 于 VICSoftInt 和 VICSoftIntClear,VICSoftIntClear 将会使 VICSoftInt 中的对应位清零。例如,如果 VICSoftInt=0x00000005,需要将其 bit0 清零,那么 VICSoftIntClear=0x00000001 可 实现该操作。向VICSoftIntClear 寄存器任何位写入 1 对目标寄存器都是一次有效。

看门狗中断。如果看门狗在溢出或无效喂狗时产生中断,那么无法清除中断。唯一 的方法是通过VICIntEnClr 禁止 VIC 中断,然后再中断返回。

举例:

假设 UART0 和 SPI0 产生中断请求,它们被分配为向量 IRQ(UART0 的优先级高于 SPI0),而 UART1 和 I2C 产生非向量 IRQ,下面就是 VIC 一种初始化的示例:

VICIntSelect = 0x00000000 (SPI0, I2C, UART1 和 UART0 为 IRQ => bit10, bit9, bit7 和bit6=0)

VICIntEnable = 0x000006C0 (SPI0, I2C, UART1 和 UART0 中断使能 => bit10, bit9, bit 7 和 bit6=1)

VICDefVectAddr = 0x… (保存服务非向量 IRQ 的程序地址 ,即 UART1 和 I2C 服务程序的起始地址)

VICVectAddr0 = 0x… (保存 UART0 IRQ 服务程序的起始地址) VICVectAddr1 = 0x… (保存 SPI0 IRQ 服务程序的起始地址)

VICVectCntl0 = 0x00000026 (VIC 通道号为 6(UART0)的中断源使能为优先级 0 (最高优先级))

VICVectCntl1 = 0x0000002A (VIC 通道号为 10(SPI0)中断源使能为优先级 1) 在任何 IRQ 请求(SPI0, I2C, UART0 或 UART1)产生之后,微控制器跳转到地址 0x00000018 执行代码。对于向量和非向量 IRQ,可在地址 0x18 放入下面指令:

LDR pc, [ pc, #-0xFF0 ]

该指令将VICVectAddr 寄存器中保存的地址装入 PC。

一旦产生 UART0 请求,VICVectAddr 和 VICVectAddr0 相同。如果产生 SPI 请求,

VICVectAddr 等于 VICVectAddr1。如果 UART0 和 SPI 都没有产生 IRQ 请求,而 UART1 和

- - 184

/或 I2C 产生请求,那么 VICVectAddr 的内容与 VICDefVectAddr 相同。

5.8.7 VIC 应用示例 1. VIC 基本操作方法

设置IRQ/FIQ 中断,若是 IRQ 中断则可以设置为向量中断并分配中断优先级,否则为 非向量IRQ。然后可以设置中断允许,以及向量中断对应地址或非向量中断默认地址。当有 中断后,若是 IRQ 中断,则可以读取向量地址寄存器,然后跳转到相应代码。当要退出中 断时,对向量地址寄存器写0,通知 VIC 中断结束。当发生中断时,处理器将会切换处理器 模式,同时相关的寄存器也将会映射(如 R13、R14)。

对于中断源(VIC 通道)的 IRQ/FIQ 选择,由 VICIntSelect 寄存器控制,每一个中断源与 VICIntSelect 的各个位一一对应,比如 VIC 通道号 9(I2C 中断)与 VICIntSelect 的 d9 位对应,

设置该位为1,则分配为 FIQ 中断,否则分配为 IRQ 中断。

在文檔中 1.1 嵌入式系统 (頁 191-194)