Usando el ejemplo del controlador de almacenamiento masivo USB STM32F4 en modo dispositivo, ¿cómo detecta las conexiones y desconexiones con un controlador host?
Intenté sondear el estado del pin VBUS, pero podría ser alto desde un adaptador de pared o alto sin ninguna comunicación con el host.
¿Hay un registro para comprobar? Noté DSTS (¿estado, supongo?) en las estructuras de la biblioteca USB, pero no pude encontrar su documentación ni ningún comentario útil en el código.
Podría detectar la conexión y desconexión de este archivo:
usbd_core.c
y la API para ello es esta
USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev)
USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev)
No estoy seguro acerca de la clase de almacenamiento masivo USB, pero en la clase CDC, las 2 API anteriores detectan la conexión y desconexión USB, tal vez esto ayude
Cosas a tener en cuenta:
Usé STMCubeMX para generar la clase USB CDC.
usbd_core.c
tiene USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { return USBD_OK; }
... ¿Cómo funciona esto?C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeMX\db\templates\usbdconf_f7_c.ftl
(según el nombre de su tablero) y simplemente eliminar la implementación de las devoluciones de llamada en este archivo. Ahora puede agregar su propia implementación en sus archivos y CubeMx no sobrescribirá su código.void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
{
/* Inform USB library that core enters in suspend Mode. */
USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData);
......
en usbd_conf.c
Llamadas de función en la desconexión del cable usb
(probado en dispositivo de almacenamiento masivo, CubeMX)
Para las personas que desean usar las partes del "Código de usuario" hechas por CubeMX, esta devolución de llamada se llama cuando el USB está conectado al sistema.
void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd)
Y este se llama cuando el USB se desconecta del sistema.
void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd)
Ambas funciones están dentro de usbd_conf.c
La mejor manera de encajar con la pila de software de ST es implementar estas funciones:
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd);
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd);
Estos se declaran con vínculos débiles en la pila HAL, por lo que sus implementaciones anularán los stubs HAL que no hacen nada.
Sin embargo, si está utilizando Cube, encontrará que ya están implementadas usbd_conf.c
y, por razones desconocidas, no hay /* USER CODE BEGIN */
secciones en estas funciones, por lo que Cube sobrescribirá su código la próxima vez que lo guarde. Hasta que ST arregle esto, no debe usar Cube (lo uso para iniciar un proyecto, luego dejo de usarlo y tomo el control) o puede modificar la plantilla de Cube para este archivo.
En el [CUBE-INSTALL-DIR]/db/templates
directorio, busque el usbdconf_XX.ftl
archivo para su MCU. por ejemplo, para el f4 será usbdconf_f4_c.ftl
. Ahora edite ese archivo para incluir bloques únicos USER CODE BEGIN
y de comentarios. USER CODE END
La próxima vez que genere código fuente, tendrá una sección donde podrá colocar su código.
Estoy usando STM32F767ZI y me enfrentaba al mismo problema de no detectar USB como puerto de comunicación virtual, así que agregué la pila mínima de almacenamiento dinámico 2000 y el tamaño máximo de almacenamiento dinámico de 4000 y ¡boom! Empezó a funcionar.
En mi proyecto, estoy usando las devoluciones de llamada que se inicializan/registran en la siguiente estructura:
typedef struct _USBD_CDC_Itf
{
int8_t (* Init)(void); // <- triggered on connection
int8_t (* DeInit)(void); // <- triggered on disconnection
int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length);
int8_t (* Receive)(uint8_t *Buf, uint32_t *Len);
int8_t (* TransmitCplt)(uint8_t *Buf, uint32_t *Len, uint8_t epnum);
} USBD_CDC_ItfTypeDef;
La respuesta es muy simple. ¡Al igual que probó VBUS, pruebe DSTS y vea qué sucede! Buena suerte.
KyranF
chris stratton