目录
1.启动文件思路编写——start.s
1.程序入口——_start:
中断向量表:当执行某个函数的时候,就跳转到某个函数里面去
2.复位中断——Reset_Handler:
当发送复位时,函数执行到这里。
(1)关闭IRQ中断
(2)关闭I,Dcash等
(3)向量偏移(也可以在C语言中写)
(4)设置各个模式(IRQ,SYS,SVC)
(5)打开IRQ中断
(6)跳到c函数
3.IRQ中断——IRQ_Handler:
当执行中断函数时,函数执行这里
(1)保存 lr ro-r3,r12寄存器——为了执行中断之后可以返回到之前的状态
(2)把r0设置为存放特殊寄存器的寄存器
(3)把r1设置为设置为GIC寄存器组首地址
(4)设置r1为gic中的接口器地址
(5)设置r0为gic中IAR用来保存中断号的寄存器
(6)保存r0和r1
(2)进入SVC模式
(1)保存 lr
(2)设置r2为system_irqhandler
(3)进入r2,且r0为该函数的输入参数
中断执行完中断后
(4)出栈lr
(3)进入IRQ
(1)出栈 r0,r1
(2)把r0写到r1+0x10——把GICC_IAR值写到GICC_EOIR里面
(3)出栈r0
(4)将r0写到spsr特殊寄存器
(5)出栈 ro-r3,r12寄存器和 lr
(6)将lr-4的值赋给pc——因为lr-4才是pc当前要运行的值
4.其他默认函数
直接写死循环就行
2.中断服务函数思路编写——int. c
1.中断初始化函数
(1)GIC初始化
(2)初始化中断表为默认值——数组每个元素的服务函数为死循环,参数为NULL
(3)设置中断偏移
2.中断注册函数——用来给中断数组表里面的中断函数赋值
(1)数组里的1号位置函数赋值
(2)数组里的1号位置参数赋值
3.中断服务函数
(1)先判断中断号是否正确
(2)根据中断ID对数组里面对应的中断服务函数进行赋值
3.GPIO模块思路编写——gpio.c
1.gpio中断设置
(1)关闭EDGE_SEL——不关的化,ICR失效
(2)判断是ICR1还是ICR2——低16是1,高16是2
(3)利用switch语句选择触发方式,从而调整寄存器
2.gpio初始化设置
(1)在原有基础上,引入中断设置初始化——之前只有输入输出,输出电位
3.gpio中断使能和禁止函数
(1)使能:设置IMR寄存器位1
(2)禁止:设置IMR寄存器位0
4.gpio中断标志位清除函数思路编写
(1)设置ISR寄存器为1
4.按键中断执行函数思路编写——exti.c
1.gpio和中断初始化
(1)GOIO初始化(复用,输入输出,触发)
(2)GIC初始化——初始化中断ID
(3)中断注册函数初始化——防止当前中断未结束下一个中断又来了
2.中断执行函数设置
(1)读取引脚值进行改变beep状态
(2)清除中断标志位
5.总结
启动文件:建立中断向量表,并给表中的复位和IRQ写上具体执行内容(主要是cp15)
中断文件——int.c:设置一个数组,且内容是结构体(函数+参数),并对数组各元素初始化(函数=死循环,参数=NULL),再建立注册函数,和启动文件对应的中断函数
中断初始化——gpio.c:初始化触发方式
按键中断——exit.c:初始化对于按键(复用,输入输出,触发),GIC,注册函数。并编写具体执行中断函数