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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren