STM32 nach Breakpoint in Hardfault Handler bei zu hoher Taktrate

OP #5456477
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
Gast #5456636
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.
OP #5458642
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);
}
Gast #5458796
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.

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.