Events 检测STM32上的USB连接事件

Events 检测STM32上的USB连接事件,events,embedded,usb,interrupt,Events,Embedded,Usb,Interrupt,我目前使用的是一个支持USB的低功耗设备,这让我有点麻烦。在正常操作期间,系统时钟设置为明显较慢的速度(因为这是一个数据记录器,每隔几分钟才激活一次,所以这不是问题)。但是,当设备插入计算机上的USB端口时,它需要识别该端口,初始化USB堆栈(我可以这样做),并将系统时钟重置为全速(我也可以这样做) 你可能已经注意到,我的问题是“USB连接”事件。我正在查看STM32评估材料,IRQn表中有一个“USB_FS_WKUP_IRQn”,STM32评估板也有USB-5V电源,连接到引脚PE6,引脚PE

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

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

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


提前感谢。

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

// Enable the USB Wake-up interrupt
NVICInit.NVIC_IRQChannel = USB_FS_WKUP_IRQn;
NVICInit.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&NVICInit);
看来你不需要更多了。该实现可能不同于您使用的STM32系列

我使用stm32l4

我在Vbus引脚上设置了一个中断。 不处于USB模式时,将pin配置为下拉式(因此它不会浮动)。 您的pin和中断线可能不同,但是

//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的标志。您应该设置。

不同系列STM32的USB实现不同-您可能需要更具体的STM32F0/1/2/3/4?我想知道这是否是由工具处理的?哦,对不起,这是评估板上的STM32L152ZD,最终的uP将在同一个系列中。您使用的是哪一类?CDC?这是一个HID设备,对不起,应该说清楚。@ThomSirveaux首先你应该使用带usb银行的HID设备,这个问题在大多数嵌入式设备中都会发现,接下来如果有唤醒irq事件,你应该将其配置为这样。。。