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
Click auf 'Backtrace' und schau dir den letzten Befehl vor dem Hardfault an.
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.
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);
}
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.
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.
Hallo, danke. Ja das mit dem Breakapoint im Hardfault werde/mache ich. Das Projekt samt Cube hab ich mal in den Anhang. Gruß Tobi
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.