2016-04-28 35 views
0

Ich habe ein einfaches Projekt mit STCubeMX für meine Nukleo-f446ZE (STM32F446ZET6) erstellt.HAL_GetTick() crash mcu

Das Projekt sollte ein USB-Gerät HID sein, aber es kann nicht gestartet werden. Nachdem ich mich mit dem Debugger beschäftigt hatte, entdeckte ich, dass das MCU-PC-Register auf 0x00000000 oder 0xFFFFFFFF oder manchmal zufälligen ungültigen Wert ging.

Ich habe keinen Code geändert. Ich habe den Code mit MDK-ARM (modifiziertes GCC, Vision IDE) und mit GCC (openSTM32) kompiliert und das Gleiche passiert.

Aufrufhierarchie:

  • Haupt
  • SystemClock_Config
  • HAL_RCC_ClockConfig (632)
  • Hal_GetTick

Ps: RAM nach 0x080149A beschädigt wurde und dass, warum das Programm seltsame Dinge tun Bild Debugger,assembly

Lösung

CubeMX hat sehr gut nicht Uhren-Setup. Hier ist das Setup, das ich verwendet habe, um den USB zu arbeiten.

//RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; 
    //RCC_OscInitStruct.HSIState = RCC_HSI_ON; 
    //RCC_OscInitStruct.HSICalibrationValue = 16; 
    RCC_OscInitStruct.HSEState = RCC_HSE_ON; 
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; 
    RCC_OscInitStruct.PLL.PLLM = 8; 
    RCC_OscInitStruct.PLL.PLLN = 192; 
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; 
    RCC_OscInitStruct.PLL.PLLQ = 4; 
    RCC_OscInitStruct.PLL.PLLR = 2; 
+0

Der Standard 'HAL_GetTick()' Implementierung gibt einfach den Zählerwert im SysTick Interrupt erhöht. (kann aber außer Kraft gesetzt werden - es wird mit "schwacher" Verknüpfung erklärt). Verwenden Sie "Step-In" mit dem Disassembly-Fenster, das ausgewählt wurde, um auf Assembly-Ebene einzutreten. Stellen Sie außerdem sicher, dass Sie genügend Stapel zugewiesen haben und dass der Stapel nicht unterbrochen ist (vor oder während des Aufrufs). – Clifford

Antwort

3

Die RCC_ClkInitStruct wird wahrscheinlich nicht richtig initialisiert (oder überhaupt)

+0

Vielen Dank für Ihre Antwort, aber ich denke, die RCC_CLKInitStruct ist in Ordnung. http://pastebin.com/RxQc2NSZ – user2740652

+1

Tipps, um weiter zu gehen. Deaktivieren Sie die Optimierung auf stm32f4xx_hal_rcc.c (klicken Sie mit der rechten Maustaste auf die Datei im Projektbrowser). Die Assembler-Ausgabe wird einfacher zu verstehen sein. Zweitens, finde die Quelle deines Makros __HAL_RCC_SYSCLK_CONFIG und arbeite zurück, in welche Registry es schreiben soll. Überprüfen Sie, ob die richtige Adresse in die CPU-Register geladen wurde. –

+1

(Im folgenden Code ist MCU wahrscheinlich für die Verwendung eines externen Kristalls konfiguriert. Sind die Definitionen für Crystal MHz in Ihrem Projekt korrekt eingestellt?) –