Ich habe gerade mal mit Stm32CubeMX auf einem Stm32F103C8 ein Projekt
generieren lassen mit einer minimalen USB-CDC Initialisierung. Leider
kam es immer wieder zu Hardfaults. Grund ist ein definitiver Fehler im
Code den CubeMx generiert. Falls jemand auch schon mal daran fast
verzweifelt ist hier die Lösung:
In der Datei usbd_conf.c wurden die beiden Funktionen USBD_static_malloc
und USBD_static_free implementiert die intern aus der USB-Lib gerufen
werdern. Dabei wird aber kein dynamischer Speicher allociert sondern den
einen einzigen nötigen Aufruf auf statischen Speicher gemappt. Blöd nur
wenn man das dann dynamisch mit free wieder frei gibt:
1 | /**
|
2 | * @brief static single allocation.
|
3 | * @param size: size of allocated memory
|
4 | * @retval None
|
5 | */
|
6 | void *USBD_static_malloc(uint32_t size)
|
7 | {
|
8 | static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];//On 32-bit boundary
|
9 | return mem;
|
10 | }
|
11 |
|
12 | /**
|
13 | * @brief Dummy memory free
|
14 | * @param *p pointer to allocated memory address
|
15 | * @retval None
|
16 | */
|
17 | void USBD_static_free(void *p)
|
18 | {
|
19 | free(p);
|
20 | }
|
die Zeile mit free(p) sollte auskommentiert werden, dann geht es. Je
nachdem welche Umgebung zum Einsatz kommt ist free nicht oder als dummy
implementiert. Da fällt dann dieser Fehler nicht auf. Anderenfalls sucht
man sich blöd, da es nicht im free() abschmiert sondern erst im nächsten
Interrupt.
Eventuell hilft das ja jemanden, das wird sicher auch alle anderen STM32
mit USB betreffen.