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
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;
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