Forum: Mikrocontroller und Digitale Elektronik STM32F429 USB-CDC klappt nicht


von Markus (Gast)


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

von O. H. (ohagendorf)


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.

von Markus (Gast)


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

von Bülent C. (mirki)


Lesenswert?

Auf was hast Du Dein SYSCLK gesetzt? Mit 180MHz gibt es Schwierigkeiten 
das USB zum laufen zu bekommen...Mit 168MHz dürfte es laufen.

von Markus (Gast)


Angehängte Dateien:

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
}

von Bülent C. (mirki)


Lesenswert?

sieht soweit eigentlich ok aus.
Versuch mal, ob Du das Beispiel zum laufen bekommst:
http://mikrocontroller.bplaced.net/wordpress/?page_id=2856

von Markus (Gast)


Lesenswert?

Bülent C. schrieb:
> Versuch mal, ob Du das Beispiel zum laufen bekommst:
> http://mikrocontroller.bplaced.net/wordpress/?page_id=2856

Die Seite wird von unserer IT blockiert. Ich werd's mal am WE @home 
runterladen und nächste Woche testen.

von Markus (Gast)


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

von Markus (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.