mini2440硬件篇之中断

1. 硬件原理

arm有7种工作模式,除了用户模式,其他称为异常模式。异常模式有各自的一些寄存器,如sp栈指针,lr连接指针,程序状态保存寄存器SPSR,用于保存状态CPSR。CPSR的I和F位分别用于中断和快速中断的总开关。

1. 中断处理流程

2. 中断控制器收到中断信号,告诉CPU

3. CPU保存当前环境,然后调用中断服务程序ISR处理

4. ISR通过相关中断状态寄存器得知什么中断

5. 清除中断,通常通过读写某些标志寄存器

6. 恢复中断前的环境。

2. 芯片手册

3. mini2440电路图


由原理图可以看出,6个按键接到6个中断引脚,以EINT8为例,接在GPG0引脚。

4. S3C2440寄存器


1. 配置GPB8寄存器为中断引脚

2. 设置EXTINT寄存器,设置为下降沿触发中断

3. 使能外部中断寄存器EINTMASK

4. 设置中断模式为普通中断EINTMOD

5. 设置优先级

6. 使能中断寄存器INTMASK

7. 开启总中断,CPSR中的I,汇编打开


button.h

/*******************************************************************
 * Copyright (C),2011-2012, XXX.
 * FileName: button.h 
 * Author:HuangYinqing
 * Version:1.0
 * Date::2012-04-22
 * Description:按键驱动.
 * Function List:
 * History:
 ******************************************************************/
#ifndef __BUTTON_H__
#define __BUTTON_H__

/*按键驱动调试等级*/
#define DBG_BUTTON_LEVEL 3

#define BUTTON_CON_MASK	( (3<<0) | (3<<6) | (3<<10) | (3<<12) | (3<<14) | (3<<22) )
#define BUTTON_CON_EINT	( (2<<0) | (2<<6) | (2<<10) | (2<<12) | (2<<14) | (2<<22) )

/*按键对应的引脚*/
#define BUTTON1_PIN		(1<<0)
#define BUTTON2_PIN		(1<<3)
#define BUTTON3_PIN		(1<<5)
#define BUTTON4_PIN		(1<<6)
#define BUTTON5_PIN		(1<<7)
#define BUTTON6_PIN		(1<<11)

/*按键对应的中断*/
#define BUTTON1_EINT	(1<<8)
#define BUTTON2_EINT	(1<<11)
#define BUTTON3_EINT	(1<<13)
#define BUTTON4_EINT	(1<<14)
#define BUTTON5_EINT	(1<<15)
#define BUTTON6_EINT	(1<<19)

/*函数声明*/
void KeyInit(void);

#endif



button.c

/*******************************************************************
 * Copyright (C),2011-2012, XXX.
 * FileName: button.c 
 * Author:HuangYinqing
 * Version:1.0
 * Date::2012-04-22
 * Description:按键驱动.
 * Function List:
 * History:
 ******************************************************************/
#include "common.h"
#include "core.h"
#include "drv.h"

U8 button_irq[6] = {8, 11, 13, 14, 15, 19};

/********************************************************************
函数功能:按键中断函数。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
static void __irq KeyHandler(void)
{
	int i;
	static char flag = 1;

	ClearPending(BIT_EINT8_23); //==在中断服务函数中,需要清除相应的标志寄存器

	for(i=0; i<6; i++)
	{
		if( rEINTPEND & (1<<button_irq[i]) ) 
		{
			rEINTPEND |= (1<<button_irq[i]);
			
			DbgPrintX(DBG_BUTTON_LEVEL, "\rkey=%d\n", i+1);
			if(flag)
			{
				LedOn(LED1_PIN);
				flag = 0;
			}
			else
			{
				LedOff(LED1_PIN);
				flag = 1;
			}	
		}
	}
}

/********************************************************************
函数功能:按键初始化。
入口参数:无。
返    回:无。
备    注:无。
********************************************************************/
void KeyInit(void)
{
	/*设置外部引脚为第二功能(外部中断)*/
	rGPGCON &= ~BUTTON_CON_MASK;     
	rGPGCON |= BUTTON_CON_EINT ;		
	
	/*设置下降沿触发中断*/
	rEXTINT1 &= ~0x000f0ff0;
	rEXTINT1 |= ( (0x2<<0) | (0x2<<12) | (0x2<<20) | (0x2<<24) | (0x2<<28) );
	rEXTINT2 &= ~(0xf<<12);										
	rEXTINT2 |= 0x2<<12;
	
	/*使能按键外部中断*/
	rEINTMASK &= ~( (1<<8) | (1<<11) | (1<<13) | (1<<14) | (1<<15) | (1<<19) );	
	
	rINTMOD &= ~BIT_EINT8_23;		//设置为普通中断模式
	rINTMSK &= ~BIT_EINT8_23;			//使能中断
	
	pISR_EINT8_23 = (U32)KeyHandler;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值