Forum: Mikrocontroller und Digitale Elektronik STM32: SystemCoreClockUpdate wird nicht erkannt


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Johannes (menschenskind)


Angehängte Dateien:

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

von Gustl B. (gustl_b)


Lesenswert?

Wieso include mal mit <> und mal mit " "?

von Monk (Gast)


Lesenswert?

Ich denke, du hast die falsche Header Datei inkludiert. Nimm die andere 
der beiden genannten, und mit <>.

von Johannes (menschenskind)


Lesenswert?

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.

von Andreas B. (abm)


Lesenswert?

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.

von Wastl (hartundweichware)


Lesenswert?

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.

von Johannes (menschenskind)


Angehängte Dateien:

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

von Wastl (hartundweichware)


Lesenswert?

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

von Johannes (menschenskind)


Angehängte Dateien:

Lesenswert?

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.

von Wastl (hartundweichware)


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.

von Wastl (hartundweichware)


Lesenswert?

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?

von Monk (Gast)


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
}

von Johannes (menschenskind)


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.

von Michael F. (Firma: IAR Systems) (michael_iar)


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.
von Johannes (menschenskind)


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.

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
Noch kein Account? Hier anmelden.