您的位置:首页 > 其它

按键控制蜂鸣器--采用中断方式(3)

2012-12-26 19:40 573 查看
对按键中断控制蜂鸣器程序进行如下的修改:

#define	GLOBAL_CLK		1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"

void key_init(void);
static void __irq key_handler(void);
void beep_init(void);
void beep_run(void);
/*************************************************
Function name: delay
Parameter    : times
Description	 : 延时函数
Return		 : void
Argument     : void
Autor & date : Daniel
**************************************************/
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
/*************************************************
Function name: Main
Parameter    : void
Description	 : 主功能函数
Return		 : void
Argument     : void
Autor & date : Daniel
**************************************************/
void Main(void)
{
beep_init();
MMU_Init();
key_init();
while(1);

}

/*************************************************
Function name: key_init()
Parameter    : void
Description	 : 按键K1的初始化函数
Return		 : void
Argument     : void
Autor & date : Daniel
**************************************************/
void key_init(void)
{
rGPFCON &= ~(0x3<<2);    //设置管脚功能,为EINT1中断
rGPFCON |=  (0x2<<2);

rEXTINT0 &= ~(0xf<<4);   //设置外部中断1,EINT1为电平触发方式
//rEINTPEND |= (1<<8);	 //设置外部中断EINT8寄存器,EINT0-EINT3,在寄存器EINTPEND和EINTMASK中没有体现出来,怎样理解??
// rEINTMASK &= ~(1<<8);

/*设置ISR*/
pISR_EINT1=(U32)key_handler;//中断向量表怎样理解pISR_EINT1??
EnableIrq(BIT_EINT1);//BIT_EINT1在头文件2440addr.h中定义"#define BIT_EINT1		(0x1<<1)" 实际相当于设置SRCPND寄存器(中断源:EINT1引起的中断)
//EnableIrq也在头文件2440addr.h中定义"#define	EnableIrq(bit)		rINTMSK &= ~(bit)", 实际设置INTMSK(中断屏蔽寄存器:允许中断)
}

/*************************************************
Function name: key_handler()
Parameter    : void
Description	 : 按键K1的中断服务子程序
Return		 : void
Argument     : void
Autor & date : Daniel
**************************************************/
static void __irq key_handler(void)
{
/*判断是否是按键K1产生的中断*/
if(rINTPND==BIT_EINT1)
{
ClearPending(BIT_EINT1);//怎样理解2440addr.h定义的处理函数呢??
//if(rEINTPEND&(1<<8))
//{
//rEINTPEND |= 1<< 8;
beep_run();
//}
}
}
/*************************************************
Function name: beep_init()
Parameter    : void
Description	 : 初始化蜂鸣器
Return		 : void
Argument     : void
Autor & date : Daniel
**************************************************/
void beep_init(void)
{
rGPBCON &= ~(0x3<<0);
rGPBCON |=  (0x1<<0);
}
/*************************************************
Function name: beep_run()
Parameter    : void
Description	 : 运行蜂鸣器
Return		 : void
Argument     : void
Autor & date : Daniel
**************************************************/
void beep_run(void)
{
rGPBDAT |= (0x1<<0);
delay(50);
rGPBDAT &= (0x0<<0);
delay(50);
}


1、疑问1

rEXTINT0 &= ~(0xf<<4);   //设置外部中断1,EINT1为电平触发方式
//rEINTPEND |= (1<<8);	 //设置外部中断EINT8寄存器,EINT0-EINT3,在寄存器EINTPEND和EINTMASK中没有体现出来,怎样理解??
// rEINTMASK &= ~(1<<8);




其实,EINTPND和EINTMSK寄存器中,并没有EINT0-EINT3的中断控制位,那么这个两个寄存器怎样理解,到底怎么样用????
2、疑问2

/*设置ISR*/
pISR_EINT1=(U32)key_handler;//中断向量表怎样理解pISR_EINT1??
EnableIrq(BIT_EINT1);//BIT_EINT1在头文件2440addr.h中定义"#define BIT_EINT1		(0x1<<1)" 实际相当于设置SRCPND寄存器(中断源:EINT1引起的中断)
//EnableIrq也在头文件2440addr.h中定义"#define	EnableIrq(bit)		rINTMSK &= ~(bit)", 实际设置INTMSK(中断屏蔽寄存器:允许中断)
在2440addr.h文件中,定义的中断向量表如下

