技术文章: 基于ARM Cortex-A9中断详解
由上图所示:
EXT_INT41_PEND清相应的中断源ICDICPR中断结束后,清相应中断标志位,此标志位由硬件置位ICCEOIR中断执行结束,清cpu内相应的中断号,由硬件填充3. 寄存器汇总
前面分析了按键连接的是GPX1_1,现在我们来看下对应的寄存器应该如何配置
【1】、GPIO控制器GPX1PUD
将GPX1_1引脚的上拉和下拉禁止
GPX1PUD[3:2]= 0b00;
GPX1CON
GPX1CON
将GPX1_1引脚功能设置为中断功能
GPX1CON[7:4] = 0xf
EXT_INT41CON
EXT_INT41CON
配置成成下降沿触发:
EXT_INT41CON[6:4] = 0x2
EXT_INT41_MASK
EXT_INT41_MASK
中断使能寄存器
EXT_INT41_MASK[1] = 0b0
EXT_INT41_PEND 中断状态寄存器
EXT_INT41_PEND
当GPX1_1引脚接收到中断信号,中断发生,中断状态寄存器EXT_INT41_PEND 相应位会自动置1注意:中断处理完成的时候,需要清除相应状态位。置1清0.
EXT_INT41_PEND[1] =0b1
【2】GIC
根据外设中断名称EINT9来查看该中断对应的GIC中维护的HW id。【所有的中断源在芯片厂商设计的时候都分配了唯一的一个ID,GIC通过该ID来驱动中断源】
查看芯片手册(datasheet -- 9.2表)
GIC中断源表
通过【9.2中断源表】找到和外设中断标示对应的中断控制器中断标识(GPIO有32个可被唤醒寄存器)其对应「EINT[9],中断ID为57」,这是非常重要的,在后面的寄存器设置中起很大作用;
1) ICDISER使能相应中断到分配器
ICDISER
ICDISER用于使能相应中断到分配器,一个bit控制一个中断源,一个ICDISER可以控制32个中断源,这里INT[9] 对应的中断ID为57,所以在ICDSER1中进行设置,57/32 =1余25,所以这里在ICDISER1第25位置一。
ICDISER.ICDISER1 |= (0x1 << 25); //57/32 =1...25 取整数(那个寄存器) 和余数(哪位)
ICDIPTR选择CPU接口
ICDIPTR
ICDIPTR
选择cpu
ICDIPTR寄存器每8个bit 控制一个中断源,其中CPU0可以处理160个中断源,所以需要40个寄存器。要选择cpu0第一个bit必须是1。
设置SPI[25]/ID[57]由cpu0处理,57/4=16余1 所以选择寄存器ICDIPTR14的第2个字节[15:8]。
//SPI 25 interrupts are sent to processor 0
//57/4 = 14..1 14号寄存器的[15:8]
ICDIPTR.ICDIPTR14 |= 0x01<<8;
ICDDCR使能分配器
还寄存器用于使能分配器。
ICDDCR =1;
ICCPMR优先级屏蔽寄存器,设置cpu0能处理所有的中断。比如中断屏蔽优先级为255,该值表示优先级最低,所有的中断都能响应。
ICCPMRCPU0.ICCPMR = 0xFF;//设置cpu0 中断屏蔽优先级为255 最低,所有中断都能响应)
ICCICR 全局使能cpu0中断处理
ICCICR
EXYNOS 4412一共有4个cpu,用4个寄存器分别来控制4个cpu,每个寄存器的bit[0]用于全局控制对应的cpu。我们选择cpu0处理中断,将bit[0]置1即可。
CPU0.ICCICR |= 0x1;
使能中断到CPU。
ICCIAR
ICCIAR
当中断发生之后,中断的HW id值会由硬件写入到寄存器ICCIAR[9:0]中;对于SGIs来说,多处理器环境下,CPU的interface值写入到[12:10]中。
读取HW id:
int irq_num;
irq_num = CPU0.ICCIAR&0x3ff; //获取中断号
图片新闻
技术文库
最新活动更多
-
1月8日火热报名中>> Allegro助力汽车电气化和底盘解决方案优化在线研讨会
-
1月9日立即预约>>> 【直播】ADI电能计量方案:新一代直流表、EV充电器和S级电能表
-
即日-1.16立即报名>>> 【在线会议】ImSym 开启全流程成像仿真时代
-
即日-1.20限时下载>>> 爱德克(IDEC)设备及工业现场安全解决方案
-
即日-1.24立即参与>>> 【限时免费】安森美:Treo 平台带来出色的精密模拟
-
即日-1.31立即参与>>> 【限时免费下载】村田白皮书
推荐专题
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论