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);
}