// Exception vector
#define pISR_RESET		(*(unsigned *)(_ISR_STARTADDRESS+0x0))
#define pISR_UNDEF		(*(unsigned *)(_ISR_STARTADDRESS+0x4))
#define pISR_SWI		(*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define pISR_PABORT		(*(unsigned *)(_ISR_STARTADDRESS+0xc))
#define pISR_DABORT		(*(unsigned *)(_ISR_STARTADDRESS+0x10))
#define pISR_RESERVED	(*(unsigned *)(_ISR_STARTADDRESS+0x14))
#define pISR_IRQ		(*(unsigned *)(_ISR_STARTADDRESS+0x18))
#define pISR_FIQ		(*(unsigned *)(_ISR_STARTADDRESS+0x1c))
// Interrupt vector
#define pISR_EINT0		(*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1		(*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2		(*(unsigned *)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT3		(*(unsigned *)(_ISR_STARTADDRESS+0x2c))
#define pISR_EINT4_7	(*(unsigned *)(_ISR_STARTADDRESS+0x30))
#define pISR_EINT8_23	(*(unsigned *)(_ISR_STARTADDRESS+0x34))
#define pISR_CAM		(*(unsigned *)(_ISR_STARTADDRESS+0x38))		// Added for 2440.
#define pISR_BAT_FLT	(*(unsigned *)(_ISR_STARTADDRESS+0x3c))
#define pISR_TICK		(*(unsigned *)(_ISR_STARTADDRESS+0x40))
#define pISR_WDT_AC97		(*(unsigned *)(_ISR_STARTADDRESS+0x44))   //Changed to pISR_WDT_AC97 for 2440A
#define pISR_TIMER0	 	(*(unsigned *)(_ISR_STARTADDRESS+0x48))
#define pISR_TIMER1	 	(*(unsigned *)(_ISR_STARTADDRESS+0x4c))
#define pISR_TIMER2		(*(unsigned *)(_ISR_STARTADDRESS+0x50))
#define pISR_TIMER3		(*(unsigned *)(_ISR_STARTADDRESS+0x54))
#define pISR_TIMER4		(*(unsigned *)(_ISR_STARTADDRESS+0x58))
#define pISR_UART2		(*(unsigned *)(_ISR_STARTADDRESS+0x5c))
#define pISR_LCD		(*(unsigned *)(_ISR_STARTADDRESS+0x60))
#define pISR_DMA0		(*(unsigned *)(_ISR_STARTADDRESS+0x64))
#define pISR_DMA1		(*(unsigned *)(_ISR_STARTADDRESS+0x68))
#define pISR_DMA2		(*(unsigned *)(_ISR_STARTADDRESS+0x6c))
#define pISR_DMA3		(*(unsigned *)(_ISR_STARTADDRESS+0x70))
#define pISR_SDI		(*(unsigned *)(_ISR_STARTADDRESS+0x74))
#define pISR_SPI0		(*(unsigned *)(_ISR_STARTADDRESS+0x78))
#define pISR_UART1		(*(unsigned *)(_ISR_STARTADDRESS+0x7c))
#define pISR_NFCON		(*(unsigned *)(_ISR_STARTADDRESS+0x80))		// Added for 2440.
#define pISR_USBD		(*(unsigned *)(_ISR_STARTADDRESS+0x84))
#define pISR_USBH		(*(unsigned *)(_ISR_STARTADDRESS+0x88))
#define pISR_IIC		(*(unsigned *)(_ISR_STARTADDRESS+0x8c))
#define pISR_UART0		(*(unsigned *)(_ISR_STARTADDRESS+0x90))
#define pISR_SPI1		(*(unsigned *)(_ISR_STARTADDRESS+0x94))
#define pISR_RTC		(*(unsigned *)(_ISR_STARTADDRESS+0x98))
#define pISR_ADC		(*(unsigned *)(_ISR_STARTADDRESS+0x9c))
这个中断向量表,又是怎样理解呢??

3、疑问3

static void __irq key_handler(void)
{
/*判断是否是按键K1产生的中断*/
if(rINTPND==BIT_EINT1)
{
ClearPending(BIT_EINT1);//怎样理解2440addr.h定义的处理函数呢??
//if(rEINTPEND&(1<<8))
//{
//rEINTPEND |= 1<< 8;
beep_run();
//}
}
}
ClearPending(BIT_EINT1) 函数怎样理解,它在2440addr.h中定义如下:


__inline void ClearPending(int bit) //上面调用中,BIT_EINT1移位以后,中断位已经为1,下面这样赋值,怎样才能达到清除SRCPND和INTPND 寄存器中的标志位呢??????

{

register i;

rSRCPND = bit;

rINTPND = bit;

i = rINTPND;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: