Hallo,
Ich will in einem STM32 Projekt den SysTick Timer initialisieren.
Dabei bekomme ich beim Compile diesen Fehler (siehe Bild), obwohl "SystemInit" und "SystemCoreClockUpdate" in derselben Header-Datei ("system_stm32l0xx.h") definiert sind. Und diese wiederum wird innerhalb der "stm32l011xx.h" eingebunden.
Eigentlich keines. Da meckert der Linker ... Die entsprechende Object-Datei wird offenbar nicht hinzugelinkt, oder das Symbol wird nicht in die Object-Datei exportiert.
Eigentlich keines. Da meckert der Linker ... Die entsprechende
Object-Datei wird offenbar nicht hinzugelinkt, oder das Symbol wird
nicht in die Object-Datei exportiert.
Ja korrekt, im Output Fenster steht das ja auch explizit:
1
Building 'Systick_Test' from solution '1LED' in configuration 'THUMB Debug'
2
Compiling 'main.cpp'
3
Assembling 'STM32_Startup.s'
4
Assembling 'thumb_crt0.s'
5
Generating linker script 'Systick_Test.ld'
6
Linking 'Systick_Test.elf'
7
Systick_Test THUMB Debug/main.o: in function `main':
8
(.text.main+0xe): undefined reference to `SystemCoreClockUpdate'
Hm, Ok ich dachte Du erstellst Dir einfach ein eigenes Projekt mit nem zufälligen STM32L011 in Deiner IDE.
Weil so sieht mein Projektbaum mit den Abhängigkeiten aus.
SystemCoreClockUpdate() ist genau wie SystemInit() eine Funktion, die man selbst implementieren kannst. Sie ist in CMSIS-Core (was ja nur Header sind) nicht implementiert.
Wenn du die Funktion implementierst, dann soll sie, die relevanten Register für die Taktkonfiguration auslesen und die Variable SystemCoreClock entsprechend setzen.
Alternativ kannst du die Variable SystemCoreClock direkt beschreiben. Dann sparst du dir das Auslesen und Verrechnen der Register.
Beispiel aus einem meiner Projekte für den STM32L072:
1
// The current clock frequency
2
uint32_tSystemCoreClock=2097000;// Default after reset
3
4
// Change system clock to 32 MHz using internal 16 MHz R/C oscillator
SystemCoreClockUpdate() ist genau wie SystemInit() eine Funktion, die
man selbst implementieren kannst. Sie ist in CMSIS-Core (was ja nur
Header sind) nicht implementiert.
Ok, vielen Dank für die Klärung! Für mich war die SystemInit bisher eine Funktion die für jeden µC irgendwo definiert ist, aber deren Code ich mir nicht ansehen konnte.
Habe nun recherchiert, dass man die nur selten benötigt, wenn man irgendwelche kritischen Sachen vor dem Start der main bearbeiten will um z.B. die Taktfrequenz zu erhöhen.
Du solltest halt schauen, ob am Ende im Projekt das File von ST verwendet wird oder eine angepasste Version von Segger, in der eventuell die entsprechende Funktion fehlt.
wenn Du Dein Projekt auf Basis von STM32CubeMX startest, dann sollte
SystemCoreClockUpdate in
1
.\Core\Src\system_stm32f4xx.c
definiert sein. So ist es zumindest beim STM32F4, den ich gerade mal
getestet habe...
Für den Import eines STM32CubeMX Projekts in Segger Embedded Studio
(danach sieht der Screenshot aus)
Hi Michael,
nein ich nutze das Crossstudio von Rowley und nutze auch nicht die HAL bzw. LL Bibliotheken aus dem CubeMX, sondern eigene Hardwareklassen.
Das mit dem SystemInit hatte ich auch nur angegangen, weil ich bei einer anderen Problematik nicht weiterkam und dachte, dass evtl. diese Funktion initial ausgeführt werden muss.