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的中斷觸發(fā)模式,不去配置PA4 ,? ? 而在中斷里面的檢測程序處GPIOA_IRQHandler(void)里面的程序如上所示,? 則會出現一個現象:? 如果上升沿電平在PA5處,那么在進入PA5的判斷后也會進入PA4的中斷標志判斷,從而打印出“34\n”
? ? 而如果PA5和PA4的中斷模式同時配置,那么不同的觸發(fā)源才能被正確檢測到。
求解:
? ? 但按照正常的邏輯應該是,我沒有配置PA4,那么我去檢測PA4的中斷標志一定是沒有被觸發(fā)的狀態(tài),而不是任意的一個狀態(tài)。
? ?所以有沒有什么代碼 可以規(guī)避這種錯誤,因為我的程序里面的PA4是由AT指令去配置模式,不會在上電就配置好,會引發(fā)一些bug,雖然也可以規(guī)避,但我想看看有沒有更好的一個處理方式?
熱門產品 :
CH585: 集成高速USB和NFC的藍牙MCU