数据手册
向量模式的中断编程
1、初始化中断(中断源)
.配置端口引脚功能为中断
2、配置中断
1)配置下降沿触发
中断配置寄存器(EINT0CON0...)
2)取消中断屏蔽位
找到对应中断屏蔽寄存器(...);取消屏蔽(写0)
3)使能中断(中断使能寄存器VIC0INTENABLE、VIC1INTENABLE)
.VIC0、VIC1各对应32个中断源;不同的中断源对应中断使能控制器的不同位,即VIC0INTENABLE寄存器的每一位控制一个中断源。中断源的对应
号见手册P412(eint0(0)对应中断控制器0--vic0 \ eint20(33)对应中断 控制器1--vic1)
.使能总中断--cpsr的I位清零
-----------------------------------------------------------------------------------------------
中断处理程序部分:
.保存环境
.处理部分
.清除中断
1、EINT0PEND0 :外部中断未决寄存器,对应位被置位时说明该位对应的中断已发生,执行过中断处理程序后应将该位清零。
2、VIC0ADDRESS、VIC1ADDRESS清零
中断处理时,会将对应该中断的处理程序地址放在这个寄存器中,处理完中断后,应将其内容清零
疑问:
1、向量中断表的使用:
2、中断处理向量必须放在向量表的连续地址??不放在一起,灯不亮
关于支持的中断源(64个)P411
关于中断向量寄存器(VICx)汇总:P414
由VIC0INTENABLE寄存器的每一位对应着每一个中断源,使其使能
关于6410的向量中断编程(同时也支持非向量中断)
.向量中断(6410需使能、210不用使能):初始化时设置,将不同中断源的处理程序放置在中断向量地址寄存器( VECTOR ADDRESS REGISGERS,VIC0VECTADDR[31:0])中,之后由硬件实现处理不同的中断。
.非向量中断(2440):统一的中断处理入口,不同的中断源对应着不同的中断处理程序--由软件实现
向量模式的中断编程
1、初始化中断(中断源)
.配置端口引脚功能为中断
2、配置中断
1)配置下降沿触发
中断配置寄存器(EINT0CON0...)
2)取消中断屏蔽位
找到对应中断屏蔽寄存器(...);取消屏蔽(写0)
3)使能中断(中断使能寄存器VIC0INTENABLE、VIC1INTENABLE)
.VIC0、VIC1各对应32个中断源;不同的中断源对应中断使能控制器的不同位,即VIC0INTENABLE寄存器的每一位控制一个中断源。中断源的对应
号见手册P412(eint0(0)对应中断控制器0--vic0 \ eint20(33)对应中断 控制器1--vic1)
.使能总中断--cpsr的I位清零
向量模式的中断编程代码:
void int_irq(void)
{
//1、设置外部中断为下降沿触发
*(EINT0CON0) = 0b010 | (0b010<<8);
//2、取消中断屏蔽位EINT0MASK[0]、[5]
*(EINT0MASK) &= ~(1 | (1<<5));
/* *(EINT0MASK) = 0; */
//3、使能中断源;见 数据手册P410 需要注意其使能方式。。。。
*(VIC0INTENABLE) |= (0b1 )| (0b10);
//向中断向量地址寄存器写入不同中断源对应的中断处理程序
*(EINT0_ADDR) = (int)key2_irq;
*(EINT5_ADDR) = (int)key7_irq;
__asm__ (
"mrc p15,0,r0,c1,c0,0\n"
"orr r0,r0,#(1<<24)\n"
"mcr p15,0,r0,c1,c0,0\n"
"mrs r0, cpsr\n"
"bic r0, r0, #0x80\n"
"msr cpsr, r0\n"
:
:
);
}
-----------------------------------------------------------------------------------------------
中断处理程序部分:
.保存环境
.处理部分
.清除中断
1、EINT0PEND0 :外部中断未决寄存器,对应位被置位时说明该位对应的中断已发生,执行过中断处理程序后应将该位清零。
2、VIC0ADDRESS、VIC1ADDRESS清零
中断处理时,会将对应该中断的处理程序地址放在这个寄存器中,处理完中断后,应将其内容清零
.恢复环境
中断处理部分代码:
void key2_irq(void)
{
//1、保存环境
__asm__(
"sub lr, lr, #4\n"
"stmfd sp!, {r0-r12,lr}\n"
);
//2、处理部分
led_on();
//3、清除中断
*(EINT0PEND) = ~0x0;
*(VIC0ADDRESS) = 0;
//*(VIC1ADDRESS) = 0;
//4、恢复环境
__asm__(
"ldmfd sp!, {r0-r12,pc}^\n"
:
:
);
}
疑问:
1、向量中断表的使用:
//向中断向量地址寄存器(VECTOR ADDRESS REGISGERS)写入不同中断源对应的中断处理程序
#define EINT0_ADDR (volatile unsigned long*)0x71200100 /不同中断源对应不同地址的中断处理程序
#define EINT5_ADDR (volatile unsigned long*)0x71200104</span>
<pre name="code" class="html"> *(EINT0_ADDR) = (int)key2_irq;
*(EINT5_ADDR) = (int)key7_irq;
2、中断处理向量必须放在向量表的连续地址??不放在一起,灯不亮