Controller Tipp PLL-Initialisierung für den HCS12
Viele Mikrocontroller beziehen ihre Taktversorgung über eine externe Taktquelle (Quartz oder Keramik-resonator), wenn die Frequenz besonders genau und stabil sein muss. Das ist vor allem bei...
Anbieter zum Thema
Viele Mikrocontroller beziehen ihre Taktversorgung über eine externe Taktquelle (Quartz oder Keramik-resonator), wenn die Frequenz besonders genau und stabil sein muss. Das ist vor allem bei Controllern der Fall, die ein CAN- oder Ethernet-Kommunikations-interface verwenden, wie z.B. die Derivate aus der HCS12-Familie von Freescale.Die interne Busfrequenz kann bei den HCS12-MCUs über eine interne PLL erzeugt werden. Die PLL muss nach dem Starten der MCU (Reset) initialisiert werden. Eine Besonderheit der PLL der genannten Produkte ist der „Clock-Monitor“, der den Referenztakt des Quartzoszillators überwacht. Bleibt dieser aus, kann der „Clock-Monitor“ wahlweise einen Systemreset oder das Umschalten auf einen internen Nottakt (Self-Clock Mode) bewirken.Zusätzlich zum „Clock-Monitor“ überprüft ein „Clock Quality Checker (CQC)“ den Takt beim Starten der MCU nach Power-On, Reset bei Spannungseinbruch (LVI) und beim Aufwecken aus dem STOP-Modus. Der CQC kann ebenfalls einen Systemreset oder den Self-Clock Mode auslösen. Da beide Überwachungsfunktionen NUR aktiv sind, wenn die PLL eingeschaltet wird, ist es wichtig, die PLL-Initialisierung am Anfang des Programms durchzuführen, damit die Überwachung auch am Anfang stattfindet.Da heute häufig Hochsprachen-Compiler verwendet werden, muss deshalb an den Start-up-Code des Compilers Hand angelegt werden. Der Hersteller des C-Compilers, der die Start-up-Routine liefert, kann das nicht, da er die Startbedingungen des Anwenders (Quartzfrequenz und Zielbusfrequenz) nicht weiß.
Am Beispiel der C-Entwicklungsumgebung CodeWarrior soll das demonstriert werden. Dazu wird ein Auszug aus dem Listing der Start-up-Routine (START12.C) gezeigt. Die in rot dargestellten Code-Zeilen müssen vom Anwender an dieser Stelle eingefügt werden. Sie fehlen in der Originaldatei STARTUP.C des C-Compilers. Das Beispiel zeigt die Initialisierung für eine Busfrequenz von 25 MHz bei einem 8-MHz-Quartz. Der Multiplizierfaktor und der Dividierfaktor müssen entsprechend der eigenen Verhältnisse angepasst werden.Am Anfang der Start-up-Routine werden die Speicherbereiche festgeschrieben.Der HCS12 ermöglicht das Verschieben der internen Speicherbereiche. Man sollte auf jeden Fall diese Register beschreiben, auch wenn man den Speicher nicht verschieben will. Diese Register sind (nach einem Reset) nur einmal beschreibbar und werden nach dem Schreibvorgang gegen versehentliches Überschreiben gesperrt. Bevor man die PLL deaktiviert, um sie initialisieren zu können, muss die Busfrequenz vom Quartz gewählt werden (CLKSEL = 0). Danach wird die PLL gesperrt und die Teiler- und Multiplizierfaktoren können eingetragen werden.Um die Überwachungsfunktionen freizuschalten, muss man den Clock-Monitor und den Self-Clock-Modus zusammen mit der PLL freigeben.Danach wartet man, bis die PLL einrastet. Dies wird in dem C-Code in der While-Schleife durchgeführt. Eine hier nicht gezeigte Variante wäre, einen Time-out in die While-Schleife einzubauen, um zu verhindern, dass bei einem eventuellem Ausbleiben des Einrasten der PLL die MCU ewig in dieser While-Schleife verbleibt und das System nicht anläuft. Rastet in einer bestimmten Zeitdauer die PLL nicht ein, wird, bei freigegebenem Watchdog dieser einen Systemreset durchführen. Hat sich die PLL eingeschwungen, kann Systemtakt wieder vom PLL-Takt abgeleitet werden (CLKSEL_PLLSEL = 1). Danach erfolgt die weitere Initialisierung des Systems.
(ID:145780)