RCC Modul: Ganz schön taktlos…

11. März 2012

Ich weiß nicht wie oft ich schon in die Falle getappt bin. Es ist eigentlich immer das Gleiche. Ich versuche gerade mal wieder eine Peripherie in Betrieb zu nehmen und konfiguriere alle Register so wie ich es denke, starte den Debugger und nichts geht! Dann geht wie immer die Sucherei nach dem Fehler los. Mmhh… ist doch eigentlich alles richtig. In der Std Peripheral Library ist eigentlich auch alles so gemacht. Eigentlich sollte das blöde Ding also tun, tut es aber nicht :-(. Aber halt, da war ja noch das sog. RCC Modul des Controllers. Ja klar! Ohne Takt geht natürlich nichts! Also, schnell mal den Takt der besagten Peripherie eingeschaltet und siehe da, es geht also doch :-).  Man muss sich wirklich erst mal an dieses neue Ding gewöhnen. Besonders wenn man wie ich von einer anderen Controllerfamilie auf den STM32 wechselt…

So, hier nun das „kurze“

RCC Peripherie Tutorial

Beim STM32 ist es so, dass zunächst mal die meisten Peripheriemodule nach einem Reset nicht mit einem Takt versorgt werden. D.h. diese Module verbrauchen damit auch nur sehr wenig Strom. Was aus Standby Sicht eigentlich eine schöne Sache ist führt aber auf der anderen Seite immer wieder zu oben geschilderten Suchorgien am Debugger. Damit eine Peripherie wie z.B. ein GPIO verwendet werden kann muss dessen Takt also erst mal im RCC Modul eingeschaltet werden. Hierfür gibt es im wesentlichen drei Register:

  1. RCC_AHBENR
  2. RCC_APB2ENR
  3. RCC_APB1ENR

Wie die Namen schon andeuten kann man über das RCC_AHBENR Register Peripherieeinheiten einschalten die sich am AHB Bus des Controllers befinden. Die beiden anderen Register sind dementsprechend für Peripherieeinheiten am APB2 bzw. APB1 Bus zuständig. Jede Peripherieeinheit hat in einem dieser Register ein Bit mit dem man den Takt der jew. Einheit ein- bzw. ausschalten kann. Ist das Bit gesetzt, ist der Takt eingeschaltet, ist es gelöscht, so ist der Takt ausgeschaltet. Peripherieeinheiten können grundsätzlich nur dann konfiguriert werden wenn der Takt der Einheit eingeschaltet ist. Ist eigentlich ganz einfach, oder?

Damit ich mich immer an diese Register erinnere habe ich immer zwei Seiten aus den Datenblättern der Controller ausgedruckt auf meinem Schreibtisch liegen. Das sind:

  1. Den Clock Tree des Controllers den man im RCC Kapitel des Reference Manuals findet und
  2. Das Blockdiagramm des Controllers welches man im Datasheet des eingesetzten Controllers findet.

Im Clock Tree sieht man sehr gut die ganzen Zusammenhänge der verschiedenen Controllertakte, und es gibt einige davon, und im Blockdiagramm findet man schnell an welchem Bus eine Peripherie angebunden ist. Damit findet man also auch schnell in welchem RCC Register eine Peripherie aktiviert werden muss.

Neben den ganzen Clock Enable Registern findet man im RCC Modul auch noch weitere Register welche z.B. auch das Resetten einer Peripherieeingeit ermöglichen. Das Modul ist also generell mal einen Blick Wert da hier alle Fäden bzgl. der Taktkonfiguration zusammenlaufen.

Was ich noch verschwiegen habe ist das RTC Modul des Controllers. Da dieses Modul in der Backup Domain des Controllers angesiedelt ist verhält es sich ein wenig anders (auch in Bezug auf die Taktfreischaltung). Hierauf möchte ich aber hier nicht näher eingehen.

Hier noch abschließend ein kurzes Beispiel:

Wenn man z.B. den GPIO Port B verwenden möchte schaut man zunächst im Blockdiagramm nach auf welchem Bus dieser Port liegt. Hier findet man, dass alle GPIOs auf dem APB2 Bus liegen. Damit kann der Port B über das Register RCC_APB2ENR aktiviert werden und das geht ganz einfach so:

RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;

Trackback URI | Kommentare als RSS

Einen Kommentar schreiben

Du musst angemeldet/a> sein, um kommentieren zu können.