qiancuit2012 发表于 2020-11-5 10:12:57

stm32f103四路外部中断唤醒 其中一路不唤醒问题

本帖最后由 qiancuit2012 于 2020-11-5 10:37 编辑

请教下 配置了4路外部中断唤醒,但是其中的PD2 无法唤醒,测量是有上升沿波形的数据,其他三路都正常


void exit_run_system(void)
{
    GPIO_InitTypeDefGPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
   
                //GPIOA.3          中断线以及中断初始化配置 下降沿触发 //KEY
                GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3;            //PA3 上拉输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStructure);   
               
   
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource3);
        EXTI_InitStructure.EXTI_Line=EXTI_Line3;
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_RisingEXTI_Trigger_Falling
        EXTI_Init(&EXTI_InitStructure);       
               
          //GPIOC.5          中断线以及中断初始化配置 上降沿触发 //IN 外部输入
                GPIO_InitStructure.GPIO_Pin= GPIO_Pin_5;            //PC5 浮空输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
               
               
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
        EXTI_InitStructure.EXTI_Line=EXTI_Line5;
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_RisingEXTI_Trigger_Falling
        EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
               
                //GPIOB.10          中断线以及中断初始化配置 上降沿触发 //IN 外部输入
                GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10;            //PB10 浮空输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
               
               
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);
        EXTI_InitStructure.EXTI_Line=EXTI_Line10;
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_RisingEXTI_Trigger_Falling
        EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
       
                //GPIOD.2          中断线以及中断初始化配置 上降沿触发 //IN USB输入
                GPIO_InitStructure.GPIO_Pin= GPIO_Pin_2;            //PD2 浮空输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
               
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource2);
        EXTI_InitStructure.EXTI_Line=EXTI_Line2;
                EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;       
                EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//EXTI_Trigger_RisingEXTI_Trigger_Falling
        EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
               
                //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

                NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;            //GPIO2所在的中断
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;   
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;      
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                           
                NVIC_Init(&NVIC_InitStructure);
       
   
    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;            //GPIO3所在的中断
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;   
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;      
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                           
                NVIC_Init(&NVIC_InitStructure);

                NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                        //使能按键所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);
               
                NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure);
}
void EXTI9_5_IRQHandler(void)
{
    delay_ms(10);//消抖
   
    if(EXTI_GetITStatus(EXTI_Line5) != RESET)   //检查指定的EXTI5线路触发请求发生与否
    {
                        EXTI_ClearITPendingBit(EXTI_Line5);//清除EXTI5线路挂起位
                        EXTI_ClearFlag(EXTI_Line5);          //清楚EXTI5线路挂起标志位
                        exit_delete();
                        board_init();
                        myprintf("checkin ent exit 5\n");
                        keyFlag.press=1;
    }
}
void EXTI15_10_IRQHandler(void)
{
    delay_ms(10);//消抖
   
    if(EXTI_GetITStatus(EXTI_Line10) != RESET)   //检查指定的EXTI5线路触发请求发生与否
    {
                        EXTI_ClearITPendingBit(EXTI_Line10);//清除EXTI10线路挂起位
                        EXTI_ClearFlag(EXTI_Line10);          //清楚EXTI10线路挂起标志位
                        exit_delete();
                        board_init();
                        myprintf("ir person ent exit 10\n");
    }
}
void EXTI3_IRQHandler(void)
{
    delay_ms(10);//消抖
   
    if(EXTI_GetITStatus(EXTI_Line3) != RESET)   //检查指定的EXTI3线路触发请求发生与否
    {
                        EXTI_ClearITPendingBit(EXTI_Line3);//清除EXTI3线路挂起位
                        EXTI_ClearFlag(EXTI_Line3);          //清楚EXTI3线路挂起标志位
                        exit_delete();
                        board_init();
                        myprintf("key ent exit 3\n");
                        keyFlag.press=1;
                        while(KEY1==KEY_PRESS){
                        }
    }
}
void EXTI2_IRQHandler(void)
{
    delay_ms(10);//消抖
   
    if(EXTI_GetITStatus(EXTI_Line2) != RESET)   //检查指定的EXTI2线路触发请求发生与否
    {
                        EXTI_ClearITPendingBit(EXTI_Line2);//清除EXTI2线路挂起位
                        EXTI_ClearFlag(EXTI_Line2);          //清楚EXTI2线路挂起标志位
                        exit_delete();
                        board_init();
                        myprintf("usb ent exit 2\n");
    }
}
页: [1]
查看完整版本: stm32f103四路外部中断唤醒 其中一路不唤醒问题