STM32: SystemCoreClockUpdate wird nicht erkannt

OP #7680508
Lesenswert?

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

Angehängte Dateien:
OP #7681455
Lesenswert?

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
Angehängte Dateien:
#7681574
Lesenswert?

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.

Gast #7681582
Lesenswert?

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
}
OP #7681821
Lesenswert?

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.

Gast #7681897
Lesenswert?

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.
OP #7682708
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren