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);
}
Respostas:
Para responder à minha própria pergunta, o problema é que meu código não esperou o USB concluir a inicialização e imediatamente começou a enviar dados. Inserir uma espera ativa em um booleano ou adicionar um atraso (conforme indicado por @ramez) resolve o problema.
UPDATE Este bug foi corrigido nas versões subseqüentes do driver USB CDC do ST. Agora existe um HAL_Delay na configuração. Nota: se por algum motivo o Sys_Tick não funcionar / estiver desativado / ainda não inicializado, seu código será interrompido.
fonte
Usei o CubeMX para gerar código para a descoberta do STM32F4. Eu usei como porta COM virtual como você. Eu não usei a função USBD_CDC_SetTxBuffer () diretamente. No arquivo usbd_cdc_if.c, existe uma função chamada CDC_Transmit_FS () . Houve um erro no código gerado, a função tomou um buffer como parâmetro e não fez nada com ele. O código de função corrigido é o seguinte:
Na verdade, tive que adicionar o memcpy ao código. Após essa correção, eu poderia enviar dados do microcoller para o PC com esta função de transmissão. Por exemplo:
A inicialização em MX_USB_DEVICE_Init () é a mesma para mim que a sua.
fonte
Primeiro, verifique se hUsbDevice_0 é nulo (elemento ausente na sua solução):
Isso impedirá que você desligue o seu uC e não precise esperar muito tempo atrasado.
Você pode colocá-lo em algum lugar no CDC_Transmit_FS:
fonte
Eu tive o mesmo problema, mas a única coisa que preciso fazer foi reconectar a conexão USB ao computador. Na maioria das vezes, você pisca o código e redefine o microcontrolador, mas no lado do PC a enumeração não é atualizada. USBD_CDC_Init é chamado quando o host começa a analisar seu dispositivo e é por isso que pClassData é NULL.
fonte