AT32UC3C - Einstieg in die Programmierung: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
Zeile 32: Zeile 32:
===Register===
===Register===


  <p style="background-color:#B3B7FF"> AVR32_<MODUL NAME>.<register name>   
  <p style="background-color:#B3B7FF"> AVR32_<MODUL NAME>.<register name>  <br>


Beispiel: AVR32_USART0.cr  </p>
Beispiel: AVR32_USART0.cr  </p>

Version vom 24. Oktober 2013, 20:16 Uhr

Motivation

Ich beschäftige mich nunmehr seit einem Jahr im Rahmen eines Praktikums bei der Bosch Engineering GmbH mit dem AT32UC3C0512C. Ich habe in dieser Zeit einige Erkenntnisse gewonnen, die ich Euch hier gerne zur Verfügung stellen möchte. Während meiner Recherche habe ich die Erfahrung gemacht, dass man einige Quellen zur A- und B-Serie des AT32UC3 findet, jedoch wenig zur C-Serie. Das Atmel Software Framework war für mich in den meisten Fällen ebenfalls nicht brauchbar, da es viel zu komplex aufgebaut ist. Daher hoffe ich, dass ich mit diesem Beitrag einigen von Euch den Einstieg in die Programmierung mit dem AT32UC3C erleichtern kann. Viel Erfolg!

Architektur

Architektur AT32UC3C.png

Der AT32UC3C0512C besitzt einen 32-bit-RISC-Prozessorkern mit 512KB Flash und 64KB SRAM. Der Prozessor kann mit einer Taktfrequenz von bis zu 66MHz betrieben werden. Der Prozessorkern ist umgeben von Peripheriemodulen, die für die verschiedenen Funktionen des Controllers zuständig sind. Die einzelnen Module erhalten ihren Arbeitstakt über die drei Peripheriebusse PBA, PBB und PBC (graue Pfeile im Bild), deren Takte jeweils einzeln konfiguriert werden können. Diese Peripheriebusse sind neben der HighSpeedBusMatrix (HSB, orangener Kasten im Bild) für den Informationsaustausch zwischen den verschiedenen Modulen zuständig. Die lila dargestellten Module sind für interne Funktionen wie Taktfrequenzen, Speicherorganisation, Interruptfreigaben usw. zuständig. Die grün dargestellten Module sind dagegen für die Kommunikation mit dem Controllerumfeld verantwortlich. In meinen weiteren Beiträgen werde ich vor allem auf die Konfiguration der wichtigen internen Funktionen eingehen, die notwendig sind, um den Mikrocontroller zu betreiben.

Headerfiles

Folgende Headerfiles müssen in einem Programm für den AT32UC3 eingebunden sein:

- intypes.h

- avr32/io.h

Der avr32/io-Header fragt ab, welcher Mikrocontroller als Device ausgewählt wurde und bindet einen dazu passenden Header ein. Dieser wiederum bindet eine große Anzahl von Header-Files ein, die Defines für die einzelnen Funktionsmodule des Controllers enthalten. In den Headerfiles sind sowohl den Registern, als auch den im Datenblatt erwähnten wichtigen Bits und Werten jeweils Namen zugewiesen, um den Programmcode lesbarer zu gestalten. Diese Namen sind nach einer Systematik benannt, die hier im nächsten Beitrag „Beschreiben von Registern“ erläutert wird.

Systematische Bezeichnung von Registern, Bitfeldern, Masken

Hier soll die Systematik der Namen erklärt werden, die für die Bezeichnung von Registern, Bitfeldern und Masken in den Systemheader-Files hinterlegt sind:

Register

AVR32_<MODUL NAME>.<register name>
Beispiel: AVR32_USART0.cr


Mit dieser Bezeichnung wird die absolute Adresse eines Registers angegeben. Im Beispiel handelt es sich um das USART-Control Register, das die absolute Adresse 0xFFFF2800 hat. AVR32_USART0.cr heißt also dasselbe wie 0xFFFF2800.

Wenn es mehrere Register gibt, die gleich heißen und zur Identifizierung mit einer laufenden Nummer versehen sind, sieht die Bezeichnung so aus:

AVR32_< MODUL NAME >.<register name>[n]

Beispiel: AVR32_SCIF.oscctrl[0]

Register Offset

AVR32_< MODUL NAME >_<REGISTER NAME> Beispiel: AVR32_USART_CR

Diese Bezeichnung gibt den Registeroffset, also die Speicherposition im jeweiligen Modulspeicher, an. Im Beispiel ist das CR (Control Register) das erste Register im Modul USART und hat damit den Offset 0x0000. Es gibt fünf USART-Module (USART0-USART4), wobei alle Module gleich aufgebaut sind. Damit ist der Registeroffset überall gleich.

Bit-Felder

AVR32_< MODUL NAME >_< REGISTER NAME >_<BITFELD NAME> Beispiel: AVR32_USART_CR_TXEN

Bitfelder sind ein- oder mehrere Bit große Registerbereiche, die auf eine bestimmte Weise beschrieben werden müssen, damit ein entsprechende Funktion ausgeführt wird. Jedes Bitfeld, dem eine Funktion zugewiesen ist, hat einen zur Funktion passenden Namen, der im Datenblatt in der Registerübersicht zusammen mit der zugehörigen Funktion vermerkt ist. Die Bitfeldzeichnung gibt die Position im Register an.

Im Beispiel heißt das Bitfeld TXEN (Transmitter Enable). Da es sich beim TXEN um das Bit 6 im CR-Register handelt, ist die Bezeichnung AVR32_USART_CR_TXEN gleichbedeutend mit der Zahl 6.

Absolute Adressierung von Bitfeldern

AVR32_<MODUL NAME>.< REGISTER NAME >.< bitfield name > Beispiel: AVR32_USART.CR.txen

Wenn man ein Bitfeld in einem Register direkt beschreiben will, kann man die absolute Adresse des Registerbereichs auf diese Weise angeben.

Offset

AVR32_< MODUL NAME >_< REGISTER NAME >_< BITFIELD NAME >_OFFSET Beispiel: AVR32_USART_CR_TXEN_OFFSET

Diese Bezeichnung ist gleichbedeutend mit der Bezeichnung des Bitfeldes selbst. Sie enthält lediglich das Zusatzwort _OFFSET, um besser zu verdeutlichen, dass es sich um die entsprechende Dezimalzahl für das Bit im Register handelt.

Masken

AVR32_< MODUL NAME >_< REGISTER NAME >_< BITFIELD NAME >_MASK Beispiel: AVR32_USART_CR_TXEN_MASK

Die Bitfeldbezeichnung mit dem Zusatz _MASK steht für eine Hexadezimalzahl, die als Binärzahl umgerechnet an der Stelle des bezeichneten Bits eine 1 enthält. Setzt man sie mit dem Register gleich, setzt man an der entsprechenden Stelle das Bit. Im Beispiel ist AVR32_USART_CR_TXEN_MASK gleichbedeutend mit 0x00000040.