您的位置:首页 > 其它

ARM中断分析之二:裸机下面的中断处理,以EINT4为例

2012-05-10 18:11 288 查看
EINT4中断的裸机处理

这是基于S3C2410的EINT4中断的裸机处理,当中断发生时就把LED灯取反显示。下面是电路图。



上面是外部KEY连接到CPU的EINT4引脚上面,即:按下键就会产生一个中断。

按照先前介绍的,中断处理流程来介绍,包括:初始化中断、处理中断、处理完毕恢复中断。

一、引导代码

int main(void)
{
EINT_init(); // 外部中断初始化、中断控制器初始化
IRQEnable(); // 使能IRQ中断 (清零CPSR寄存器的I位)

while(1); // 等待外部中断
}

二、初始化代码函数:EINT_init。

EINT_init包括:外部中断初始化、中断控制器初始化。设置GPF4引脚为外部中断EINT4功能,下降沿触发模式,并使能中断允许。
void EINT_init(void)
{
rGPFCON = (rGPFCON & 0xFFFFFCFF) | (0x02<<8); // 设置GPF4引脚为外部中断EINT4功能
rEXTINT0 = (0x2<<16); // 外部中断EINT4设置为下降沿触发

VICVectAddr[4] = (uint32) IRQ_Eint4; // 中断向量地址设置

rPRIORITY = 0x00000000; // 使用默认的固定的优先级
rINTMOD = 0x00000000; // 所有中断均为IRQ中断
rINTMSK = ~0x0000010; // 使能EINT4中断(第一级)

rEINTMASK = ~0x0000010; // 使能第二级中断
}

三、使能IRQ中断函数:IRQEnable。

功能是:使能IRQ中断 (清零CPSR寄存器的I位),代码如下:
; 开IRQ中断
MRS R0, SPSR
BIC R0, R0, #I_BIT
MSR SPSR_c, R0
MOVS PC, LR

四、IRQ_Exception中断异常处理程序(实现向量中断处理),用户无需改动,代码如下:
void __irq IRQ_Exception(void) // 注意这个函数名之前的 __irq ,编译器会有特别动作。
{
void (*__Handler)(void);
int irq_no;
uint32 bak;

// 找出当前中断号
bak = rINTPND; // 读取INTPND的值
for(irq_no=0; irq_no<32; irq_no++)
{
bak = bak>>1;
if(bak == 0) break; // 获得最高的优先级
}

// 取得中断服务程序地址并执行
__Handler = (void (*)(void)) VICVectAddr[irq_no];
__Handler();
}

五、EINT4的中断处理函数:IRQ_Eint4。

功能:把LED1控制口输出信号取反。
void IRQ_Eint4(void)
{
// 把LED1控制口输出信号取反
// 省略...

// 清除中断标志
rEINTPEND = (1<<4); // 清除第二级的中断标识
rSRCPND = (1<<4); // 清除第一级的中断标识
rINTPND = rINTPND; // 清除mask过滤后的中断标识
}

从上面的代码中,大约可以得出每个阶段的流程:初始化时要一级一级的设置好mask,中断服务之后要一级一级的清理中断标识。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: