Eu tenho trabalhado em um projeto nas últimas duas semanas e a depuração desse problema ocorreu esta semana inteira. Pensando se alguém pode ajudar, tentarei ser o mais explícito e claro possível.
Estou tentando implementar uma porta de comunicação virtual USB em um micro controlador com base no STM32F302K8 (Cortex M4). Usei o STM32CubMX para gerar o código necessário para configurar um dispositivo USB de velocidade total implementando uma classe CDC. Meu dispositivo aparece no Windows (Gerenciador de dispositivos) e Linux. Eu sou capaz de implementar uma função de eco simples com base no código de exemplo, mas quando agora tento usar a função USBD_CDC_SetTxBuffer para enviar dados ao PC, isso desencadeia um Hard Fault Handler. Eu reduzi isso ao fato de que o campo UsbDeviceFS.pClass (necessário para USBD_CDC_SetTxBuffer) nunca é inicializado porque USBD_CDC_Init () nunca é chamado na inicialização do dispositivo USB.
Eu implementei correções para vários bugs (incluindo alterar o tamanho da pilha, corrigir o sinalizador de transmissão em USBD_CDC_TransmitPacket e alterar o tamanho de CDC_DATA_HS_MAX_PACKET_SIZE para 256 de 512) no código de exemplo, conforme documentado no fórum ST, mas ainda com o mesmo erro.
O código de configuração do meu dispositivo é
* 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);
}