6410中断编程

数据手册

关于支持的中断源(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、中断处理向量必须放在向量表的连续地址??不放在一起,灯不亮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值