ARM11(3)——外部中断
WF 2013.1.24
最近正在学习ARM11(S3C6410开发板)的外部中断部分,稍有心得,特此总结一些学习笔记,分享出来,献给那些像我一样正在ARM11上裸奔的嵌入式学徒们,同时也希望看到此文的业界前辈多多指教。
外部中断基础知识总结:
ARM11(S3C6410开发板)共有187根多功能I/O口,其中127根可用于外部中断,而这127个外部中断引脚又被分为十组:EINT0~EINT9,这十组对应VICX(中断矢量寄存器)中0、1、32、33、53五个中断号。十组外部中断和五个中断号之间的对应关系却是略显复杂:EINT0共28根引脚被分为了四部分分别对应了0、1、32、33四个中断号,EINT1~EINT9这9组共99根引脚却只对应了53一个中断号。
外部中断逻辑图:
矢量寄存器
中断代号
中断数目
中断组
引脚名
引脚数
VIC0
0
28
EINT0
GPN0~GPN3
4
1
GPN4~GPN11
8
VIC1
32
GPN12~GPN15
GPL8~GPL11
8
33
GPM0~GPM4
GPL12~GPL14
8
53
99
EINT1~EINT9
99
外部中断的基本编程思想总结:
初始化I/O引脚设置——GPX;
(1)、必须设置所需引脚为中断模式——GPXCON;
(2)、可选性设置上下拉电阻和数据位——GPXPUD、GPXDAT;
2、初始化外部中断设置——EINTX;
(1)、选择外部中断的触发方式——EINTXCON;
(2)、清除外部中断屏蔽——EINTXMASK;
(3)、外部中断悬挂给1置0——EINTXPEND;
3、初始化总中断设置——VICX;
(1)、选择中断模式——VICXINTSELECT;
(2)、设置中断函数入口——VICXVECTADDR;
(3)、中断使能——VICXINTENABLE;
4中断函数出口处设置;
(1)、清除当前中断函数记录——VICXADDR;
(2)、给1置0外部中断悬挂位——EINTXPEND。
程序实例:
程序说明:实现按键中断控制LED灯的显示,每按一个键LED会显示一种方案。
.c文件代码:
//引入GPN引脚(外接按键)三个寄存器的地址标号
#define rGPNCON (*(volatile unsigned*)(0x7f008830))
#define rGPNDAT (*(volatile unsigned*)(0x7f008834))
#define rGPNPUD (*(volatile unsigned*)(0x7f008838))
//引入GPM引脚(外接LED灯)三个寄存器的地址标号
#define rGPMCON (*(volatile unsigned*)(0x7f008820))
#define rGPMDAT (*(volatile unsigned*)(0x7f008824))
#define rGPMPUD (*(volatile unsigned*)(0x7f008828))
//引入外部中断控制寄存器的地址标号
#define rEINT0CON0 (*(volatile unsigned*)(0x7f008900))
#define rEINT0MASK (*(volatile unsigned*)(0x7f008920))
#define rEINT0PEND (*(volatile unsigned*)(0x7f008924))
//引入总中断控制寄存器的地址标号
#define rVIC0INTSELECT (*(volatile unsigned*)(0x7120000C))
#define rVIC1INTSELECT (*(volatile unsigned*)(0x7130000C))
#define VIC0VECTADDR0 (*(volatile unsigned*)(0)
#define VIC0VECTADDR1 (*(volatile unsigned*)(0)
#define rVIC0INTENABLE (*(volatile unsigned*)(0)
#define rVIC0ADDR (*(volatile unsigned*)(0x71200f00))
#define rVIC1ADDR (*(volatile unsigned*)(0x71300f00))
int keyva=0;//定义全局变量keyva,用于记录键值
int wait(int tm)//延时函数
{
int i,j;
for(i=0;i
for(j=0;j<125;j