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. Was für ein Problem hat denn der Compiler? Danke fürs Lesen. Hannes
Ich denke, du hast die falsche Header Datei inkludiert. Nimm die andere der beiden genannten, und mit <>.
Monk schrieb: > Ich denke, du hast die falsche Header Datei inkludiert. Nimm die andere > der beiden genannten, und mit <>. Das ergibt leider keine Veränderung. Gustl B. schrieb: > Wieso include mal mit <> und mal mit " "? Die debugio.h hat die IDE beim Anlegen der Projekts eingefügt. Den anderen include hatte ich aus nem anderen Projekt eingefügt.
Johannes schrieb: > Was für ein Problem hat denn der Compiler? Eigentlich keines. Da meckert der Linker ... Die entsprechende Object-Datei wird offenbar nicht hinzugelinkt, oder das Symbol wird nicht in die Object-Datei exportiert.
Johannes schrieb: > Das ergibt leider keine Veränderung. Poste doch einfach mal dein komplettes Projekt (vorher "cleanen" und dann zippen). Dann kann man schauen wo es klemmt.
Andreas B. schrieb: > 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' |
9 | Build failed, exit status 0x1 |
10 | Build failed |
Johannes schrieb: > Systick_Test.zip (25,6 KB) Wastl schrieb: > Poste doch einfach mal dein komplettes Projekt (vorher "cleanen" > und dann zippen). Was ist an diesem Satz nicht zu verstehen? Du schickst ein müdes main.cpp und ein *.ld File. Oh mann .... komplettes Projekt
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.
Johannes schrieb: > Weil so sieht mein Projektbaum mit den Abhängigkeiten aus. Ahhh soo, verstehe ..... und da es ja nur eine IDE im Mikrocontroller-Universum gibt braucht man die auch nicht angeben. Johannes schrieb: > Ok ich dachte Du erstellst Dir einfach ein eigenes Projekt mit nem > zufälligen STM32L011 in Deiner IDE. Nö, mach ich nicht. Ich hab nämlich zufällig kein STM32L011 Projekt zu Verfügung. Ich schlage vor du fängst mal neu an, benutzt die CubeIDE von STM, und wenn du dann nicht weiterkommst zeigst du dein Projekt.
Nebenbei frage ich mich was man hier im Forum tut wenn man seit 16 (in worten: sechzehn) Jahren hier angemeldet ist und so einen Mist postet. Ist jetzt der Montag schon der neue Freitag?
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_t SystemCoreClock=2097000; // Default after reset |
3 | |
4 | // Change system clock to 32 MHz using internal 16 MHz R/C oscillator
|
5 | void init_clock() |
6 | {
|
7 | SET_BIT(RCC->CR, RCC_CR_HSION); |
8 | while(!READ_BIT(RCC->CR, RCC_CR_HSIRDY)) {} |
9 | MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_HSI); |
10 | while ((RCC->CFGR & RCC_CFGR_SWS_Msk) != RCC_CFGR_SWS_HSI) {} |
11 | CLEAR_BIT(RCC->CR, RCC_CR_PLLON); |
12 | while(READ_BIT(RCC->CR, RCC_CR_PLLRDY)) {} |
13 | SET_BIT(FLASH->ACR, FLASH_ACR_LATENCY); |
14 | WRITE_REG(RCC->CFGR, RCC_CFGR_PLLSRC_HSI + RCC_CFGR_PLLMUL4 + RCC_CFGR_PLLDIV2); |
15 | SET_BIT(RCC->CR, RCC_CR_PLLON); |
16 | while(!READ_BIT(RCC->CR, RCC_CR_PLLRDY)) {} |
17 | MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_CFGR_SW_PLL); |
18 | SystemCoreClock=32000000; |
19 | }
|
20 | |
21 | int main() |
22 | {
|
23 | init_clock(); |
24 | ...
|
25 | }
|
Wastl schrieb: > Nebenbei frage ich mich was man hier im Forum tut wenn man > seit 16 (in worten: sechzehn) Jahren hier angemeldet ist und > so einen Mist postet. > > Ist jetzt der Montag schon der neue Freitag? Was soll denn diese dummdreist patzige Antwort?! Überheblicher geht's ja wohl nicht! Troll dich, du impertinente Knallerbse! Monk schrieb: > 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.
Johannes schrieb: > Weil so sieht mein Projektbaum mit den Abhängigkeiten aus. Moin, 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) gibt es die folgende Tech-Note: https://wiki.segger.com/Import_projects_from_STM32CubeMX_to_Embedded_Studio 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. Gruß, Michael
Beitrag #7682308 wurde von einem Moderator gelöscht.
Michael F. schrieb: > 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.
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.