wjianmei0311 发表于 2018-5-15 10:25:36

STM32F072_PB1无法进入中断

我的板子使用STM32F072C8, USB电路如图,因为USB只用来充电,所以我想直接用PB1来检测USB是否连接电脑或者充电器,配置好IO口中断线等,可是程序无法中断,读取PB1的状态位也正常,在USB连接时为1,USB无连接时为0。配置代码如下:
void USB_CHECK_Init(void)
{
      GPIO_InitTypeDef GPIO_InitStructure;
      EXTI_InitTypeDef EXTI_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
      
      /* enable the GPIO Clock */
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
               
      /* Configure GPIO */
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
      GPIO_Init(GPIOB, &GPIO_InitStructure);

      /* enable SYSCFG Clock */
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);      
      /* Connect EXTI Line to GPIO Pin */
      SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource1);
      
      /* Configure EXTI Line */
      EXTI_InitStructure.EXTI_Line = EXTI_Line1;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);
      
      /* Enable and set EXTI Interrupt to the lowest priority */
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      
      NVIC_Init(&NVIC_InitStructure);
      
}

void EXTI0_1_IRQHandler(void)
{
      //清除中断标志位等其它操作......      

      if (EXTI_GetITStatus(EXTI_Line1)!=RESET)
      {
                //Deal
               
                EXTI_ClearITPendingBit(EXTI_Line1);
      }
      
}

与龙共舞 发表于 2018-5-15 10:54:01

也就是你轮训可以中断不行?
看了看
1it里面消抖检查下
2触发模式试试上升下降沿都触发    EXTI_Trigger_Rising
3没有别的1脚在用中断线吧   

toofree 发表于 2018-5-15 12:35:17

本帖最后由 toofree 于 2018-5-15 12:38 编辑

我想问,你是通过USB供电的吗?
如果是的话,PB1上升沿来的时候,MCU还没有启动呢,自然不会在中断。
或许原理这是这样的,但是仅凭目前的描述,不知道是怎么连的

Angel_YY 发表于 2018-5-15 13:15:47

可以考虑先用其他管脚供电,让MCU正常工作后,在插入USB线。如果只用USB供电就会发生MCU为启动时上升沿已经过去了。所以无法触发中断,这种情况智能使用查询方式。

wenyangzeng 发表于 2018-5-15 13:26:35

R16和R17的分压加上GPIOB1的下拉(GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;),
中断输入点满足不了TTL电平变化的中断要求

butterflyspring 发表于 2018-5-15 15:10:44

你的:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
例程:
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;

wjianmei0311 发表于 2018-5-15 17:09:38

与龙共舞 发表于 2018-5-15 10:54
也就是你轮训可以中断不行?
看了看
1it里面消抖检查下


现在整个系统只运行了这个usb中断的测试程序

wjianmei0311 发表于 2018-5-15 17:09:54

与龙共舞 发表于 2018-5-15 10:54
也就是你轮训可以中断不行?
看了看
1it里面消抖检查下


现在整个系统只运行了这个usb中断的测试程序

wjianmei0311 发表于 2018-5-15 17:11:19

Angel_YY 发表于 2018-5-15 13:15
可以考虑先用其他管脚供电,让MCU正常工作后,在插入USB线。如果只用USB供电就会发生MCU为启动时上升沿已经 ...

有电池供电,是在设备已经正常运行,OLED已经正常显示后,再插入USB的,

wjianmei0311 发表于 2018-5-15 17:12:17

wenyangzeng 发表于 2018-5-15 13:26
R16和R17的分压加上GPIOB1的下拉(GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;),
中断输入点满足不 ...

这种情况要怎么解决呢?改变分压电阻?
页: [1] 2
查看完整版本: STM32F072_PB1无法进入中断