Forum: Mikrocontroller und Digitale Elektronik STM32F4 Clocks und Systick


von Dustin L. (weeky)


Lesenswert?

Hallo,

ich habe ein kleines Verständnisproblem, aber ich habe im Internet keine 
wirkliche Antwort auf meine Frage gefunden, bzw. vielleicht den Wald vor 
lauter Bäumen nicht gesehen.

Ich habe ein STM32F407-Discovery Board und ein Board mit einem 
STM32F415RGT6.

Als Minimalbeispiel möchte ich mit Hilfe des SysTick-Timers eine LED 
alle 100ms blinken lassen. Ich verwende die StdPeripheral-Library und 
rufe zu Beginn des Codes
1
SystemInit();
2
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
3
RCC_ClocksTypeDef test;
4
RCC_GetClocksFreq(&test);
5
SysTick_Config(test.HCLK_Frequency / 1000);

bzw:
1
SystemInit();
2
SysTick_Config(SystemCoreClock / 1000);

auf um eine Frequenz von 1khz zu bekommen. (Beide Methoden erzielen das 
selbe Ergebnis). Dazu habe ich den SysTickHandler standardmäßig 
definiert:
1
extern "C" void SysTick_Handler(void) {
2
sysTicks++;
3
}
.
Auf dem STM32F415 produziert eine anschließende Warteschleife die 
richtige Frequenz, auf dem STM32F407-DISCO Board beträgt die Wartezeit 
über 300ms. Was ist da anders? Muss ich den Clocktree noch irgendwie 
anpassen? Auf dem STM32F0 musste ich noch den PLL-Multiplier anpassen, 
das ging beim F4 nicht so wie ich das gewohnt war. Und warum 
funktioniert das auf einem Board und auf dem anderen nicht?

Danke im Vorraus!

Gruß

von Curby23523 N. (Gast)


Lesenswert?

Schau mal, ob deine IDE dir da nicht irgendeinen StartupCode reinsetzt 
und irgendeine abstruse Clock einstellt. Diese C-Datei kannst du z.B. 
einfach mal löschen/verschieben/etc. und schau nochmal ob die Frequenz 
nun stimmt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dustin L. schrieb:
> auf dem STM32F407-DISCO Board beträgt die Wartezeit über 300ms.

Keine Ahnung, welche IDE Du verwendest, aber in vielen Fällen hilft das:

In system_stm32f4xx.c Deines Projektes anpassen:

PLL_M: alt 25, neu 8

In "stm32f4xx.h" HSE_VALUE an Quarz-Frequenz anpassen, also 8000000.

Siehe auch: STM32 CooCox Installation: Clock auf 168MHz einstellen.

von Dustin L. (weeky)


Lesenswert?

Hallo,
ja das hab ich auch schon gefunden nach langer Suche gestern, auch das 
Config-Excel-Tool von STM. Das Problem ist, wenn ich das beides mache, 
bzw. das Config-Tool von STM nutze wird mir mein SYSCLK auf 525Mhz 
eingestellt, laut RCC_GetClocksFreq, und im Endeffekt läuft mein 
SystickTimer dann immernoch 3,125 x zu langsam. Wenn ich in dem 
Config-Tool mir eine system_stm32f4xx.c mit HSI als Eingang generieren 
lassen funktioniert alles wie es soll. Liegt das am Quarz? Oder daran 
dass ich C++ benutze? Muss ich da irgendwas auf external "C" stellen?

Vielen Dank!

Gruß

P.S: ich nutze Eclipse Oxygen CDT mit AC6 Plugin.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dustin L. schrieb:
> und im Endeffekt läuft mein SystickTimer dann immernoch 3,125 x zu
> langsam.

25 / 8 = 3.125

Die 25Mhz hast Du offenbar vergessen.

Hast Du denn HSE_VALUE angepasst, wie ich es Dir angeraten habe? Ich 
mache das mittlerweile nicht mehr in der Datei stm32f4xx.h, sondern in 
den Projekt-Settings (benutze EM:Bitz):

-DHSE_VALUE=8000000

da in stm32f4xx.h die 25MHz nur bedingt gesetzt werden, nämlich wenn 
HSE_VALUE undefiniert ist.

Seht auch so in stm32f4xx.h als Kommentar drin:

"Tip: To avoid modifying this file each time you need to use different 
HSE, you can define the HSE value in your toolchain compiler 
preprocessor."

von Dustin L. (weeky)


Lesenswert?

Hi,
danke für die vielen hilfreichen Beiträge.
Ich glaube das Problem ist, dass ich die StdPeripheralLib als externe 
Bibliothek eingebunden habe, und sie als .a-Lib einbinde. Als ich sie 
als Source in das Projekt eingefügt habe ging es. Hm eigentlich wollte 
ich die StdPeripheral-Library gerne für alle meine F4-Devices in einem 
Ordner haben.
Oder hab ich einen Denkfehler?

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.