检测STM32上的USB连接事件

Detect USB Connection Event on STM32

提问人:ThomSirveaux 提问时间:7/12/2014 更新时间:5/15/2020 访问量:6593

问:

我目前正在使用支持 USB 的低功耗设备,但遇到了一些麻烦。在正常操作期间,系统时钟被设置为明显较慢的速度(因为这是一个数据记录器,每隔几分钟才激活一次,这不是问题)。但是,当设备插入计算机上的 USB 端口时,它需要识别这一点,初始化 USB 堆栈(我可以这样做),并将系统时钟重置为全速(我也可以这样做)。

您可能已经注意到,我的问题是“USB Connected”事件。我正在查看 STM32 评估材料,它们在 IRQn 表中有一个“USB_FS_WKUP_IRQn”,STM32 评估板还具有 USB-5V 电源路由到引脚 PE6,该引脚也可以用作 WKUP3。

我是否需要为该引脚启用外部中断,或者是否有更好的方法来检测此类事件并根据需要设置/复位时钟?

提前致谢。

事件 嵌入式 USB 中断

评论

2赞 Clifford 7/13/2014
不同系列的 STM32 之间的 USB 实现方式不同 - 您可能需要更具体的 STM32F0/1/2/3/4?我想知道这是否是STM32Cube工具的处理?
0赞 ThomSirveaux 7/14/2014
哦,对不起,这是EVAL板上的一个STM32L152ZD,最终的uP将属于同一系列。
0赞 Dr. Sahib 7/16/2014
您使用的是哪个类?疾病预防控制中心?
0赞 ThomSirveaux 7/17/2014
这是一个HID设备,对不起,应该已经说清楚了。
0赞 fazkan 9/7/2015
@ThomSirveaux 首先,您应该使用带有 USB bank的 hid 设备,这个问题在大多数嵌入式设备中都存在,接下来如果有唤醒 irq 事件,您应该将其配置为......

答:

0赞 Mikolaj 6/20/2018 #1

根据您提到的中断名称,我找到了这个实现:

// Enable the USB Wake-up interrupt
NVICInit.NVIC_IRQChannel = USB_FS_WKUP_IRQn;
NVICInit.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&NVICInit);

看来你不需要更多了。实现方式可能与您使用的 STM32 系列不同。

0赞 somanyquestions 5/15/2020 #2

我使用 stm32l4

我在 Vbus 引脚上设置了一个中断。 未处于 USB 模式时,将引脚配置为下拉(使其不会浮动)。 您的引脚和中断线会有所不同,但是

//Configure the pin

    GPIO_InitTypeDef GPIO_InitStruct = {0};
   __HAL_RCC_GPIOA_CLK_ENABLE();

    /*Configure GPIO pin : PA9 */
    GPIO_InitStruct.Pin = VBUS_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(VBUS_GPIO_Port, &GPIO_InitStruct);

    /* EXTI interrupt init*/
    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

配置中断

      EXTI_ConfigTypeDef exti_conf;
      exti_conf.Line = EXTI_LINE_9;
      exti_conf.GPIOSel = EXTI_GPIOA;
      exti_conf.Mode = EXTI_MODE_INTERRUPT;
      exti_conf.Trigger = EXTI_TRIGGER_RISING; 
      HAL_EXTI_SetConfigLine(&hexti_vbus, &exti_conf);

并确保你有一个中断处理程序。在中断处理程序中设置转到 USB 的标志。你应该准备好了。