int main() { SetSysClock(CLK_SOURCE_PLL_60MHz); GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_SetBits(GPIO_Pin_13); GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PU); // RXD GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_5mA); // TXD GPIOPinRemap(ENABLE,RB_PIN_UART1); UART1_BaudRateCfg(115200); UART1_DefInit(); PRINT("Start @ChipID=%02x\n", R8_CHIP_ID); DelayMs(200); #if 1 /* 配置唤醒源为 GPIO - PA5 */ GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU); GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU); GPIOA_ITModeCfg(GPIO_Pin_4, GPIO_ITMode_RiseEdge); // PFIC_EnableIRQ(GPIO_A_IRQn); //PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); #endif while(1){ } } __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void) { printf("12=%d\n",GPIOA_ReadITFlagPort()); if(GPIOA_ReadITFlagBit(GPIO_Pin_5) == 32){ printf("12\n"); GPIOA_ClearITFlagBit(GPIO_Pin_5); } printf("12=%d\n",GPIOA_ReadITFlagPort()); if(GPIOA_ReadITFlagBit(GPIO_Pin_4) == 16){ printf("34\n"); GPIOA_ClearITFlagBit(GPIO_Pin_4); } }
上面是我的测试代码,
问题描述:
如果我只配置了PA5的中断触发模式,不去配置PA4 , 而在中断里面的检测程序处GPIOA_IRQHandler(void)里面的程序如上所示, 则会出现一个现象: 如果上升沿电平在PA5处,那么在进入PA5的判断后也会进入PA4的中断标志判断,从而打印出“34\n”
而如果PA5和PA4的中断模式同时配置,那么不同的触发源才能被正确检测到。
求解:
但按照正常的逻辑应该是,我没有配置PA4,那么我去检测PA4的中断标志一定是没有被触发的状态,而不是任意的一个状态。
所以有没有什么代码 可以规避这种错误,因为我的程序里面的PA4是由AT指令去配置模式,不会在上电就配置好,会引发一些bug,虽然也可以规避,但我想看看有没有更好的一个处理方式?
热门产品 :
CH32X035: 32位USB+USB PD单片机