按键控制蜂鸣器--采用中断方式(3)
2012-12-26 19:40
573 查看
对按键中断控制蜂鸣器程序进行如下的修改:
1、疑问1
其实,EINTPND和EINTMSK寄存器中,并没有EINT0-EINT3的中断控制位,那么这个两个寄存器怎样理解,到底怎么样用????
2、疑问2
3、疑问3
__inline void ClearPending(int bit) //上面调用中,BIT_EINT1移位以后,中断位已经为1,下面这样赋值,怎样才能达到清除SRCPND和INTPND 寄存器中的标志位呢??????
{
register i;
rSRCPND = bit;
rINTPND = bit;
i = rINTPND;
}
#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;
}
相关文章推荐
- 第三个实验 通过中断方式让按键控股按键控制LED
- ARM裸机——FS2410按键控制LED(中断方式)
- 国嵌实验:key_interrupt(按键中断),采用中断方式当KEY1 按下时,LED亮灭一次
- dsp控制DM9000实现802.3数据收发第三篇,调试过程程序第二版;接受部分可用,但是容易掉帧,采用的读取dm9000中断寄存器的方式获取数据
- dsp控制DM9000实现802.3数据收发第三篇,调试过程程序第三版;采用外部引脚中断方式获取中断,优化掉帧现象
- STM32中关于检测按键的一些问题(关于采用传统的延时消抖方式和采用中断方式)
- 从ARM裸机看驱动之按键中断方式控制LED(二)
- 基于fl2440开发板的按键以及蜂鸣器控制
- 数据报的接收过程详解---从网卡到L3层(非NAPI,即接收数据采用中断方式)
- 用中断的方式都控制LED
- 初学MSP430——按键中断控制小灯翻转
- ARM 按键控制LED灯+IO控制buzzer蜂鸣器
- 7.自己写中断方式按键驱动程序(详解)
- AD按键的中断方式读取
- TI CC2530基础实验(GPIO通用I/O中断操作——按键控制灯的亮灭)
- 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)
- OK6410利用矢量中断通过按键控制LED灯
- wince6.0 +S3C6410 中断处理例子(按键控制LED灯)
- 国嵌实验:key_poll,采用查询的方式一旦按键再松开,LED亮灭一次
- 按键驱动的恩恩怨怨之中断方式