emmmm问题是这样的,我在使用CCS编写F28027的代码时,需要用到四个独立按键输入,于是我配置了四个IO口,共用同一个外部中断源,然后在中断服务程序里判断是哪个按键触发,执行对应操作。可是在运行的时候发现,只有最后一个按键有效,而且会使其他三个按键同时执行对应操作(对应按键按下的flag置1)。只单独配置其中任何一个按键中断时,都可以正常工作,当配置多个时,却只有最后一个有效了。而且当配置多个(例如四个)时,即使在中断服务程序里删除第四个按键的相关程序,仍然是只有第四个按键有效并且使其他按键执行操作……有没有大佬知道这是为什么嘛?急急急!
下面是中断服务程序代码
interrupt void KEY_XINT1_isr(void)
{
Delay(1000000L);
if(KEYPRESSED == KEY_STATUS(KEY1)) //上升沿
{
Flag_KEY1 = 1;
}
else if(KEYPRESSED != KEY_STATUS(KEY1))//&&( Flag_KEY1 == 1)) //下降沿
{
key_status = KEY1_PRESS; //短按
Flag_KEY1 = 2;
}
Delay(1000000L);
if(KEYPRESSED == KEY_STATUS(KEY2)) //上升沿
{
Flag_KEY2 = 1;
}
else if((KEYPRESSED != KEY_STATUS(KEY2))&&( Flag_KEY2 == 1)) //下降沿
{
key_status = KEY2_PRESS; //短按
Flag_KEY2 = 0;
}
Delay(1000000L);
if(KEYPRESSED == GetKeyStatus(KEY3)) //上升沿
{
Flag_KEY3 = 1;
}
else if((KEYPRESSED != GetKeyStatus(KEY3))&&( Flag_KEY3 == 1)) //下降沿
{
key_status = KEY3_PRESS; //短按
Flag_KEY3 = 0;
}
Delay(1000000L);
if(KEYPRESSED == KEY_STATUS(KEY4)) //上升沿
{
Flag_KEY4 = 1;
}
else if((KEYPRESSED != KEY_STATUS(KEY4))&&( Flag_KEY4 == 1)) //下降沿
{
key_status = KEY4_PRESS; //短按
Flag_KEY4 = 0;
}
// Acknowledge this interrupt to get more from group 1
//void PIE_clearInt(PIE_Handle pieHandle,const PIE_GroupNumber_e groupNumber)
PIE_clearInt(myPie, PIE_GroupNumber_1);
}
接下来是GPIO口配置:
void KEY_pinConfigure(void)
{ //1. set pullup
//void GPIO_setPullUp(GPIO_Handle gpioHandle,const GPIO_Number_e gpioNumber,const GPIO_PullUp_e pullUp);
GPIO_setPullUp(myGpio, GPIO_Number_0, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_1, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_2, GPIO_PullUp_Disable);
GPIO_setPullUp(myGpio, GPIO_Number_3, GPIO_PullUp_Disable);
//2. set mode
//void GPIO_setMode(GPIO_Handle gpioHandle,const GPIO_Number_e gpioNumber,const GPIO_Mode_e mode);
GPIO_setMode(myGpio, GPIO_Number_0, GPIO_0_Mode_GeneralPurpose);
GPIO_setMode(myGpio, GPIO_Number_1, GPIO_1_Mode_GeneralPurpose);
GPIO_setMode(myGpio, GPIO_Number_2, GPIO_2_Mode_GeneralPurpose);
GPIO_setMode(myGpio, GPIO_Number_3, GPIO_3_Mode_GeneralPurpose);
//3. set direction
//void GPIO_setDirection(GPIO_Handle gpioHandle,const GPIO_Number_e gpioNumber,const GPIO_Direction_e direction);
GPIO_setDirection(myGpio, GPIO_Number_0, GPIO_Direction_Input);
GPIO_setDirection(myGpio, GPIO_Number_1, GPIO_Direction_Input);
GPIO_setDirection(myGpio, GPIO_Number_2, GPIO_Direction_Input);
GPIO_setDirection(myGpio, GPIO_Number_3, GPIO_Direction_Input);
//4. filter
//void GPIO_setQualification(GPIO_Handle gpioHandle, const GPIO_Number_e gpioNumber, const GPIO_Qual_e qualification);
//void GPIO_setQualificationPeriod(GPIO_Handle gpioHandle, const GPIO_Number_e gpioNumber, const uint16_t period);
GPIO_setQualification(myGpio, GPIO_Number_0, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_1, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_2, GPIO_Qual_ASync);
GPIO_setQualification(myGpio, GPIO_Number_3, GPIO_Qual_ASync);
}
//
// (2.2) module function configure
//! \brief KEY function configure
//! \param[in] None
//! \param[out] None
void KEY_functionConfigure(void)
{
}
//
// (2.3) module Event configure
//! \brief KEY Event configure
//! \param[in] None
//! \param[out] None
void KEY_eventConfigure(void)
{ //1. set xint
//void GPIO_setExtInt(GPIO_Handle gpioHandle, const GPIO_Number_e gpioNumber, const CPU_ExtIntNumber_e intNumber)
GPIO_setExtInt(myGpio, GPIO_Number_0, CPU_ExtIntNumber_1);
GPIO_setExtInt(myGpio, GPIO_Number_1, CPU_ExtIntNumber_1);
GPIO_setExtInt(myGpio, GPIO_Number_2, CPU_ExtIntNumber_1);
GPIO_setExtInt(myGpio, GPIO_Number_3, CPU_ExtIntNumber_1);
//2. set polarity
//void PIE_setExtIntPolarity(PIE_Handle pieHandle,
// const CPU_ExtIntNumber_e intNumber,
// const PIE_ExtIntPolarity_e polarity)
PIE_setExtIntPolarity(myPie, CPU_ExtIntNumber_1, PIE_ExtIntPolarity_RisingAndFallingEdge);
}