外部中断初始化流程
外部中断的流程图如下:
此处不考虑中断优先级,涉及的寄存器如下:
寄存器 | 作用 |
---|---|
CPSR | 设置为usr模式,开启中断总开关 |
GPxCON | 配置寄存器为外部中断模式 |
EXTINT | 设置外部中断触发方式 |
EXIMASK | 外部中断屏蔽寄存器 |
EXITPEND | 由于EINT4-7、EINT8-23使用的是一个中断源,此寄存器分辨到底是哪一个IO产生的中断 |
寄存器 | 作用 |
---|---|
INTMASK | 中断屏蔽寄存器 |
SRCPND | 产生的所有中断的标志 |
INTPND | 正在处理的中断的标志 |
INTOFFSET | 正在处理的中断的编号 |
外部中断配置
一、初始化中断
- 将系统的模式(MODE)从SVC(supervise)模式设置位USER模式。将M4~M0设置为b10000即可。
CPSR寄存器详细描述:
各种模式下M4~M0的值:
- 打开中断总开关。CPSR中的第6位表示中断总开关。当I等于0时,irq中断使能。
- 初始化外部中断,中断控制器中的INTMSK寄存器可以屏蔽各种中断,需要解除外部中断的屏蔽。INTMSK的默认值为0xFFFFFFFF。0表示使能中断,1表示屏蔽中断。
INTMSK寄存器详细信息:
INTMSK | Bit Description | Initial State |
---|---|---|
INT_ADC | [31] | 0 = Service available, 1 = Masked 1 |
INT_RTC | [30] | 0 = Service available, 1 = Masked 1 |
INT_SPI1 | [29] | 0 = Service available, 1 = Masked 1 |
INT_UART0 | [28] | 0 = Service available, 1 = Masked 1 |
INT_IIC | [27] | 0 = Service available, 1 = Masked 1 |
INT_USBH | [26] | 0 = Service available, 1 = Masked 1 |
INT_USBD | [25] | 0 = Service available, 1 = Masked 1 |
INT_NFCON | [24] | 0 = Service available, 1 = Masked 1 |
INT_UART1 | [23] | 0 = Service available, 1 = Masked 1 |
INT_SPI0 | [22] | 0 = Service available, 1 = Masked 1 |
INT_SDI | [21] | 0 = Service available, 1 = Masked 1 |
INT_DMA3 | [20] | 0 = Service available, 1 = Masked 1 |
INT_DMA2 | [19] | 0 = Service available, 1 = Masked 1 |
INT_DMA1 | [18] | 0 = Service available, 1 = Masked 1 |
INT_DMA0 | [17] | 0 = Service available, 1 = Masked 1 |
INT_LCD | [16] | 0 = Service available, 1 = Masked 1 |
INT_UART2 | [15] | 0 = Service available, 1 = Masked 1 |
INT_TIMER4 | [14] | 0 = Service available, 1 = Masked 1 |
INT_TIMER3 | [13] | 0 = Service available, 1 = Masked 1 |
INT_TIMER2 | [12] | 0 = Service available, 1 = Masked 1 |
INT_TIMER1 | [11] | 0 = Service available, 1 = Masked 1 |
INT_TIMER0 | [10] | 0 = Service available, 1 = Masked 1 |
INT_WDT_AC97 | [9] | 0 = Service available, 1 = Masked 1 |
INT_TICK | [8] | 0 = Service available, 1 = Masked 1 |
nBATT_FLT | [7] | 0 = Service available, 1 = Masked 1 |
INT_CAM | [6] | 0 = Service available, 1 = Masked 1 |
EINT8_23 | [5] | 0 = Service available, 1 = Masked 1 |
EINT4_7 | [4] | 0 = Service available, 1 = Masked 1 |
EINT3 | [3] | 0 = Service available, 1 = Masked 1 |
EINT2 | [2] | 0 = Service available, 1 = Masked 1 |
EINT1 | [1] | 0 = Service available, 1 = Masked 1 |
EINT0 | [0] | 0 = Service available, 1 = Masked 1 |
- INTMOD设置中断模式:0: IRQ MODE; 1: FIQ MODE。
二、初始化外部中断
- GPxCON寄存器配置引脚为外部中断引脚。
00 = Input
01 = Output
10 = EINT[x]
11 = Reserved - EXITINTx寄存器配置外部中断触发方式。其中EINT8~EINT12可以设置filter。
Register | Address | R/W | Description Reset Value |
---|---|---|---|
EXTINT0 | 0x56000088 | R/W | External interrupt control register 0 0x000000 |
EXTINT1 | 0x5600008c | R/W | External interrupt control register 1 0x000000 |
EXTINT2 | 0x56000090 | R/W | External interrupt control register 2 0x000000 |
EXTINT0 | Bit | Description |
---|---|---|
EINT7 | [30:28] | Setting the signaling method of the EINT7. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT6 | [26:24] | Setting the signaling method of the EINT6. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT5 | [22:20] | Setting the signaling method of the EINT5. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT4 | [18:16] | Setting the signaling method of the EINT4. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT3 | [14:12] | Setting the signaling method of the EINT3. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT2 | [10:8] | Setting the signaling method of the EINT2. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT1 | [6:4] | Setting the signaling method of the EINT1. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
EINT0 | [2:0] | Setting the signaling method of the EINT0. 000 = Low level 001 = High level 01x = Falling edge triggered10x = Rising edge triggered 11x = Both edge triggered |
三、查询中断源
- SRCPND可以查看当前正在触发中断的所有中断标志。当处理完中断后,需要通过向指定位置写 1 手动清零相应的中断标志。
SRCPND | Bit | Description Initial State |
---|---|---|
INT_ADC | [31] | 0 = Not requested, 1 = Requested 0 |
INT_RTC | [30] | 0 = Not requested, 1 = Requested 0 |
INT_SPI1 | [29] | 0 = Not requested, 1 = Requested 0 |
INT_UART0 | [28] | 0 = Not requested, 1 = Requested 0 |
INT_IIC | [27] | 0 = Not requested, 1 = Requested 0 |
INT_USBH | [26] | 0 = Not requested, 1 = Requested 0 |
INT_USBD | [25] | 0 = Not requested, 1 = Requested 0 |
INT_NFCON | [24] | 0 = Not requested, 1 = Requested 0 |
INT_UART1 | [23] | 0 = Not requested, 1 = Requested 0 |
INT_SPI0 | [22] | 0 = Not requested, 1 = Requested 0 |
INT_SDI | [21] | 0 = Not requested, 1 = Requested 0 |
INT_DMA3 | [20] | 0 = Not requested, 1 = Requested 0 |
INT_DMA2 | [19] | 0 = Not requested, 1 = Requested 0 |
INT_DMA1 | [18] | 0 = Not requested, 1 = Requested 0 |
INT_DMA0 | [17] | 0 = Not requested, 1 = Requested 0 |
INT_LCD | [16] | 0 = Not requested, 1 = Requested 0 |
INT_UART2 | [15] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER4 | [14] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER3 | [13] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER2 | [12] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER1 | [11] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER0 | [10] | 0 = Not requested, 1 = Requested 0 |
INT_WDT_AC97 | [9] | 0 = Not requested, 1 = Requested 0 |
INT_TICK | [8] | 0 = Not requested, 1 = Requested 0 |
nBATT_FLT | [7] | 0 = Not requested, 1 = Requested 0 |
INT_CAM | [6] | |
EINT8_23 | [5] | 0 = Not requested, 1 = Requested 0 |
EINT4_7 | [4] | 0 = Not requested, 1 = Requested 0 |
EINT3 | [3] | 0 = Not requested, 1 = Requested 0 |
EINT2 | [2] | 0 = Not requested, 1 = Requested 0 |
EINT1 | [1] | 0 = Not requested, 1 = Requested 0 |
EINT0 | [0] | 0 = Not requested, 1 = Requested 0 |
- INTPND寄存器可以查看优先级最高的中断标志,当处理完中断后,需要通过向指定位置写 1 手动清零相应的中断标志。
INTPND | Bit | Description Initial State |
---|---|---|
INT_ADC | [31] | 0 = Not requested, 1 = Requested 0 |
INT_RTC | [30] | 0 = Not requested, 1 = Requested 0 |
INT_SPI1 | [29] | 0 = Not requested, 1 = Requested 0 |
INT_UART0 | [28] | 0 = Not requested, 1 = Requested 0 |
INT_IIC | [27] | 0 = Not requested, 1 = Requested 0 |
INT_USBH | [26] | 0 = Not requested, 1 = Requested 0 |
INT_USBD | [25] | 0 = Not requested, 1 = Requested 0 |
INT_NFCON | [24] | 0 = Not requested, 1 = Requested 0 |
INT_UART1 | [23] | 0 = Not requested, 1 = Requested 0 |
INT_SPI0 | [22] | 0 = Not requested, 1 = Requested 0 |
INT_SDI | [21] | 0 = Not requested, 1 = Requested 0 |
INT_DMA3 | [20] | 0 = Not requested, 1 = Requested 0 |
INT_DMA2 | [19] | 0 = Not requested, 1 = Requested 0 |
INT_DMA1 | [18] | 0 = Not requested, 1 = Requested 0 |
INT_DMA0 | [17] | 0 = Not requested, 1 = Requested 0 |
INT_LCD | [16] | 0 = Not requested, 1 = Requested 0 |
INT_UART2 | [15] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER4 | [14] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER3 | [13] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER2 | [12] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER1 | [11] | 0 = Not requested, 1 = Requested 0 |
INT_TIMER0 | [10] | 0 = Not requested, 1 = Requested 0 |
INT_WDT_AC97 | [9] | 0 = Not requested, 1 = Requested 0 |
INT_TICK | [8] | 0 = Not requested, 1 = Requested 0 |
nBATT_FLT | [7] | 0 = Not requested, 1 = Requested 0 |
INT_CAM | [6] | 0 = Not requested, 1 = Requested 0 |
EINT8_23 | [5] | 0 = Not requested, 1 = Requested 0 |
EINT4_7 | [4] | 0 = Not requested, 1 = Requested 0 |
EINT3 | [3] | 0 = Not requested, 1 = Requested 0 |
EINT2 | [2] | 0 = Not requested, 1 = Requested 0 |
EINT1 | [1] | 0 = Not requested, 1 = Requested 0 |
EINT0 | [0] | 0 = Not requested, 1 = Requested 0 |
- INTOFFSET寄存器保存的是每一个中断对应的序号,当某一类中断发生了的时候,该寄存器保存相应的值。该寄存器不用手动清除。
INT Source | The OFFSET value | INT Source | The OFFSET value |
---|---|---|---|
INT_ADC | 31 | INT_UART2 | 15 |
INT_RTC | 30 | INT_TIMER4 | 14 |
INT_SPI1 | 29 | INT_TIMER3 | 13 |
INT_UART0 | 28 | INT_TIMER2 | 12 |
INT_IIC | 27 | INT_TIMER1 | 11 |
INT_USBH | 26 | INT_TIMER0 | 10 |
INT_USBD | 25 | INT_WDT_AC97 | 9 |
INT_NFCON | 24 | INT_TICK | 8 |
INT_UART1 | 23 | nBATT_FLT | 7 |
INT_SPI0 | 22 | INT_CAM | 6 |
INT_SDI | 21 | EINT8_23 | 5 |
INT_DMA3 | 20 | EINT4_7 | 4 |
INT_DMA2 | 19 | EINT3 | 3 |
INT_DMA1 | 18 | EINT2 | 2 |
INT_DMA0 | 17 | EINT1 | 1 |
INT_LCD | 16 | EINT0 | 0 |
- 由于EINT4-7、EINT8-23使用的是一个中断源,需要区分到底是哪一个IO触发外部中断。可以使用EINTPEND寄存器区分。需要通过向对应位写 1 手动清除该寄存器的标志。
EINTPEND | Bit | Description | Reset Value |
---|---|---|---|
EINT23 | [23] | It is cleard by writing “1” 0 = Not occur 1 = Occur interrupt | 0 |
EINT22 | [22] | ||
EINT21 | [21] | ||
EINT20 | [20] | ||
EINT19 | [19] | ||
EINT18 | [18] | ||
EINT17 | [17] | ||
EINT16 | [16] | ||
EINT15 | [15] | ||
EINT14 | [14] | ||
EINT13 | [13] | ||
EINT12 | [12] | ||
EINT11 | [11] | ||
EINT10 | [10] | ||
EINT9 | [9] | ||
EINT8 | [8] | ||
EINT7 | [7] | ||
EINT6 | [6] | ||
EINT5 | [5] | ||
EINT4 | [4] | ||
Reserved | [3:0] | Reserved | 0000 |