He estado trabajando en un proyecto durante las últimas dos semanas y la depuración de este problema ha ocupado toda esta semana. Preguntándome si alguien puede ayudar, intentaré ser lo más explícito y claro posible.
Estoy tratando de implementar un puerto de comunicación virtual USB en un microcontrolador basado en el STM32F302K8 (Cortex M4). He usado STM32CubMX para generar el código necesario para configurar un dispositivo USB de velocidad completa que implemente una clase CDC. Mi dispositivo aparece tanto en Windows (Administrador de dispositivos) como en Linux. Puedo implementar una función de eco simple basada en el código de ejemplo, pero cuando trato de usar la función USBD_CDC_SetTxBuffer para enviar datos a la PC, esto activa un controlador de fallas duras. Lo he reducido al hecho de que el campo UsbDeviceFS.pClass (que es necesario para USBD_CDC_SetTxBuffer) nunca se inicializa porque USBD_CDC_Init () nunca se llama en la inicialización del dispositivo USB.
He implementado correcciones a varios errores (incluido el cambio del tamaño del almacenamiento dinámico, la fijación de la bandera de transmisión en USBD_CDC_TransmitPacket y el cambio del tamaño de CDC_DATA_HS_MAX_PACKET_SIZE a 256 desde 512) en el código de ejemplo como se documenta en el foro ST, pero sigue obteniendo el mismo error.
El código de configuración de mi dispositivo es
* USB Device Core handle declaration */
USBD_HandleTypeDef hUsbDeviceFS;
/* init function */
void MX_USB_DEVICE_Init(void)
{
/* Init Device Library,Add Supported Class and Start the library*/
USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);
USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);
USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);
USBD_Start(&hUsbDeviceFS);
}
Respuestas:
Para responder a mi propia pregunta, el problema es que mi código no esperó a que el USB termine la inicialización e inmediatamente comenzó a enviar datos. Insertar una espera activa en un booleano o agregar un retraso (como lo señaló @ramez) resuelve el problema.
ACTUALIZACIÓN Este error se ha corregido en versiones posteriores del controlador USB CDC de ST. Ahora hay un HAL_Delay en la configuración. La advertencia es que si por alguna razón Sys_Tick no funciona / está desactivado / aún no se ha inicializado, su código se bloqueará.
fuente
Usé CubeMX para generar código para el descubrimiento de STM32F4. Lo usé como puerto COM virtual como tú. No utilicé la función USBD_CDC_SetTxBuffer () directamente. En el archivo usbd_cdc_if.c hay una función llamada CDC_Transmit_FS () . Hubo un error en el código generado, la función tomó un búfer como parámetro y no hizo nada con él. El código de función corregido es el siguiente:
En realidad, tuve que agregar la memoria al código. Después de esta corrección, podría enviar datos desde el microcotroller a la PC con esta función de transmisión. Por ejemplo:
La inicialización en MX_USB_DEVICE_Init () es la misma para mí que la tuya.
fuente
Primero, verifique si hUsbDevice_0 es nulo (falta un elemento en su solución):
Esto evitará que cuelgue su uC y no necesita estar ocupado esperando con demoras.
Puede colocarlo en algún lugar en CDC_Transmit_FS:
fuente
Tuve el mismo problema, pero resultó que lo único que tenía que hacer era volver a enchufar la conexión USB a la computadora. La mayoría de las veces, actualiza el código y reinicia el microcontrolador, pero en el lado de la PC, la enumeración no se actualiza. Se llama a USBD_CDC_Init cuando el host comienza a sondear su dispositivo y es por eso que pClassData es NULL.
fuente