一、ARM状态寄存器
1、ARM架构工作模式
(1)用户模式(usr):ARM处理器正常的程序执行状态
(2)快速中断模式(fiq):用于高速数据传输或通道处理
(3)中断模式(irq):用于通用的中断处理
(4)管理模式(svc):操作系统使用的保护模式
(5)数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储集存储保护
(6)系统模式(sys):运行具有特权的操作系统任务
(7)未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
2、寄存器
(1)通用寄存器分类:
不分组寄存器(r0-r7)
分组寄存器(r8-r14):r13为堆栈指针sp,指向栈顶;r14为子程序链接寄存器lr,指向函数返回地址(调用返回和中断返回)
程序计数器(r15):pc
(2)程序状态寄存器(6个)
CPSR(32位):
N(31):cmp比较结果:A<B -> N=1;A>=B -> N=0
Z(30):cmp比较结果:A=B -> Z=1
I(7):当I=1 不可被中断
F(6):当F=1 不可被快速中断
M(0-4):工作模式
0b10000:usr
0b10001:fiq
0b10010:irq
0b10011:svc
0b10111:abt
0b11011:und
0b11111:sys
CPSR_svc(32位):拷贝CPSR
CPSR_abt(32位):拷贝CPSR
CPSR_und(32位):拷贝CPSR
CPSR_fiq(32位):拷贝CPSR
CPSR_irq(32位):拷贝CPSR
3、异常向量表(uboot -> start.S)
当发生中断时,程序会跳转至中断向量表的中断函数,当中断执行结束之后返回之前的程序上下文。
.globl _start
_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
_fiq: .word fiq
二、中断实现
1、实现过程
(1)使能中断
(2)判断中断源
(3)中断方式(引脚):高电平/低电平/上升沿/下降沿
(4)引脚工作模式设置:设置位中断模式
三、实现
1、伪代码
1、设置异常向量表
2、设置栈指针
3、关闭看门狗
4、进入中断模式,设置中断模式栈指针
5、进入管理模式,设置管理模式栈指针
6、初始化LED引脚
7、调用中断初始化函数
8、设置cpsr_c,开启IRQ中断 I=0
9、设置返回地址,调用main函数
2、参考程序
参考程序:https://download.youkuaiyun.com/download/liutit/86764983