技术文章: 基于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; //获取中断号
图片新闻
最新活动更多
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
11月29日立即预约>> 【上海线下】设计,易如反掌—Creo 11发布巡展
-
11月30日立即试用>> 【有奖试用】爱德克IDEC-九大王牌安全产品
-
即日-12.5立即观看>> 松下新能源中国布局:锂一次电池新品介绍
-
12月19日立即报名>> 【线下会议】OFweek 2024(第九届)物联网产业大会
-
即日-12.26火热报名中>> OFweek2024中国智造CIO在线峰会
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论