Pracuję nad projektem przez ostatnie dwa tygodnie i debugowanie tego jednego problemu zajęło cały tydzień. Zastanawiam się, czy ktokolwiek może pomóc, postaram się wyrazić jak najlepiej.
Usiłuję zaimplementować port USB Virtual Comm na mikrokontrolerze opartym na STM32F302K8 (Cortex M4). Użyłem STM32CubMX do wygenerowania kodu potrzebnego do skonfigurowania urządzenia USB Full Speed USB implementującego klasę CDC. Moje urządzenie wyświetla się zarówno w systemie Windows (Menedżer urządzeń), jak i Linux. Jestem w stanie zaimplementować prostą funkcję echa opartą na przykładowym kodzie, ale kiedy teraz próbuję użyć funkcji USBD_CDC_SetTxBuffer do wysyłania danych do komputera, uruchamia się Hard Fault Handler. Zawęziłem to do faktu, że pole UsbDeviceFS.pClass (które jest wymagane przez USBD_CDC_SetTxBuffer) nigdy nie jest inicjalizowane, ponieważ USBD_CDC_Init () nigdy nie jest wywoływane podczas inicjalizacji urządzenia USB.
Zaimplementowałem poprawki do kilku błędów (w tym zmianę wielkości sterty, naprawienie flagi transmisji w USBD_CDC_TransmitPacket i zmianę rozmiaru CDC_DATA_HS_MAX_PACKET_SIZE na 256 z 512) w przykładowym kodzie, jak udokumentowano na forum ST, ale wciąż otrzymuję ten sam błąd.
Mój kod konfiguracji urządzenia to
* 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);
}