下面就来用按键K2实现中断的详细流程
1> 确定想用哪个按键(自己定,比如K2)
2> 看板子,找到那个按键,板子上印的名字是K2 3> 查看原理图找到K2对应的GPIO管脚
a> 看开发板的原理图,在开发板原理图里面找K2,发现对应的接线UART_RING
b> 查找UART_RING,发现接的是CON4的58脚
c> 知道CON4是开发板与核心板之间的接口,开发板的CON4对应核心板的CON3 (此信息来源可以咨询硬件工程师,或者自己从板子上找,可能需要把核心板和开发板分离才看得到)
d> 去核心板的原理图去继续找UART_RING,能找到它对应的是GPX1_1管脚,此管脚对应XEINT9
4> 查看芯片手册,看GPX1是怎么用的
配置GPX1CON,需要把GPX1_1配置成外部中断模式,即选择EXT_INT41[1],对应的是EXT_INT41 (通过学习芯片手册,或者通过参考别人的程序,或者参考芯片公司提供的参考方案,或者请教有经验的人)
5> 查看芯片手册,看EXT_INT41是怎么用的
配置EXT_INT41CON,设置外部中断的触发方式,比如设置成下降沿触发
配置EXT_INT41_MASK,打开中断开关 (通过学习芯片手册,或者通过参考别人的程序,或者参考芯片公司提供的参考方案,或者请教有经验的人)
6> 查看芯片手册,看XEINT9是怎么用的,第9章
查看中断源表 Table 9-2,查到外部中断EINT9对应的是SPI25号,ID
是57
(通过学习芯片手册,或者通过参考别人的程序,或者参考芯片公司提供的参考方案,或者请教有经验的人)
7> 编写程序
a> 先搭框架:一个初始化函数,一个中断处理函数 b> 具体实现
配置:
第一阶段: 1 6.2.3.198 GPX1CON 配置GPX1_1管脚为外部中断
26.2.3.211EXT_INT41CON配置中断的触发方式
36.2.3.223EXT_INT41_MASK打开管脚中断(使能中
断)
(GIC)第二阶段:
19.5.1.16 ICDISER_CPU使能相应(57号)中断
29.5.1.21 ICDIPR_CPU设置中断优先级
3 9.5.1.22 ICDIPTR_CPU 把57号中断交给那个 CPU处理(CPU0)
49.5.1.12 ICDDCR使能CPU0中断
59.5.1.2 ICCPMR_CPUn设置CPU0的中断优先级掩码为不屏
蔽
69.5.1.1 ICCICR_CPUn使能GIC中断总开关
处理:
第三阶段:
19.5.1.4 ICCIAR_CPUn得到中断号57
处理中断
26.2.3.227 EXT_INT41_PEND 清除管脚中断标志(必须清)
3 9.5.1.19 ICDICPR_CPU 清除GIC控制器的57号中断标志
4 9.5.1.5 ICCEOIR_CPUn 结束中断
中断处理函数
1. 汇编部分
保护现场调用C部分恢复现场
2. C部分
提取中断ID号,ICCIAR_CPU0
根据ID号做不同的处理
清除中断标志位,ICDICPR1_CPU0,EXT_INT41_PEND
中断结束,ICCEOIR_CPU0 c> 编译程序 make
d> 下载编译好的程序到板子的内存里运行
配置K2为中断源
一、接线:
1、在开发板上找到K2连接的是UART_RING
二、查芯片手册
配置:
1、配置GPX1_1管脚为外部中断
2、配置中断触发方式为下降沿触发
3、打开管脚中断,使能中断
4、使能相应中断
ICDISER1_CPU0=ICDISER1_CPU0|(1<(57-32))
6、把中断57交给CPU0处理
每个中断交给那个CPU处理由8个bit位描述,例如交给核心0处理,那么对应的8bit位为0b00000001,一共160个中断源,160*8/32=40,所以每个核心需要40个对应的寄存器
ICDIPTR14_CPU0=ICDIPTR14_CPU0&~(0xFF<<8)|(1<<8)
5、设置中断优先级
ICDIPR14_CPU0=ICDIPR14_CPU0&~(0xFF<<8)|(12<<8) 7、打开CPU0中断
ICDDCR=1
8、设置CPU0的中断优先级掩码为不屏蔽
中断优先级掩码默认为0,屏蔽所有中断,需要设置0-7bit位为0XFF,响应所有中断。ICCPMR_CPU0=0xFF 9、使能GIC中断总开关
ICCICR_CPU0=1
中断处理:
1、得到中断号
ICCIAR_CPU0 & (0x3FF)
2、清除管脚中断标志
EXT_INT41_PEND |= 1 << 1
3、清除GIC控制器的SPI 25(57)中断标志
ICDICPR1_CPU0 |=1<< (57-32)
4、结束中断
ICCEORIR_CPU0 = ICCEORIR_CPU0 & ~(0x3FF) | iNum