Forum: Mikrocontroller und Digitale Elektronik STM32 nach Breakpoint in Hardfault Handler bei zu hoher Taktrate


von Tobias K. (jayrock1987)


Lesenswert?

Hallo,

ich habe gerade mit CubeMX ein leeres Projekt für dem STM32F446 
erstellt.

Ein einfaches Blinky Programm läuft problemlos. Allerdings geht der 
Prozessor beim Debuggen immer nach einem Breakpoint wenn wieder auf Run 
geklickt wird in den Hardfault Handler.

Solange man keine Breakpoints setzt läuft das Programm auch im Debugging 
ohne weiteres vor sich hin.

Der Prozessor läuft mit 168Mhz und externem Quarz.

Wenn ich aber die Taktrate bspw. auf 90 Mhz reduziere funktioniert das 
Debuggen mit Breakpoints ohne weiteres.
Debugging hab ich über einen ST Link mit aktueller Firmware laufen. Den 
ST Link vom Discovery hab ich auch schon probiert. Alles gleiches 
Ergebnis.


Hat hier jemand eine Idee ?

Gruß
Tobi

von mts (Gast)


Lesenswert?

Click auf 'Backtrace' und schau dir den letzten Befehl vor dem Hardfault 
an.

von KI-Besitzer (Gast)


Lesenswert?

Bloß nicht das Programm posten, und schon gar nicht die Parameter für 
RCC. Wenn Du sagst, der Chip läuft mit 168MHz dann glauben wir das 
(Amen). Und Waitstates? Ja, hmm, die werden überbewertet.

von Tobias K. (jayrock1987)


Lesenswert?

Hi,


danke für die Antwort.

Sowohl mit HSI als auch HSE tritt das Problem auf.

Falls du (KI-Besitzer) die flash latency meinst...die habe ich mal auf 
Maximum gesetzt:

#define FLASH_LATENCY_15           FLASH_ACR_LATENCY_15WS  /*!< FLASH 
Fifteen Latency cycles  */

Leider keine Änderung. Er springt manchmal nicht mal in den HardFault 
sondern irgendwo ins Nirvana wenn man auf den Stack schaut.

Ich habe aber gerade bemerkt das es scheinbar etwas mit der HAL_Delay 
Funktion zu tun hat.

Sobald ich das HAL_Delay rausnehme aus der main while kann ich ohne 
Probleme Breakpoints setzen und auch wieder weiterlaufen lassen. Bin 
etwas ratlos.


Der Code in der Main.c:

  while (1)
  {
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_10);
  //HAL_Delay(500);
   counter++;


  }


Hier die Clock config:

void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Configure the main internal regulator output voltage
    */
  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = 
RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(_FILE_, _LINE_);
  }

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_15) != 
HAL_OK)
  {
    _Error_Handler(_FILE_, _LINE_);
  }

  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);

  HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_HSE, RCC_MCODIV_1);

    /**Configure the Systick interrupt time
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

von Nop (Gast)


Lesenswert?

Setz doch einfach einen Breakpoint auf den Hardfault-Handler. Guck Dir 
die Register für Faultstatus an, insbesondere CFSR, und decodier den 
Fault Status anhand des Manuals. Dann weißt Du, was schiefgegangen ist.

Außerdem kannst Du Dir bei SP+24 die Adresse angucken, an der das 
abgeschmiert ist. Guck Dir im Debugger an, welcher Codezeile das 
entspricht. Oder geh über das Mapfile, was dann aber nur die Funktion 
verrät.

von . . (Gast)


Lesenswert?

zip doch mal das ganze Projekt und poste es.
Es gibt zu viele mögliche Fehlerquellen.
zB Stackposition und -größe wären weitere mögliche Ursachen.

von Tobias K. (jayrock1987)


Angehängte Dateien:

Lesenswert?

Hallo,

danke. Ja das mit dem Breakapoint im Hardfault werde/mache ich.

Das Projekt samt Cube hab ich mal in den Anhang.
Gruß Tobi

von Tobias K. (jayrock1987)


Lesenswert?

Hallo,


es sieht so aus als liegt es an einem falsch eingelötetem Vcap 
Kondensator. Also kein Software Problem. Behebe es gerade und gebe kurz 
Rückmeldung. Vielen Dank soweit.

von Tobias K. (jayrock1987)


Lesenswert?

Es war ein zu kleiner Kondensator an VCAP. 4700 pF statt 4700 nF.

Die Spannung hatte dadurch 500mV Schwankung an VCAP.

Vielen Dank trotzdem für die Ratschläge. Super Forum

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.