mini2440硬件篇之中斷
1.硬件原理
arm有7種工作模式,除了用戶模式,其他稱為異常模式。異常模式有各自的一些寄存器,如sp棧指針,lr連接指針,程序狀態(tài)保存寄存器SPSR,用于保存狀態(tài)CPSR。CPSR的I和F位分別用于中斷和快速中斷的總開(kāi)關(guān)。
1.中斷處理流程
2.中斷控制器收到中斷信號(hào),告訴CPU
3.CPU保存當(dāng)前環(huán)境,然后調(diào)用中斷服務(wù)程序ISR處理
4.ISR通過(guò)相關(guān)中斷狀態(tài)寄存器得知什么中斷
5.清除中斷,通常通過(guò)讀寫某些標(biāo)志寄存器
6.恢復(fù)中斷前的環(huán)境。
2.芯片手冊(cè)
3.mini2440電路圖
由原理圖可以看出,6個(gè)按鍵接到6個(gè)中斷引腳,以EINT8為例,接在GPG0引腳。
4.S3C2440寄存器
1.配置GPB8寄存器為中斷引腳
2.設(shè)置EXTINT寄存器,設(shè)置為下降沿觸發(fā)中斷
3.使能外部中斷寄存器EINTMASK
4.設(shè)置中斷模式為普通中斷EINTMOD
5.設(shè)置優(yōu)先級(jí)
6.使能中斷寄存器INTMASK
7.開(kāi)啟總中斷,CPSR中的I,匯編打開(kāi)
button.h
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:button.h
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:按鍵驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#ifndef__BUTTON_H__
#define__BUTTON_H__
/*按鍵驅(qū)動(dòng)調(diào)試等級(jí)*/
#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))
/*按鍵對(duì)應(yīng)的引腳*/
#defineBUTTON1_PIN(1<<0)
#defineBUTTON2_PIN(1<<3)
#defineBUTTON3_PIN(1<<5)
#defineBUTTON4_PIN(1<<6)
#defineBUTTON5_PIN(1<<7)
#defineBUTTON6_PIN(1<<11)
/*按鍵對(duì)應(yīng)的中斷*/
#defineBUTTON1_EINT(1<<8)
#defineBUTTON2_EINT(1<<11)
#defineBUTTON3_EINT(1<<13)
#defineBUTTON4_EINT(1<<14)
#defineBUTTON5_EINT(1<<15)
#defineBUTTON6_EINT(1<<19)
/*函數(shù)聲明*/
voidKeyInit(void);
#endif
button.c
/*******************************************************************
*Copyright(C),2011-2012,XXX.
*FileName:button.c
*Author:HuangYinqing
*Version:1.0
*Date::2012-04-22
*Description:按鍵驅(qū)動(dòng).
*FunctionList:
*History:
******************************************************************/
#include"common.h"
#include"core.h"
#include"drv.h"
U8button_irq[6]={8,11,13,14,15,19};
/********************************************************************
函數(shù)功能:按鍵中斷函數(shù)。
入口參數(shù):無(wú)。
返回:無(wú)。
備注:無(wú)。
********************************************************************/
staticvoid__irqKeyHandler(void)
{
inti;
staticcharflag=1;
ClearPending(BIT_EINT8_23);//==在中斷服務(wù)函數(shù)中,需要清除相應(yīng)的標(biāo)志寄存器
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; } } } } /******************************************************************** 函數(shù)功能:按鍵初始化。 入口參數(shù):無(wú)。 返回:無(wú)。 備注:無(wú)。 ********************************************************************/ voidKeyInit(void) { /*設(shè)置外部引腳為第二功能(外部中斷)*/ rGPGCON&=~BUTTON_CON_MASK; rGPGCON|=BUTTON_CON_EINT; /*設(shè)置下降沿觸發(fā)中斷*/ 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;//設(shè)置為普通中斷模式 rINTMSK&=~BIT_EINT8_23;//使能中斷 pISR_EINT8_23=(U32)KeyHandler; }