1、I/O操作步骤。
(1、初始化中断方式寄存器(源未决寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器、中断未决寄存器)。
(2、I/0端口或部件完成数据操作后产生中断请求信号
(3、中断有效-》微处理器,允许中断-》中断源识别
(4、微处理器,转到对应中断服务例程入口——》应答中断——》I/O、收到应答信号,撤销请求。
(5、微处理器读入或写出数据。中断例程结束。
2.中断分两大类:内部中断和外部中断。
3.外部中断。
寄存器:
EXTINT: 外部中断控制寄存器
EXTINT0:INT0-7。
EXTINT1:INT8-15。
EXTINT2:INT9-23。
4.内部中断。
寄存器:
SRCPND :源未决寄存器。(0=中断没发出请求,1=中断源发出请求)
INTMOD: 中断模式寄存器。(0 = IRQ 模式,普通中断,1 = FIQ 模式,快中断)
INTMSK: 中断屏蔽寄存器。 (0 = 允许响应中断请求, 1 = 中断请求屏蔽)
PRIORITY :优先级寄存器。。。。。
INTPND : 中断未决寄存器。中断发生后,SRCPND中会有位置1,可能好几个(因为同时可能发生几个中断),这些中断会由优先级仲裁器选出一个最紧迫的,然后吧把INTPND中相应位置1,所以同一时间只有一位是1。也就是说前面的寄存器置1 是表示发生了,只有INTPND置1,CPU才会处理。
INTOFFSET :用来表示INTPND中哪一位置1了,好让你查询,普通中断跳转时查询用。清除INTPND、SRCPND时自动清除。
5.设置外部中断的一般方法是:
(1、设置GPIO口功能(挑选GPx组),00:输入,01:输出,10:第二功能
(2、设置EXTINTx寄存器,设定中断触发类型(EXTINT0 — 2)
(3、设置EINTPND,若发生中断则某位置1,使用前先清零(写1清零)
(4、设置EINTMASK,0表示允许中断,1表示禁止,默认禁止
(5、清IRQ中断EXTINT8_23属于IRQ中断号5,ClearPending(BIT_EINT8_23);
(6、设置中断处理函数,pISR_EINT8_23 = (U32)isrEINT0;
(7、允许中断,EnableIrq(BIT_EINT8_23);
6.实例:
void int_init(void)
{
rSRCPND =rSRCPND; //clear all interrupt
rINTPND =rINTPND; //clear all interrupt
////////////////初始化寄存器
rGPFCON = (rGPFCON& 0xffcc) | (1<<5) | (1<<1); //设置GPFO-EINT PF0/2 =
EINT0/2
rGPGCON = (rGPGCON& 0xff3fff3f) | (1<<23) | (1<<7); // 设置GPGO-EINT[8] PG3/11 = EINT11/19
///////////////传递中断服务函数的地址给对应中断向量处
pISR_EINT0=(UINT32T)isrEINT0;/中断服务程序 int0_int地址:isrEINT0;
pISR_EINT8_23=(UINT32T)isrEINT11_19;//中断服务程序int11_int地址:isrEINT11_19;
///////////////寄存器复位
rEINTPEND =0xffffff;
rSRCPND =BIT_EINT0 | BIT_EINT8_23;//to clear the previous pending states
rINTPND =BIT_EINT0 | BIT_EINT8_23;
/////////////外部中断触发方式
rEXTINT0 =(rEXTINT0 & ~((7<<8) | (0x7<<0))) |
0x2<<8 |0x2<<0;
//下降沿触发 EINT0/2=falling edge triggered
rEXTINT1 =(rEXTINT1 & ~(7<<12)) | 0x2<<12;
//下降沿触发 EINT11=falling edge triggered
///////////// 各个中断屏蔽寄存器
rEINTMASK&= ~(1<<11);
/////////////关闭总中断源,设置寄存器INTMSK
rINTMSK &= ~(BIT_EINT0 | BIT_EINT8_23);
}
以上均为个人拙见,欢迎指正。