Tengo un dispositivo alimentado por batería que utiliza un STM32F107 . El dispositivo funciona y actualmente estoy trabajando para minimizar su consumo de energía.
Uno de los mayores consumos de corriente es el subsistema USB, que utiliza aproximadamente 8 mA cuando está inactivo. El USB solo se utiliza para fines de configuración; casi siempre es innecesario tenerlo habilitado.
Estoy usando ST de la biblioteca USB v2.1.0 . Se comunica como un puerto COM virtual de clase CDC ("VCP"). Estoy usando la velocidad completa incrustada PHY.
Al encenderlo, quiero que el USB se inicie y esté activo durante, por ejemplo, 30 segundos. Después de esto, asumiendo que no hay conexión a un host, quiero simplemente cerrar la funcionalidad USB. Como si nunca lo hubiera habilitado en primer lugar.
No veo nada expuesto en la API que haría esto posible. Hay algunas funciones notables, pero no parecen ser lo que necesito:
-
de la plantilla de la API:
usbDeInit()
Esto es para código de usuario personalizado. Sin embargo, es llamado por la función de controlador de dispositivo
usbd_cdc_DeInit()
, que en realidad nunca se llama, por lo que puedo ver. -
en la biblioteca cdc_core:
usbd_cdc_DeInit()
Este es el archivo al que nunca se llama en la fuente del controlador. Cierra los puntos finales, luego llama a la función
usbDeInit()
(mencionada anteriormente). Parece prometedor; sin embargo, se declara comostatic
en la fuente del controlador. Dudo en cambiar el código de la biblioteca del controlador directamente, ya que esto se sobrescribirá cuando se actualice el controlador de ST en el futuro. -
de la biblioteca device_core:
USBD_DeInit()
El controlador lo llama en algunos lugares, pero está vacío. Es decir, la función no contiene ningún código. De nuevo, prefiero no cambiar la fuente del controlador de ST.
Mi enrutamiento de inicialización se ve así:
// Configure USB Clock Source
RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div3);
// Enable USB Clock
RCC_AHBPeriphClockCmd(USB_AHB_CLK, ENABLE);
// Initialize USB
USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_CDC_cb, &USR_cb);
Por supuesto, si simplemente deshabilito la fuente del reloj USB, entonces el microcontrolador se bloquea.
Me he asegurado de que el interruptor USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
esté habilitado en el archivo usb_conf.h, pero el sorteo actual permanece. Supongo que no entra en modo de suspensión (que, como dice Ali Chen, sería la solución adecuada).
- ¿Alguien sabe cómo lograr lo que estoy buscando?
- ¿Debo hacer algo especial en el lado del Host para decirle al dispositivo que suspenda?