大部分内容转自 种菜大爷,在他的基础上加一些自己不明白的地方注释和修改,如有侵权,联系我,第一时间删掉。
S3C2440的中断分为两大类: 外部中断 和 内部中断.
一 外部中断
**EXTINT[x]: 用来配置各个引脚的中断触发方式 (高电平触发、低电平触发、下降沿触发、上升沿触发), 注意该寄存器与中断源的对应关系
EINTPEND[x]: xxxPEND的寄存器都是状态寄存器, 初始化时先清除标志, 在清除中断的时候将寄存器的值赋值给本身即可
EINTMASK[x]: 1 屏蔽中断; 0 未屏蔽
SRCPND[x]: 1 申请中断; 0 未申请中断
EINTFLT0~EINTFLT3: 配置滤波时钟和滤波宽度
INTMOD[x]: 1: FIQ, 0: IRQ
二 内部中断
内部中断分两种: 带子中断的中断 和 不带子中断的中断
不带子中断(): 发生中断后 SRCPEND置位, 如果没有被 INTMSK屏蔽, 那么继续向下一步申请中断
带子中断: 发生中断之后, 先将 SUBSRCPEND 置位, 如果没有INTSUBMSK屏蔽则向 SRCPEND申请中断. 如果没有被INTMSK屏蔽则进一步向下申请中断
中断的优先级:
ARB_MODEx: 控制中断优先级是否轮转
ARB_SELx: 控制轮转顺序
中断的开启(xxxMSK):
1 外部中断: EINT4~23先初始化EINTMSK 和 INTMSK, 如果是EINT0~3直接初始化INTMSK
2 内部中断: 有子中断先初始化 INTSUBMSK 再初始化 INTMSK, 如果是不带子中断的内部中断直接初始化 INTMSK
中断的清除(xxxPEND):
1 外部中断: 如果是EINT4~23 先清除EINTPEND 再清除SRCPND、最后清除 INTPND (注意顺序), 如果是 EINT0~3 先清除SRCPND.,然后清除 INTPND (不需要清除 EINTPEND)
2 内部中断: 带子中断, 先清除 SUBSRCPND再清除SRCPND(注意顺序); 不带子中断直接清除SRCPND
3 清除中断是写 1 清除
代码执行示意图:
Makefile
objs := head.o init.o interrupt.o main.o
# $^ 代表所有的依赖文件。 $@--目标文件,$<--第一个依赖文件。
int.bin: $(objs)
arm-linux-ld -Ttext 0x00000000 -o int_elf $^
arm-linux-objcopy -O binary -S int_elf $@ # binary:二进制的 -S:不从源文件复制重定位信息和符号信息到目标文件中去
arm-linux-objdump