我需要在BSP中加一个中断,中断引脚是GPIO36
BSP是WINCE42下的,也就是静态申请中断的那种
我的步骤:
1、在OALINTR.H中我加了#define SYSINTR_WIFI (SYSINTR_FIRMWARE+19)
2、cfwBvd1.c中我分别在OEMInterruptEnable、OEMInterruptDisable、OEMInterruptDone中
加了对应的 case SYSINTR_WIFI: ....
3、bvdisrs.c中我加了int SPI_WifiISR(unsigned int ra)函数,并return SYSINTR_WIFI;
4、ISRdefs.h中我注册了这个中断服务int SPI_WifiISR(unsigned int);
5、intbvd1.c中pFunc pIRQISR[MaxNumISRs] =
中我添加了这个中断服务函数SPI_WifiISR
6、由于多加了一个,MaxNumISRs的定义由34改为35
问题:
1、GPIO36怎么能被用做中断?
在SPEC中:GPIO36的 IN: function1 :FFDCD function2:sspsclk2 function3:KP_MKIN<7>
OUT:function1 :USB_P2_4 function2:sspsclk2 function3:NONE
请问怎么能确定一个GPIO是否可用于中断?
2、#define SYSINTR_WIFI (SYSINTR_FIRMWARE+19)请问这个中断号定义是否有要求需要跟芯片资料上定义一致
我理解只要不重复、不超过64就可以
3、OEMInterruptEnable中:
case SYSINTR_WIFI: //OEMInterruptEnable
INTC_WIFISPI_INT_EN(v_pICReg->icmr);
break;
OEMInterruptDisable中:
case SYSINTR_WIFI: //OEMInterruptDisable
INTC_WIFISPI_INT_DIS(v_pICReg->icmr);
break;
OEMInterruptDone中:
case SYSINTR_WIFI: //OEMInterruptDone
v_pGPIOReg->GPDR1 &= ~(0x01<<(36 % 32)) ; //input
v_pGPIOReg->GAFR1_L &=~(3u<<4) ; //AF22 General I/O
v_pGPIOReg->GFER1 |= (0x01<<(36 % 32)) ; //enable detecting falling edge
v_pGPIOReg->GEDR1 |= (0x01<<(36 % 32));
break;
4、int SPI_WifiISR(unsigned int ra)
{
volatile XLLP_GPIO_T *v_pGPIOReg;
v_pGPIOReg = (volatile XLLP_GPIO_T *)GPIO_BASE_U_VIRTUAL;
if( v_pGPIOReg->GEDR1 & (0x01<<(36 % 32)) ) // GPIO36 wifi
{
v_pGPIOReg->GFER1 &= ~(0x01<<(36 % 32));
v_pGPIOReg->GRER1 &= ~(0x01<<(36 % 32));
//clear interrupt bit
v_pGPIOReg->GEDR1 |= (0x01<<(36 % 32)) ;
RETAILMSG(1,(TEXT("--------------SYSINTR_WIFI Interrupt----------\r\n")));
return SYSINTR_WIFI;
}
} 这个应该是中断服务程序吧??请问这个跟3中的OEMInterruptDone有什么关系呢?SPI_WifiISR的作用就是初始化
中断引脚的寄存器吧?
5、MaxNumISRs的定义由34改为35,这个没有限制吧??
6、中断引脚在哪进行最早的初始化设置的呢?才能由SPI_WifiISR检测到中断?
谢谢各位!
帮顶~
看起来没什么问题阿,除非这个GPIO36不能作为中断,或者没有配置对!