S5PV210的中断应用实例
2016年01月21日 10:54 发布者:designapp
实验程序可以从四个方面设计:一是启动程序的设计,主要是对ARM工作模式的配置和中断服务程序的设计;二是初始化程序,包括S5PV210中断控制器的初始化、GPIO引脚的配置;三是主程序设计;最后编写Makefile,编译生成目标文件。下面就从这四方面编写测试代码以及代码的详解。1.启动程序start.S
前面已介绍过,S5PV210本身的固化代码(iROM)在上电后配置好IRQ中断的栈,以及系统模式所使用的栈,所以在启动代码中可以不用设置这些栈(如果重新配置也可以),所以实验的启动程序比较简单,主要是当中断发生时先保存现场,跳到中断服务程序执行中断处理,处理结束再恢复现场。具体代码示例如下:
01 .text
02 .global _start/*声明一个全局的标号*/
03 .global IRQ_handle
04_start:
06mrs r0,cpsr
07bic r0,r0,#0x00000080/*使能IRQ中断bit=0 */
08msr cpsr,r0
09bl main
10 halt_loop:
11bhalt_loop/*死循环,不让程序跑飞*/
12
13 IRQ_handle:
14sub lr, lr, #4/*计算返回地址*/
15stmdb sp!, {r0-r12, lr} /*保存用到的寄存器*/
16bl irq_handler/*跳到中断服务函数*/
17ldmia sp!, {r0-r12, pc}^/*中断返回, ^表示将spsr的值复制到cpsr */
2.初始化阶段
初始化阶段重点讲下外部中断控制寄存器的配置方法,以及中断向量控制寄存器的设置,关于LED相关的引脚配置不作重复介绍。
……
08 #define GPH0CON*((volatile unsigned int *)0xE0200C00)
09 #define GPH0DAT*((volatile unsigned int *)0xE0200C04)
10 #define EXT_INT_0_CON*((volatile unsigned int *)0xE0200E00)
11 #define EXT_INT_0_MASK*((volatile unsigned int *)0xE0200F00)
12
13 #define VIC0IRQSTATUS*((volatile unsigned int *)0xF2000000)
14 #define VIC0INTSELECT*((volatile unsigned int *)0xF200000C)
15 #define VIC0INTENABLE*((volatile unsigned int *)0xF2000010)
16 #define VIC0VECTADDR0*((volatile unsigned int *)0xF2000100)
17 #define VIC0VECTADDR1*((volatile unsigned int *)0xF2000104)
18 #define VIC0ADDRESS*((volatile unsigned int *)0xF2000F00)
19
20 extern void IRQ_handle(void);
……
38 //配置中断引脚
39 void init_key(void)
40 {
41//配置GPIO引脚为中断功能
42GPH0CON &= ~(0xFF int.dis
07
08 %.o : %.c
09arm-linux-gcc -c -O2 $< -o $@
10
11 %.o : %.S
12arm-linux-gcc -c -O2 $< -o $@
13
14 clean:
15rm -f *.o *.elf *.bin *.dis
将以上编写好的源代码上传到宿主机上编译生成可执行的目标文件int.bin,然后烧写到开发板上电测试。
实验最终结果是:当按下“KEY1”,LED1灯会被点亮或熄灭;当按下“KEY2”,LED2灯会被点亮或熄灭。