STM32F429 USB-CDC klappt nicht

Gast #4355080
Lesenswert?
• ▲
▼
Hallo,

ich versuche seit einiger Zeit aus dem STM32F429 Discoveryboard ein 
USB-CDC -Device zu machen. Leider hält sich der Erfolg in Grenzen. Ich 
habe mittels CubeMX den Quellcode erzeugt und compiliert.

Beim anstecken an den PC werden einige Interrupts ausgelöst:
int: rst
int: en done
int: rst
int: en done
int: rst
int: en done
int: suspend

Am PC ist anschliessend zu sehen, dass die Enumeration fehlgeschlagen 
ist.
Ich benutze CubeMX und die Firmware in der aktuellsten Version (4.11.0 
bzw. V1.9.0).

Ich benutze OTG_HS als Device_only. Meine Konfiguration:
1
  hpcd_USB_OTG_HS.Instance = USB_OTG_HS;
2
  hpcd_USB_OTG_HS.Init.dev_endpoints = 11;
3
  hpcd_USB_OTG_HS.Init.speed = PCD_SPEED_FULL;
4
  hpcd_USB_OTG_HS.Init.dma_enable = DISABLE;
5
  hpcd_USB_OTG_HS.Init.ep0_mps = DEP0CTL_MPS_64;
6
  hpcd_USB_OTG_HS.Init.phy_itface = USB_OTG_EMBEDDED_PHY;
7
  hpcd_USB_OTG_HS.Init.Sof_enable = DISABLE; //konflikt mit lcdt
8
  hpcd_USB_OTG_HS.Init.low_power_enable = DISABLE;
9
  hpcd_USB_OTG_HS.Init.lpm_enable = DISABLE;
10
  hpcd_USB_OTG_HS.Init.vbus_sensing_enable = ENABLE;
11
  hpcd_USB_OTG_HS.Init.use_dedicated_ep1 = DISABLE;
12
  hpcd_USB_OTG_HS.Init.use_external_vbus = DISABLE;

Hat jemand eine Idee, wie ich den Fehler finden kann, ohne jetzt in die 
Untiefen des USB-Stacks eintauchen zu müssen?

Vielen Dank,
Markus
#4355560
Lesenswert?
• ▲
▼
Bei Verwendung von Keil als Compiler ist die Heap Größe zu gering. Sie 
ist auf 512Byte eingestellt. Im gesamten Projekt, d.h. im CDC Driver 
gibt es genau ein malloc, das aber mit NULL zurückkehrt, da mehr als die 
512 Bytes angefordert werden. Vergrößert man den Heap, funktioniert der 
vom CubeMX generierte Code.
Gast #4355920
Lesenswert?
• ▲
▼
Hallo,

ich benutzt den gcc. Ich habe aufgrund eines Postings im st Forum (*) im 
Linkerscript (STM32F429ZI_FLASH.ld) den Heap von 0 auf 0x4000 geändert, 
bringt aber keine Änderung:
1
/* Generate a link error if heap and stack don't fit into RAM */
2
/* _Min_Heap_Size = 0; */      /* required amount of heap  */
3
/* _Min_Stack_Size = 0x400; *//* required amount of stack */
4

5
_Min_Heap_Size = 0x4000;      /* required amount of heap  */
6
_Min_Stack_Size = 0x2000; /* required amount of stack */

Trotzdem Danke für den Hinweis,
Markus

hier der Link:

https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Java/Flat.aspx?RootFolder=https%3a%2f%2fmy.st.com%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fSTM32Java%2fSTM32Cube%20CDC%20-%20problems%20and%20a%20possible%20bug&FolderCTID=0x01200200770978C69A1141439FE559EB459D758000F9A0E3A95BA69146A17C2E80209ADC21&currentviews=2514
Gast #4356087
Lesenswert?
• ▲
▼
SysClock ist 168 MHz, der Clock für USB ist dann glaube ich 48 MHz (sh. 
Screenshot).

Hier der generierte Code des Clockeinstellung:
1
void SystemClock_Config(void) {
2

3
  RCC_OscInitTypeDef RCC_OscInitStruct;
4
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
5
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
6

7
  __PWR_CLK_ENABLE();
8

9
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
10

11
  RCC_OscInitStruct.OscillatorType =   RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
12
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
13
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
14
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
15
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
16
  RCC_OscInitStruct.PLL.PLLM = 8;
17
  RCC_OscInitStruct.PLL.PLLN = 336;
18
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
19
  RCC_OscInitStruct.PLL.PLLQ = 7;
20
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
21

22
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1
23
                              |RCC_CLOCKTYPE_PCLK2;
24
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
25
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
26
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
27
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
28
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
29

30

31
  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_RTC;
32
  PeriphClkInitStruct.PLLSAI.PLLSAIN = 192;
33
  PeriphClkInitStruct.PLLSAI.PLLSAIR = 4;
34
  PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_8;
35
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
36
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
37

38
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 1 ms
39

40
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
41
}
Angehängte Dateien:
Gast #4371381
Lesenswert?
• ▲
▼
Ich habe jetzt mal ein komplett neues Projekt aufgesetzt, in dem nur 
USB-CDC (und UART1 für eventuelle Debuggingausgaben) implementiert ist. 
Damit klappt es (zumindest wird USB korrekt enummeriert und am PC der 
entsprechende Treiber geladen).

Der ursprüngliche Fehler wird also irgendwo in der Mischung zwischen 
HAL-Code und eigenen Modifikationen zu suchen sein (ich hatte am 
USB-Teil allerdings keine Modifikationen gemacht).
Ich werde also mal nach und nach alle anderen Module (TFT-Controller, 
SPI5, SDRAM,...) wieder mit reinnehmen, und hoffen, daß USB weiterhin 
funktioniert.

Vielen Dank für die Unterstützung,
Markus
Gast #4371389
Lesenswert?
• ▲
▼
Ok, ich hab den Fehler (das ging jetzt schnell):

Am Ende der Mainloop schicke ich den Controller schlafen um Strom zu 
sparen:
1
 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

Damit scheint der USB-Stack nicht klar zu kommen.

Markus

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.