|  | 
 
| 本帖最后由 huajiji 于 2010-4-27 17:03 编辑 
 在光盘的test程序里面,keyscan.c文件里面有KeyScan_Test()函数,里面有个关于外部中断的语句我不是很懂:
 pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
 Key_ISR是中断函数,返回值是空类型的,怎么可以强制转化为U32类型呢?还有pISR_EINT0 ,pISR_EINT1, pISR_EINT2 ,pISR_EINT4_7 ,是不同的中断向量,又怎么能让它们相等呢?有什么意义呢?
 下面是Key_ISR()和KeyScan_Test()的源码:
 
 static void __irq Key_ISR(void)
 {
 U8 key;
 U32 r;
 
 EnterCritical(&r);
 if(rINTPND==BIT_EINT1)
 {
 //Uart_Printf("eint1\n");
 ClearPending(BIT_EINT1);
 }
 if(rINTPND==BIT_EINT4_7)
 {
 ClearPending(BIT_EINT4_7);
 if(rEINTPEND&(1<<4))
 {
 //Uart_Printf("eint4\n");
 rEINTPEND |= 1<< 4;
 }
 }
 if(rINTPND==BIT_EINT0)
 {
 //Uart_Printf("eint0\n");
 ClearPending(BIT_EINT0);
 }
 if(rINTPND==BIT_EINT2)
 {
 //Uart_Printf("eint2\n");
 ClearPending(BIT_EINT2);
 }
 
 key=Key_Scan();
 if( key == 0xff )
 Uart_Printf( "Interrupt occur... Key is released!\n") ;
 else
 Uart_Printf( "Interrupt occur... K%d is pressed!\n", key) ;
 
 ExitCritical(&r);
 }
 
 
 void KeyScan_Test(void)
 {
 Uart_Printf("\nKey Scan Test, press ESC key to exit !\n");
 
 rGPBUP = rGPBUP & ~0x03f0|0x03f0;                        //  LED [8:5] => PU En
 rGPBCON = rGPBCON & ~0x3d57fc|0x3d57fc;                //LED[8:5] => OUTPUT;
 rGPFCON = rGPFCON & (~((3<<4)|(3<<0)|(3<<8)|(3<<2))) | ((2<<4)|(2<<0)|(2<<8)|(2<<2)) ;                //GPF4,2,1,0 set EINT
 
 rEXTINT0 &= ~(7|(7<<4)|(7<<8)|(7<<16));
 rEXTINT0 |= (0|(0<<4)|(0<<8)|(0<<16));                //set eint0,1,2,4 falling edge int
 
 
 rEINTPEND |= (1<<4);                                                        //clear eint 4
 rEINTMASK &= ~(1<<4);                                                //enable eint 4
 ClearPending(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
 pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;
 EnableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
 
 while( Uart_GetKey() != ESC_KEY ) ;
 DisableIrq(BIT_EINT0|BIT_EINT1|BIT_EINT2|BIT_EINT4_7);
 }
 | 
 |