01 - Takteinstellung mit der MCAL-Bibliothek

An verschiedenen Stellen im Buch habe ich auf Anhang B verwiesen, wo Informationen zur Einstellung der Taktfrequenz zu finden sind. Die Schwierigkeit besteht darin, dass die dort beschriebene Vorgehensweise schließlich Code generiert, der stark von der HAL-Bibliothek von STM abhängt: Und die Abhängigkeit von der HAL-Bibliothek wollte ich möglichst vermeiden!

Nun ist es aber so, dass zwischen der Abgabe eines Buchmanuskripts und dem Erscheinungsdatum des fertigen Buches naturgemäß einige Zeit vergeht: Lektorat – Korrektur – Erstellen der ersten und zweiten (manchmal auch der dritten) Buchfahne – Druck – Auslieferung an den Buchhandel sind Aktivitäten, die alle einige Zeit in Anspruch nehmen. Dies gilt umso mehr, wenn dann noch der Jahreswechsel mitsamt Feiertagen und Urlaub der Beteiligten „dazwischenfunkt“: Bei meinem STM32-Buch dauerte dies ca. 10 Wochen!

Diese Zeitspanne habe ich genutzt, um die im Verlauf des Buches entwickelte MCAL-Bibliothek um Funktionen zur Einstellung der Taktfrequenz des Mikrocontrollers zu erweitern.

Maximale Taktfrequenzen der STM32F4xx-Familie

Bekanntermaßen beträgt die maximale Taktfrequenz, mit der STM32F4xx-Mikrocontroller getaktet werden können, 180 MHz. Dies gilt aber nicht für alle Mitglieder dieser Familie. Die folgende Abbildung zeigt die möglichen maximalen Taktfrequenzen:

Übersicht: Maximale Taktfrequenzen

Das von mir verwendete NUCLEO64-STM32F446-Entwicklungsboard ist vom Werk so konfiguriert, dass der Mikrocontroller mit einer Frequenz von 16 MHz getaktet wird: Da dieser Mikrocontroller aber mit maximal 180 MHz getaktet werden kann, gibt es also „viel Luft nach oben“.

Grundsätzliches

Es gibt verschiedene Taktquellen, die ein Mikrocontroller nutzen kann, um aus diesem „Ur-Takt“ die gewünschte Zielfrequenz zu erzeugen. Bei den NUCLEO64-STM32F4xx-Boards sind dies

  • HSI (High-Speed Internal): Aus diesem wird auch die im Buch verwendete Taktfrequenz erzeugt.
  • HSE (High-Speed External): Hier wird ein externer Quarz verwendet, dessen Frequenz zwischen 4 und 25 MHz liegen darf.

Auf dem abtrennbaren ST-Link ist aber auch ein externer 8-MHz-Quarz vorhanden, der ebenfalls verwendet werden kann.

Funktionssammlung im Modul mcalSystem

Derzeit sind 23 Funktionen in mcalSystem implementiert: Zur Einstellung des Systemtakts werden aber nur neun dieser Funktionen verwendet, deren Anwendung ich nachfolgend beschreibe.

void sysConfigFlashWaitStates(uint8_t sysclk)

Die Taktfrequenzen haben einen großen Einfluss auf die Zugriffszeiten des internen Flash-Speichers. Da der Systemtakt in einem weiten Bereich eingestellt werden kann, konfiguriert diese Funktion die Anzahl der Wait-States (WS): Sie müssen hier als Parameter nur die gewünschte Taktfrequenz eingeben.

void sysEnableHSE(void) / void sysEnableHSI(void)

Hiermit können Sie auswählen, ob der Systemtakt aus dem externen Quarz oder aus dem internen RC-Generator erzeugt werden soll.

void sysSelectSysclkSrc(SYSCLK_SRC_t sysclkSrc)

Diese Funktion dient zur Einstellung der Taktquelle, aus der schließlich die gewünschte Taktfrequenz erzeugt wird. sysclkSrc kann hier die Werte SYSCLKSRC_HSI, SYSCLKSRC_HSE, SYSCLKSRC_PLLP oder SYSCLKSRC_PLLR annehmen. Wählen Sie die beiden ersten Parameter, so ist der Systemtakt auf die Taktfrequenz HSI (16 MHz) oder HSE (die Frequenz des verwendeten Quarzes) beschränkt. Um höhere Taktfrequenzen bis hin zum maximalen Systemtakt zu erzielen, müssen als Parameter SYSCLKSRC_PLLP oder SYSCLKSRC_PLLR verwendet werden.

void sysSelectPLLClockSource(PLL_CLOCK_SRC_t clkSrc)

Mit dieser Funktion wird eingestellt, ob HSI oder HSE in die PLL-Schaltung (PLL = Phased-lock Loop) eingespeist wird.

void sysAssignClk2MCO(MCO_CLK_SRC_t clkSrc, MCO_TypeDef_t mco)

Der STM32F446 hat zwei Anschlüsse, aus denen der gewählte Systemtakt zur Taktung weiterer externer Peripherie herausgeführt wird. Als clkSrc können hier    die Parameter SYSCLK, PLL_I2S, HSE, PLL_MAIN, HSI oder LSE gewählt werden. Der Parameter mco kann die Werte MCO1 oder MCO2 annehmen.

Der Einsatz dieser Funktion ist nicht vorgeschrieben! Ich habe sie nur genutzt, um die Funktionen zu testen.

void sysSetSysclkFreq(uint8_t fOsc, uint16_t *mcuFreq)

Hier werden die Werte für die PLL-Register berechnet, damit die gewünschte Frequenz auch korrekt erreicht wird. Diese Funktion berücksichtigt Ihre Einstellung in der Datei stm32f4xx.h, in der Sie den von Ihnen verwendeten Mikrocontroller auswählen und begrenzt die Frequenz unabhängig vom Wert von fOsc auf die maximale Taktfrequenz des gewählten Mikrocontrollers.

void sysSetAHBPrescaler(AHB_DIVIDER_t div) / void sysSetAPBPrescaler(AHB_DIVIDER_t div)

Da die Busse AHB und APB aus dem Systemtakt abgeleitet werden, habe ich zur Einstellung ihrer Taktfrequenzen diese beiden Funktionen vorgesehen.

void sysEnableMainPLL(void)

Ganz zum Schluss muss natürlich noch die PLL-Schaltung aktiviert werden: Zu diesem Zweck nutzen Sie diese Funktion.

Anwendungsbeispiel

main.zip (1,2 KiB)

Das Ergebnis

Das folgende Oszillogramm zeigt den Systemtakt (gemessen an MCO1): Hier beträgt die Taktfrequenz 180 MHz. Im rot umrandeten Kasten sehen Sie, was mein Oszilloskop gemessen hat.

Anmerkung:

Die (geringfügige) Abweichung von ca. 0,5% zur gewünschten Taktfrequenz ist sicherlich auch darauf zurückzuführen, dass mein Oszilloskop offiziell „nur“ 100 MHz messen kann.