嵌入式linux-ARM体系结构及接口技术,ARM中断机制,外部中断的配置,协处理器指令修改异常向量表起始地址,清中断标志

本文深入解析ARM中断机制,包括硬件机制、中断过程、中断源及控制器。详细介绍了外部中断配置流程,从查看原理图到配置I/O口为中断模式,再到设置中断触发方式和使能外部中断。内部设置涉及GIC中断使能、分发配置和优先级设定。同时,探讨了中断处理程序的编写,包括异常向量表的设置、中断ID号的获取、中断标志的清除和中断的结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,ARM中断机制

1.1,中断硬件机制

在这里插入图片描述

1.2,中断过程

在这里插入图片描述

1.3,中断源

Exynos4412中断控制器包含160个中断控制源,分三类分别是:
用于CPU之间通信的SGI
(Software Generated Interrupt)
专用于特定CPU核的PPI
(Private Peripheral Interrupt)
被多个CPU核共享的SPI
(Shared Peripheral Interrupt)

1.4,中断控制器

中断源分发给不同的CPU.
每个中断都有一个唯一对应的ID号,当中断发生时,该ID号会写入一个特定的寄存器。
中断处理程序可以读取该寄存器来决定该调用哪个具体的中断处理函数。
在这里插入图片描述

2,外部中断的配置

2.1,查看原理图

在这里插入图片描述
在这里插入图片描述

可以看到按键k2,挂载在GPX1_1引脚上,对应XEINT9

2.2,外部,配置芯片管脚工作模式

2.2.1,配置I/O口为中断模式

在这里插入图片描述

在这里插入图片描述

GPX1CON = (GPX1CON & ~(0x0f << 4) | (0x0f << 4));		// 设置管脚为中断模式   

2.2.2,配置中断为下降沿触发

在这里插入图片描述
在这里插入图片描述

EXT_INT41_CON = (EXT_INT41_CON & ~(0X07 << 4)) | (0X02 << 4);		//设置中断触发方式为下降沿

2.2.3,使能外部中断

在这里插入图片描述
在这里插入图片描述

EXT_INT41_MASK = (EXT_INT41_MASK & ~(0X01 << 1)) | (0X00 << 1);		//管脚中断使能(一关)

2.3,内部,设置功能模块(中断控制模块 GIC)

2.3.1,查GIC中断表,找出对应的中断端口号和ID号

在这里插入图片描述
在这里插入图片描述
XEINT9对应的中断端口号是25,ID号是57

2.3.2,设置GIC中断使能

在这里插入图片描述
在这里插入图片描述

ICDISER1_CPU0 = ICDISER1_CPU0 | (0x01 << 25); 	//使能对应中断(二关) 

2.3.3,分发配置

在这里插入图片描述
在这里插入图片描述

根据样例选用默认设置

//#define  ICDIPTR17_CPU0 (*(volatile unsigned int *)0x10490844) 	//分发配置,根据样例选用默认设置
#define  ICDIPTR14_CPU0 (*(volatile unsigned int *)0x10490838) 	//分发配置,根据样例选用默认设置
//ICDIPTR17_CPU0 = 0x01010101;
ICDIPTR14_CPU0 = 0x01010101;

ICDIPTR17_CPU0 = 0x01010101; //分发器中断使能 (三关),根据样例选用默认设置

2.3.4,分发总使能

在这里插入图片描述

ICDDCR = ICDDCR | 0X01;		//分发器中断使能 (三关)

2.3.5,CPU外部中断借口使能

在这里插入图片描述

ICCICR_CPU0 = ICCICR_CPU0 | 0x01;		//CPU接口中断使能(四关)

2.3.6,设置CPU的中断优先级门限值

在这里插入图片描述

ICCPMR_CPU0 = 0xff;		//设置CPU的中断优先级门限值,当前为最低,所有的中断都可以处理     

3,中断处理

3.1,协处理器指令修改异常向量表起始地址

  1. CPU规定的异常向量表的地址是从0x00开始的,其中中断异常的地址是0x18
  2. 但是想开发版中下载程序的时候我们会制定一个起始地址,这样异常向量表的起始地址就不是0x00了
  3. 所以,需要重新制定模拟的异常向量表的起始地址
MRC Pn,op1,Rd,CRn,CRm,op2  //mrc  p15,0,r0,c1,c0,0 读入cp15的c1寄存器的内容到r0中
MCR Pn,op1,Rd,CRn,CRm,op2  //mcr  p15,0,r0,c1,c0,0 写r0内容到cp15的c1寄存器中

通过协处理器设置异常向量表的起始地址为0x40008000

@ set Vector Base Address 为0x40008000	
ldr      r0,=0x40008000
mcr    p15,0,r0,c12,c0,0

在这里插入图片描述

3.2,异常向量表

_start: b       start_code
ldr     pc, _undefined_instruction
ldr     pc, _software_interrupt
ldr     pc, _prefetch_abort
ldr     pc, _data_abort
ldr     pc, _not_used
ldr     pc, _irq
ldr     pc, _fiq
_undefined_instruction: .word _undefined_instruction
_software_interrupt:    .word _software_interrupt
_prefetch_abort:        .word _prefetch_abort
_data_abort:            .word _data_abort
_not_used:              .word _not_used
_irq:                   .word irq_handler 
_fiq:                   .word _fiq
irq_handler:
	sub  lr,lr,#4 
	stmfd sp!,{r0-r12,lr}  @保护现场
	bl	do_irq
irq_handler_end:
	ldmfd sp!,{r0-r12,pc}^ @恢复现场
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值