外设中断产生 + CPU响应中断并返回的控制流程

假设外设为物理按键,需要连接到支持中断功能的对应的GPIO上。
CPU型号为:三星的S5PV210
本文所描述的中断控制流程适用性广泛,因为主流CPU的中断设计原理是相通的,只有细节的差异。


第一部分:按键外设对应中断功能的配置
1、按键对应的GPIO模式设置:设置为EXT_INT模式
2、该外设对应的中断触发模式设置:电平或边沿触发
3、该外设中断Mask和Pend寄存器位设置
4、编写该外设中断对应的ISR中断处理函数程序


第二部分:CPU内部响应中断的配置
Part1:前期准备工作
1、初始化系统异常控制器函数system_init_exception()
   功能如下:
   绑定异常向量表对应的中断服务函数;
   关闭所有中断使能;
   选择中断类型为IRQ;
   清空中断向量控制地址寄存器VICxADDR
   
2、绑定写好的中断处理函数程序ISR到中断控制器对应的VICnVECTADDR寄存器

3、使能对应中断向量编号的中断源,即外设按键对应的中断源编号

Part2:外部按键产生中断后,CPU响应该中断
1、CPU读取异常向量表信息,并跳转到IRQ函数的入口地址
2、先进行程序现场保护(在Start.s完成),然后跳转到irq_handler()函数,
3、该irq_handler()函数功能用于判断具体哪个中断向量寄存器VIC发生中断,并调用对应的外设按键对应的ISR中断处理函数
4、ISR函数执行完毕后,程序现场恢复(在Start.s完成),并返回到主函数继续执行后续的程序。

// 在这个汇编函数中,用来做中断模式下的现场保护和恢复,并且调用真正的中断处理程序
IRQ_handle:
	// 设置IRQ模式下的栈
	ldr sp, =IRQ_STACK
	// 保存LR
	// 因为ARM有流水线,所以PC的值会比真正执行的代码+8,
	sub lr, lr, #4
	// 保存r0-r12和lr到irq模式下的栈上面
	stmfd sp!, {r0-r12, lr}
	// 在此调用真正的isr来处理中断
	bl irq_handler
	// 处理完成开始恢复现场,其实就是做中断返回,关键是将r0-r12,pc,cpsr一起回复
	ldmfd sp!, {r0-r12, pc}^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值