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:按键驱动.
*FunctionList:
*History:
******************************************************************/
#ifndef__BUTTON_H__
#define__BUTTON_H__
/*按键驱动调试等级*/
#defineDBG_BUTTON_LEVEL3
#defineBUTTON_CON_MASK((3<<0)|(3<<6)|(3<<10)|(3<<12)|(3<<14)|(3<<22))
#defineBUTTON_CON_EINT((2<<0)|(2<<6)|(2<<10)|(2<<12)|(2<<14)|(2<<22))
/*按键对应的引脚*/
#defineBUTTON1_PIN(1<<0)
#defineBUTTON2_PIN(1<<3)
#defineBUTTON3_PIN(1<<5)
#defineBUTTON4_PIN(1<<6)
#defineBUTTON5_PIN(1<<7)
#defineBUTTON6_PIN(1<<11)
/*按键对应的中断*/
#defineBUTTON1_EINT(1<<8)
#defineBUTTON2_EINT(1<<11)
#defineBUTTON3_EINT(1<<13)
#defineBUTTON4_EINT(1<<14)
#defineBUTTON5_EINT(1<<15)
#defineBUTTON6_EINT(1<<19)
/*函数声明*/
voidKeyInit(void);
#endif
button.c
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:button.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:按键驱动.
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"drv.h"
U8button_irq[6]={8,11,13,14,15,19};
/********************************************************************
函数功能:按键中断函数。
入口参数:无。
返回:无。
备注:无。
********************************************************************/
staticvoid__irqKeyHandler(void)
{
inti;
staticcharflag=1;
ClearPending(BIT_EINT8_23);//==在中断服务函数中,需要清除相应的标志寄存器
for(i=0;i<6;i++)
{
if(rEINTPEND&(1< { rEINTPEND|=(1< DbgPrintX(DBG_BUTTON_LEVEL,"rkey=%dn",i+1); if(flag) { LedOn(LED1_PIN); flag=0; } else { LedOff(LED1_PIN); flag=1; } } } } /******************************************************************** 函数功能:按键初始化。 入口参数:无。 返回:无。 备注:无。 ********************************************************************/ voidKeyInit(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; }