ch582M GPIO中斷的問題?
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ī)避,但我想看看有沒有更好的一個處理方式?




您好,如果io沒有使能中斷,那么此io產生不了中斷的,但是io狀態(tài)變化可能會置中斷標志,

所以,中斷中處理時可以&上中斷使能寄存器,

?if((GPIOA_ReadITFlagBit(GPIO_Pin_5)?&?R16_PA_INT_EN)?==?32)



好的,謝謝


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频