现在的位置: 首页 > 综合 > 正文

中断笔记

2018年03月20日 ⁄ 综合 ⁄ 共 1952字 ⁄ 字号 评论关闭


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了,好让你查询,普通中断跳转时查询用。清除INTPNDSRCPND时自动清除。

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);

}


以上均为个人拙见,欢迎指正。 

【上篇】
【下篇】

抱歉!评论已关闭.