ESI Script

Transcription

ESI Script
Embedded Systems basierend auf ARM
Prozessoren
Z ÜRCHER H OCHSCHULE FÜR A NGEWANDTE
W ISSENSCHAFTEN
I NSTITUTE OF E MBEDDED S YSTEMS
Autoren:
Hans-Joachim Gelke
Letzte Änderung: 26. Februar 2010
Inhaltsverzeichnis
Inhaltsverzeichnis
Abbildungsverzeichnis
iv
Tabellenverzeichnis
vi
Listings
vii
1
2
Einführung
1
1.1
1.2
1.3
1.4
1
1
2
Architektur des ARM7 CPU Core
2.1
2.2
2.3
2.4
2.5
3
Instruction Pipeline . . . . . . . . . . . .
Register . . . . . . . . . . . . . . . . . .
2.2.1 Current Program Status Registers
2.2.2 General Purpose Registers . . . .
2.2.3 Programm Zähler . . . . . . . . .
2.2.4 Link Register . . . . . . . . . . .
2.2.5 Register Banking . . . . . . . . .
Exception Modes . . . . . . . . . . . . .
Nested Interrupts . . . . . . . . . . . . .
Die ARM Befehlssätze . . . . . . . . . .
3.3
Bisherige Methode . . . . . . . . . .
In Circuit Emulation (ICE) . . . . . .
3.2.1 Probleme mit ICE . . . . . .
3.2.2 Integrierte ICE auf ARM chip
ARM ETM . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4.4
6
7
7
8
9
9
9
11
12
13
16
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
ARM7 System Peripherie am Beispiel des LPC2138
4.1
4.2
4.3
3
3
4
5
ARM Software Entwicklungsumgebung
3.1
3.2
4
Intellectual Property (IP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ARM core Prozessor IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verfügbare IP Produkte von ARM LTD. . . . . . . . . . . . . . . . . . . . . . . . . . .
Gründe warum sich ARM Prozessoren in embedded Systemen als Standard durchgesetzt
haben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4.1 Stromverbrauch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4.2 Kode Dichte und Leistungsfähigkeit . . . . . . . . . . . . . . . . . . . . . . . .
Bus Struktur . . . . . . . . . . . . . . . . . . . . . .
Memory Map . . . . . . . . . . . . . . . . . . . . .
Der Flash Speicher . . . . . . . . . . . . . . . . . .
4.3.1 Programmieren der Special Function Register
4.3.2 Flash Speicher Pogrammierung . . . . . . .
4.3.3 Memory Map Control . . . . . . . . . . . .
Interrupt System . . . . . . . . . . . . . . . . . . . .
4.4.1 Eintreten in die Interrupt Routine . . . . . .
4.4.2 Verlassen eines Interrupts . . . . . . . . . .
i
16
16
17
17
19
20
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
22
23
25
25
25
26
28
28
29
Inhaltsverzeichnis
4.5
5
5.6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
37
38
39
40
42
43
45
46
47
47
47
49
50
50
50
50
51
52
Aufsetzen der Entwicklungsumgebung . . . . . . . . . . . . .
6.0.6.1 Projekt einrichten und Default Startup Datei kopieren
6.0.6.2 Dateistruktur aufbauen und Quelldateien kopieren . .
6.0.6.3 Optionen einstellen . . . . . . . . . . . . . . . . . .
Starten des Debuggers . . . . . . . . . . . . . . . . . . . . . .
Anzeigen eines Zählers auf dem Display . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Übung 2
52
52
52
53
55
55
56
7.0.9
Auslesen der Chip ID . . . . . . . . . . . .
7.0.9.1 Einführung . . . . . . . . . . . .
7.0.9.2 Ausführung der Übung . . . . .
7.0.10 Anzeigen der Eingestellten Radiofrequenz .
7.0.11 Auswerten des Drehgebers . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Hardware-Umgebung des Radio Projektes
8.1
8.2
30
30
31
31
32
34
35
36
36
37
Übung 1
6.0.7
6.0.8
8
.
.
.
.
.
.
.
.
.
Setzen und Rücksetzen von lpc2138 Registern . . . . . . . . . . . . . . . . . . . .
General Purpose I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pin Connect Block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
General Purpose Timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
I2CInterface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5.1 Beispiel eines I2C Bus transfers . . . . . . . . . . . . . . . . . . . . . . .
5.5.2 Register im I2C Baustein . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5.3 I2C Interrupts und Status Register . . . . . . . . . . . . . . . . . . . . . .
5.5.4 Beispiel: Ansteuern des Radio IC TEA5764HN mit I2C . . . . . . . . . .
5.5.4.1 TEA5764 Register Ketten . . . . . . . . . . . . . . . . . . . . .
5.5.4.2 Beispiel C-Code zum Ein/Aus-lesen der TEA5764 Registerketten
SPI Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6.1 Beispiel Ansteuern des LCD displays mit SPI . . . . . . . . . . . . . . . .
5.6.2 Senden des Start-Bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6.3 Senden von Daten oder Befehlen . . . . . . . . . . . . . . . . . . . . . . .
5.6.4 KS0073 Befehle und Daten . . . . . . . . . . . . . . . . . . . . . . . . .
5.6.5 Subroutine zum Senden von ASCII Daten auf das LCD Display . . . . . .
6.0.6
7
.
.
.
.
.
.
.
.
.
Anwender Peripherie des LPC2138
5.1
5.2
5.3
5.4
5.5
6
4.4.3 Beispiel Programmieren der Interrupts
4.4.4 External Interupt Registers . . . . . .
Externe Bus Schnittstellen . . . . . . . . . .
4.5.1 Adressdekoder für die Chip Selects .
4.5.2 Anschliessen von externen Speichern
4.5.3 Buszyklen . . . . . . . . . . . . . . .
4.5.3.1 Externe Wait . . . . . . . .
4.5.3.2 Early Read . . . . . . . . .
4.5.3.3 Bus Relax Zeiten . . . . .
56
56
58
58
58
59
Das Keil MCB2130 Development board . . . . . .
Radioboard mit LCD . . . . . . . . . . . . . . . .
8.2.1 Drehgeber . . . . . . . . . . . . . . . . . .
8.2.2 Radio IC TEA5764 . . . . . . . . . . . . .
8.2.2.1 Berechnen der Abstimmfrequenz
8.2.2.2 Frequenzzähler . . . . . . . . .
ii
60
60
60
61
61
62
Inhaltsverzeichnis
8.3
8.4
8.5
8.6
8.2.2.3 Steuerregister . . . . . . . . . . . . .
Entwicklungssystem . . . . . . . . . . . . . . . . . . .
Beispiel Anwendungssoftware . . . . . . . . . . . . . .
Softwarepflichtenheft . . . . . . . . . . . . . . . . . . .
8.5.1 Display . . . . . . . . . . . . . . . . . . . . . .
8.5.2 Suchlauf . . . . . . . . . . . . . . . . . . . . .
8.5.3 Frequeneinstellung per Handrad . . . . . . . . .
8.5.4 Speichern einer Frequenz . . . . . . . . . . . . .
8.5.5 Frequeneinstellung per Stationstasten . . . . . .
8.5.6 Umschalten zwischen Mono- und Stereoempfang
Schaltpläne der Versuchsboards . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
62
63
63
64
64
64
65
65
65
65
66
Literaturverzeichnis
69
Index
70
iii
Abbildungsverzeichnis
Abbildungsverzeichnis
1.1
1.2
Foto eines Mobiltelefon Baseband IC mit ARM7 . . . . . . . . . . . . . . . . . . . . .
IP Produkte von ARM LTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
3
Blockdiagram des ARM7 cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ARM7 Processor Instruction Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . .
Current Processor Status Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
General Purpose Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Registerbanking in den Unterschiedlichen OP modes . . . . . . . . . . . . . . . . . . .
Eception Vektor Tabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gleichzeitig eintretende Exceptions werden Priorisiert . . . . . . . . . . . . . . . . . .
Bei den 32-Bit ARM Befehlen sind jeweils 4-Bits für 16 mögliche Ziel und Quellregister
reserviert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.9 Zum Vergleich ein Thumb Befehl. Hier sind nur 3-Bits für die Register reserviert. Das
heisst nur die unteren 8 Register können direkt durch die Thumb Anweisung adressiert
werden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.10 Echtzeitdekomprimierung eines Thumb Befehles . . . . . . . . . . . . . . . . . . . . .
5
6
7
8
10
11
11
3.1
3.2
3.3
JTAG debug interface im LPC2138 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
JTAG connector am MCB2130 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schnittstellen zum ARM-ETM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
18
19
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
Blockdiagramm des LPC2138 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Bus Struktur im LPC2138 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Speicherbereichs-Aufteilung des LPC2138 . . . . . . . . . . . . . . . . . . . . . . . .
Allgemeine Darstellung eines Special Function Registers . . . . . . . . . . . . . . . .
Testen ob die Vektortabelle im Flash gültig ist . . . . . . . . . . . . . . . . . . . . . .
Vectored Interrupt Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Negativer Überlauf resultiert dass der Inhalt von 0xFFFF F030 in den PC geladen wird
Memory Map der Atmel AT91X40 Serie . . . . . . . . . . . . . . . . . . . . . . . . .
EBI Chip Select Register des AT91X40 . . . . . . . . . . . . . . . . . . . . . . . . .
Anschliessen eines 8-bit Speichers an einen 16-bit EBI (Speicher rechts) . . . . . . . .
Bei 16-bit breiten Speichern wird A1 des Prozessors an A0 der Speicher angeschlossen
EBI Zugriff beim AT91X40 ohne Wait States . . . . . . . . . . . . . . . . . . . . . .
EBI Zugriff mit einem Wait State . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Einfügen von Externer Bus Wait Zyklen . . . . . . . . . . . . . . . . . . . . . . . . .
Early Read Zyklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
22
23
25
26
28
29
31
32
33
33
34
35
35
36
5.1
5.2
5.3
5.4
5.5
5.6
5.7
General Purpose I/O Steuerung . . . . . . . . . . . . . . . . . .
Pin Connect Block . . . . . . . . . . . . . . . . . . . . . . . .
Timer Counter und Prescaler . . . . . . . . . . . . . . . . . . .
Timer Match Register . . . . . . . . . . . . . . . . . . . . . . .
Typische I2C bus configuration . . . . . . . . . . . . . . . . . .
I2C Bus Protokoll . . . . . . . . . . . . . . . . . . . . . . . . .
I2C Bus Timing, Unterscheidung von Start und Stop Conditions
.
.
.
.
.
.
.
38
39
40
41
42
43
44
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
iv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
14
15
Abbildungsverzeichnis
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
I2C Control und Status Register . . . . . . . . . . . . .
I2C Steuerregister . . . . . . . . . . . . . . . . . . . . .
Bedeutungen der wichtigsten I2C Status Register Kodes .
Schreibe und Leseregisterketten im TEA5764 Radiochip
Schreiberoutine zu einem Peripheral am I2C Bus . . . .
Leseroutine zu einem Peripheral am I2C Bus . . . . . .
Signale der SPI Schnittstelle . . . . . . . . . . . . . . .
Protokoll der SPI Schnittstelle . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
45
45
46
47
48
48
49
50
6.1
6.2
6.3
Projaketdateien am PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
uVision4 Projekt nach linken der Source Dateien . . . . . . . . . . . . . . . . . . . . .
Blockdiagramm der Ziel-Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
53
54
7.1
7.2
7.3
7.4
Block Diagramm des Radio mit I2C . . .
I2C Protokolll . . . . . . . . . . . . . . .
Read und Write Register im Slave . . . .
Softwareroutine zum lesen des I2C Slaves
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
56
57
57
58
8.1
8.2
8.3
8.4
Blockdiagramm der Ziel-Hardware . . . . . .
Vom Drehgeber erzeugte Pulse . . . . . . . .
Radiochip TEA5764 . . . . . . . . . . . . .
Anordnung der Bedien- und Anzeigeelemente
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
59
60
61
64
v
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Tabellenverzeichnis
Tabellenverzeichnis
vi
Listings
vii
1 Einführung
Das ARM Design wurde 1983 vom englischen Computerhersteller Acorn Computers Ltd. als Entwicklungsprojekt gestartet. Das Team, unter der Leitung von Roger Wilson und Steve Furber, begann die
Entwicklung eines leistungsfähigen Prozessors für einen Nachfolger der bis dahin auf dem 6502 basierenden Computer.
Anstatt, wie die Konkurrenz, auf Prozessoren der Firmen Intel oder Motorola zurückzugreifen, entwickelte man einen eigenen Prozessor, den ARM (Acorn Risc Machine), mit 32-Bit und einer geplanten
Taktfrequenz von 4 MHz. Die Tests mit den Prototypen verliefen derart erfolgreich, dass die späteren
Serienprozessoren (ARM2), die in den neu entwickelten Rechnern (Acorn Archimedes) verbaut wurden,
direkt mit 8 MHz getaktet wurden. Tests ergaben, dass diese Rechner, bei praktisch gleicher Taktfrequenz, etwa 8 mal schneller waren als die Konkurrenten Commodore Amiga und Atari ST.
Nachdem der ARM2 1989 zum ARM3 (mit Cache und höherer Taktfrequenz) weiterentwickelt worden
war, und immer mehr Firmen Interesse an diesen Prozessoren bekundeten, gründete Acorn im Jahre 1990
zusammen mit Apple und VLSI Technology die Firma Advanced RISC Machines Ltd. (ARM) mit Sitz
in Großbritannien.
1.1 Intellectual Property (IP)
Mit IP-Core oder Intellectual Property Core (vom engl. Intellectual Property - Geistiges Eigentum) bezeichnet man in der Halbleiterindustrie, speziell beim Chipentwurf eine wiederverwendbare Beschreibung eines Halbleiterbauteils.
Unternehmen, die diese elektronischen Designs entwerfen und an andere Unternehmen lizenziert, werden als IP-Hersteller bezeichnet. Bei ihnen kann man z. B. einen Prozessor als fertige Einheit (quasi als
Makro) erwerben, um die eigenen Entwicklungen erweitern und damit einen ASIC oder FPGA programmieren. Geisteseigentum oder Intellectual Property kurz IP gehört zu den heissesten und meisten begehrtesten Gütern der neuen Wirtschaft. Nirgendwo ist dies offensichtlicher als auf dem Halbleitermarkt, wo
eine IP Revolution eine Neue Generation von Digitalen Elektronischen Produkten definiert. IP bildet die
Basis der sich ständig weiterentwickelnden Prozessoren und treibt Innovation durch das breite Spektrum
von Konsumenten und Professionellen Anwendungen und führt Breitbandkommunikation und Drahtlose
Netzwerke zu neuen Grenzen.
1.2 ARM core Prozessor IP
ARM hat sich zum Ziel gemacht ARM Prozessorkerne und entsprechende Produkte nur das IP zu vermarkten, dabei stellt ARM LTD die Prozessoren nicht selbst her sondern Lizenziert nur dessen Bauplan.
1
1 Einführung
Philips Mobil Phone IC mit ARM7 core
ARM7
Abbildung 1.1: Foto eines Mobiltelefon Baseband IC mit ARM7
Ein IP-Core existiert meist in Form von Source-Code in einer speziellen Hardwarebeschreibungssprache
wie Verilog oder VHDL, kann aber auch ein IC Layout in einer bestimmten Halbleitertechnologie sein
(0.18um, 0.09 um, 0.065 um CMOS).
Die Entwicklung für den Lizensnehmer erfolgt dadurch nach dem Baukastenprinzip und kann vereinfacht
bzw. beschleunigt werden.
Die Anwendung von Mikroprozessoren in vielen Elektronischen Geräten ist so gebräuchlich, dass die
Benutzung von Prozessor IP in „System-on-chip“ (SOC) Entwicklungen die Grundlage für fast alle Elektronischen Anwendungen in der Welt bildet. Es ist zu erwarten, dass sich dieser Trend weiter fortsetzen
wird.
1.3 Verfügbare IP Produkte von ARM LTD.
Hardware IP-RTL oder Macrozellen
• Prozessor Cores (Arm7, ARM9, ARM11)
• Direct Memory Access Controller (DMA)
• SDRAM Controller
• Serielle Schnittstellen (UART)
• Real time Clock
• Media Card Interface (Flash Card)
• Hardware Audio Codecs (MP3)
Software
• Audio Codecs
• MPEG2 encoder
System On chip design tools (SOC)
2
1.4 Gründe warum sich ARM Prozessoren in embedded Systemen als Standard durchgesetzt haben
• Debugger und C-Assembler (Keil gehört seit Anfang 2006 zur ARM Ltd.)
• Simulatoren
• Testbenches zur Design Verifizierung
• Software und Hardware Consulting
ARM Prozessor Cores
Mehr unter: www.arm.com/products
Abbildung 1.2: IP Produkte von ARM LTD
1.4 Gründe warum sich ARM Prozessoren in embedded Systemen als
Standard durchgesetzt haben
1.4.1 Stromverbrauch
Der Stromverbrauch der ARM Prozessoren ist von vornherein sehr gering, ein ARM 7 TDMI verbraucht
nur 0.1mW/MHz im 0.13u Halbleiterprozess. Heutige CMOS Schaltungen verbrauchen nur dann Strom,
wenn sich das Taktsignal von 0 -> 1 oder von 1-> 0 ändert (abgesehen von statischen Transistor Leckströmen, die bei Prozessen unter 0.13 um ein signifikantes Problem darstellen). Die Energie wird verbraucht
durch auf und entladen der parasitären Kapazitäten, d.h. je höher die Taktfrequenz des Prozessors, desto öfter müssen Kapazitäten umgeladen werden und der Stromverbrauch steigt an. Umgekehrt wird der
Stromverbrauch geringer, wenn man den Takt verlangsamt oder ganz abschaltet. Dies wird zum Beispiel
im Standby Modus eines Mobiltelephones gemacht. Dabei ist es wichtig, dass der Prozessor beim Abschalten des Taktes seine Registerwerte nicht verliert, oder bei verlangsamten Takt zwar mit weniger
Rechenleistung, aber noch genau so funktionsfähig ist. Nicht bei allen Prozessoren ist dies selbverständlich. ARM Prozessoren erlauben dies.
3
1 Einführung
1.4.2 Kode Dichte und Leistungsfähigkeit
ARM Prozessoren haben zwei Befehlssätze, einen 16-bit Befehlssatz und einen 32-bit Befehlssatz. Es
kann während des Betriebes zwischen Befehlssätze hin und hergeschaltet werden. In den meisten Fällen
kommt man mit dem 16-bit Befehlssatz aus. Dieser hat, gegnüber dem 32-bit Kode, den Vorteil nur die
Hälfte des Speicherplatzes zu belegen. Trotzdem werden im Prozessor die 32-bit Busse verwendet, was
die Vorteile der Leistungsfähigkeit eines 32-bit Prozessors mit der Kodedichte eines 16-bit Prozessors
verbindet. Muss der umfangreichere 32-bit Befehlssatz verwendet werden, so kann die Umschaltung
während des Programmablaufes geschehen.
4
2 Architektur des ARM7 CPU Core
ARM7 Core Block Diagramm
PC bus
Address register
Address
Incrementer
Incrementer bus
ADDR[31:0]
Scan debug
control
CLK
CLKEN
CFGBIGEND
nIRQ
nFIQ
nRESET
32 x 8
multiplier
Barrel shifter
B bus
A bus
ALU bus
Register bank
31 x32-bit registers
(6 status registers)
Instruction
decoder and
control bgic
ABORT
LOCK
WRITE
SIZE[1:0]
PROT[1:0]
TRANS[1:0]
32-bit ALU
DBG outputs
DBG inputs
CP control
CP handshake
Write data register
WDATA[31:0]
Instruction pipeline
Read data register
Thumb instruction decoder
RDATA[31:0]
Abbildung 2.1: Blockdiagram des ARM7 cores
5
2 Architektur des ARM7 CPU Core
2.1 Instruction Pipeline
Aufgabe der Instruction Pipeline ist es Befehle aus dem Programmspeicher zu verarbeiten. Im ARM7
wird eine 3-stufige Pipeline benutzt. Die Stufen der Pipeline arbeiten unabhängig voneinander und parallel. Während die dritte Stufe die Verantwortung für die Ausführung eines Befehls hat, dekodiert die vor
geschaltete zweite Stufe gleichzeitig den nachfolgenden Befehl, während die erste Stufe den nächsten
Befehl aus dem Speicher holt. Die Pipeline beschleunigt den Befehlsablauf so, dass in den meisten Fällen
pro Taktzyklus ein Befehl vollständig abgearbeitet werden kann. Dies funktioniert am effizientesten bei
linearer Programmabarbeitung, dass heisst wenn es keine Sprünge zu Unterprogrammen gibt. Im Falle
eines Sprunges, welcher erst von der dritten Pipeline-Stufe festgestellt werden kann, ist der Inhalt von
Stufe eins und zwei hinfällig und der Inhalt der gesamten Pipeline muss verworfen werden. Danach muss
die Pipeline erst wieder neu mit den Befehlen des Unterprogramms gefüllt werden, bevor diese zur Ausführung kommen. Gibt es viele Unterprogramme, würde die Effizienz der Pipeline deshalb gemindert.
Um diese Ineffizienzen zu lindern, hat die Architektur des ARM7 einige Vorkehrungen, die wir später
kennen lernen. Die Pipeline ist für den Benutzer absolut transparent, jedoch muss bedacht werden, dass
der Program Counter immer 8-Bytes vor der ausgeführten Instruktion voreilt.
1
2
3
4
Fetch
Decode
Execute
Abbildung 2.2: ARM7 Processor Instruction Pipeline
6
5
6
Instruction
2.2 Register
2.2 Register
Es gibt 16 32-Bit breite Arbeitsregister, R0-R12 sind allgemein verwendbar, R13-R15 sind für spezielle
Funktionen.
2.2.1 Current Program Status Registers
Condition Code Flags:
N = Negative
Z = Zero
C = Carry Over
V = Overflow
F = FIQ enable Betriebszustand:
I = IRQ enable FIQ
T = Thumb mode IRQ
Supervisor
User
Undefined
Abbildung 2.3: Current Processor Status Register
Die vier MSB (Most Significant Byte) des 32-Bit Current Program Status Register (CPSR) enthalten den
Zustandskode (Condition Code), welcher von der CPU gesetzt wird. Die Condition Codes repräsentieren den Status nach Ausführen einer Operation. Von den Zustandskodes kann man schliessen, ob eine
Operation ein negatives Ergebnis, ein null Ergebnis, einen Übertrag oder Überfluss produziert hat.
Bits-6 und -7 sind die Interrupt (IRQ) und Fast Interrupt (FIQ) enable Bits. Damit kann der Anwender
IRQ und FIQ ein- und ausschalten. An diese Interruptleitungen ist die Vectored Interrupt Controll Unit
angeschlossen, wie sie später besprochen wird. Vorsicht: Die Bedeutung dieser Bits ist invertiert, 0
schaltet die Interrupts ein, 1 schaltet sie aus.
ARM CPUs können zwei verschiedene Befehlssätze ausführen: Den ARM Befehlssatz, welcher 32-Bit
breit ist und der Thumb Befehlssatz, welcher 16-Bit breit ist. Bit-5 zeigt an ob gerade ARM oder Thumb
Befehlscode ausgeführt wird. Vorsicht: Dieses Bit darf nicht so ohne weiteres manipuliert werden. Um
vom ARM in den Thumb Modus umzuschalten gibt es spezielle Vorgänge, die im „Insiders Guide“
[Mar05] nachgelesen werden können.
Die Least-Significant 5-Bits zeigen die Betriebsart des Prozessors an. Der ARM7 hat sieben verschiedene
Betriebsarten. Das Anwendungsprogram läuft normalerweise in der „User“ Betriebsart. Tritt jedoch eine
Exception ein, welches ein Interrupt, Adressierungsfehler oder Softwareinterrupt sein könnte, ändert der
Prozessor seine Betriebsart.
Mögliche Betriebsarten sind:
1. User: Normale Betriebsart.
2. FIQ: Ein Fast Interrupt wird ausgeführt.
7
2 Architektur des ARM7 CPU Core
3. Supervisor: Nur in dieser Betriebsart können bestimmte privilegierte Operationen ausgeführt werden.
4. Abort: Ein Adressierungsfehler (z.B. Speicher ausserhalb des Memory Map angesprochen) ist
aufgetreten.
5. IRQ: Eine Interrupt Routine wird ausgeführt.
6. Undefined: Eine unbekannter Befehl befindet sich in der Instruktionspipeline.
Falls Betriebsart 2-6 Eintritt, wird der gesamte Inhalt des CPSR in das Safed Program Status Register
(SPSR) übertragen. Nach Ausführen der Exception, beim Zurückspringen in die „User“ Betriebsart, wird
dann das SPSR wieder in den CPSR zurück kopiert und die ursprüngliche Daten sind wieder im CPSR
enthalten.
2.2.2 General Purpose Registers
R13 is used as the stack pointer
R14 is the link register
R15 is the Program Counter
R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13
R14
R15 (PC)
Current Program Status Register
CPSR
15 User registers + PC
Abbildung 2.4: General Purpose Registers
General Purpose Register bezeichnet man Register, die keine speziellen Funktionen erfüllen und zu allgemeinen Speicherzwecken benutzt werden können. Im Gegensatz dazu steht der Stack Pointer (SP)
oder der Programmzähler (PC), die eine fest gebundene Funktion haben. Im ARM Modus sind R0-R12
General Purpose Register. Im Thumb Modus sind nur die Register R0-R7 direkt zugreifbar.
Die restliche Register (R13-R15) haben spezielle Funktionen und haben sehr spezifische Rollen: R13 ist
der Stack Pointer (SP), während R14 als Link Register (LR) dient.
8
2.2 Register
2.2.3 Programm Zähler
R15 beinhaltet den Programmzähler. In ARM Modus sind Bits [1:0] immer logisch null (32-Bit Adressierung). Im Thumb Modus ist Bit [0] immer logisch null (16-Bit Adressierung).
2.2.4 Link Register
Beim Eintreten in eine Unterprogram wird der Programmzähler R15 (PC) in das Link Register kopiert,
beim Verlassen der Unterprogram dient das LR wieder als Aufsetzpunkt für den Programmfortlauf.
Wie beim CPSR beschrieben, können bei Fast Interrupts (FIQ-Betrieb) Register R8-R12 mit speziell für
Fast Interrupts vorgesehenen Registern ausgetauscht werden, sobald der Prozessor eine Fast Interrupt
Routine ausführt. Dies hat den Vorteil eines schnellen Eintretens in diese Interrupt Routinen ohne vorher
die Register auf den Stack abspeichern zu müssen. Man nennt dies auch Register Banking.
2.2.5 Register Banking
Jede Prozessorbetriebsart (FIQ, IRQ, Supervisor, Abort etc.) hat ihre eigene Version von SP und LR zum
Beispiel R13_irq und R14_irq. Läuft der Prozessor im System Betrieb, benutzt er R13 und R14. Muss er
aber in der Zwischenzeit einen Interrupt ausführen, so wird bei Eintritt in das Interrupt Unterprogramm
R13 mit R13_irq und R14 mit R14_irq ausgetauscht. R13_irq und R14_irq sind also im Hintergrund
schon mit den für die Interrupt Routine vorgesehenen Werten geladen, werden aber solange die Interrupts
noch nicht ausgeführt werden nicht benutzt. Das hat den Vorteil, dass Interrupt Routinen Ihren eigenen
SP oder LR haben können und diese beim Wechsel in den Interrupt nicht erst vom externen Speicher mit
den neuen Werten geladen werden müssen, sondern schnell ausgetauscht werden können. Man spart so
Zeit beim Eintritt und Verlassen von Interrupt Routinen, was bei Embedded Real Time Anwendungen
sehr wichtig ist. Beim Verlassen der Interrupt Routine werden R13_irq wieder mit R13 und R14_irq
wieder mit R14 ausgetauscht. Für die FIQ Betriebsart werden sogar R8 bis R14 ausgetauscht, mit R8_fiq
- R14_fiq. Das heisst R8 und R14 stehen nicht für alle Betriebsarten global zur Verfügung. Register
die beim Eintritt in andere Prozessorbetriebsarten ausgetauscht werden können nennt man auch Banked
Registers, da z. B. mit R8-R14 eine ganze Bank von Registern ausgetauscht werden.
9
2 Architektur des ARM7 CPU Core
System & User
FIQ
Supervisor
Abort
IRQ
Undefined
R0
R0
R0
R0
R0
R0
R1
R1
R1
R1
R1
R1
R2
R2
R2
R2
R2
R2
R3
R3
R3
R3
R3
R3
R4
R4
R4
R4
R4
R4
R5
R5
R5
R5
R5
R5
R6
R6
R6
R6
R6
R6
R7
R7_fiq
R7
R7
R7
R7
R8
R8_fiq
R8
R8
R8
R8
R9
R9_fiq
R9
R9
R9
R9
R10
R10_fiq
R10
R10
R10
R10
R11
R11_fiq
R11
R11
R11
R11
R12
R12_fiq
R12
R12
R12
R12
R13
R13_fiq
R13_svc
R13_abt
R13_irq
R13_und
R14_fiq
R14_svc
R14_abt
R14_irq
R14_und
R15 (PC)
R15 (PC)
R15 (PC)
R15 (PC)
R15 (PC)
R14
R15 (PC)
CPSR
CPSR
CPSR
CPSR
CPSR
CPSR
SPSR_fiq
SPSR_svc
SPSR_abt
SPSR_irq
SPSR_und
Abbildung 2.5: Registerbanking in den Unterschiedlichen OP modes
10
2.3 Exception Modes
2.3 Exception Modes
Wenn sich eine Exception ereignet, ändert die CPU Ihre Betriebsart und der Programzähler (PC) wird
auf den Exception Vektor gezwungen. Die Vektortabelle beginnt bei PC Adresse 0x00000000 mit dem
Reset Vektor. Im Abstand von je 4 Bytes befindet sich je ein weiterer Vektor.
Exception Vectors
Exception
Mode
Address
Reset
Supervisor
0x00000000
Undefined instruction
Undefined
0x00000004
Software interrupt (SWI)
Supervisor
0x00000008
Prefetch Abort (instruction fetch memory abort)
Abort
0x0000000C
Data Abort (data access memory abort)
Abort
0x00000010
IRQ (interrupt)
IRQ
0x00000018
FIQ (fast interrupt)
FIQ
0x0000001C
Abbildung Priorities
2.6: Eception Vektor Tabelle
Exception
Priority
Highest 1
Lowest
Exception
Reset
2
Data Abort
3
FIQ
4
IRQ
5
Prefetch Abort
6
Undefined Instruction
SWI
Abbildung 2.7: Gleichzeitig eintretende Exceptions werden Priorisiert
Wenn eine Exception eintritt, zum Beispiel ein IRQ, ist der Ablauf wie folgt:
1. Die Adresse des nachfolgenden Befehls (PC + 4) wird im Link Register abgespeichert.
2. Das CPSR (Current PSR) wird in IRQ-SPSR (Saved-PSR) abgespeichert.
3. Der Exception Interrupt Vektor (IRQ=0x00000018) wird in den PC geladen und gleichzeitig wird
die Betriebsart auf IRQ-Mode gewechselt. Die Vektoradresse enthält einen Befehl, der den Programmzähler auf die Adresse des VIC Vector Adress Registers setzt.
11
2 Architektur des ARM7 CPU Core
4. R13 und R14 werden nun mit R13_IRQ und R14_IRQ ausgewechselt.
5. Das I-Bit im CPSR wird gesetzt, was zur Folge hat, dass der ARM für weitere Interrupts blockiert
wird.
Nachdem der Exception Kode beendet ist, wird die CPU in den User-Mode zurückgesetzt und wird von
dort weiterarbeiten, wo die Exception eingetreten ist. Der ARM Befehlssatz kennt keinen „Return“ oder
„Return from Interrupt“ Befehl im eigentlichen Sinne, sondern anstelle den speziellen Subtrahierungsbefehl:
SUBS R15, R14,#4
Bei Ausführung dieses Befehls wird das Link Register in den PC geladen und die CPU in den User-Mode
zurückgeschaltet.
Da im Falle eines FIQ oder IRQ die Anweisung während des Interrupt Eintritts abgebrochen wurde,
enthält das Link Register den PC des abgebrochenen Befehls plus vier. Um nun vom richtigen Punkt
fortzufahren, muss man den PC mit dem Wert des Link Registers minus vier laden.
Im Falle eines Data Abort (z.B. Programmzugriff auf eine ungültige Speicheradresse), bekommt dies der
Prozessor erst einen Befehl nach dem falsch ausgeführten Zugriff mit. Das heisst, der Programmzähler
muss um zwei Befehle zurückgestellt werden. In diesem Fall ist der immediate Wert des SUBS Befehls
also 8:
SUBS R15, R14,#8
Nach Ausführung des Subtrahierungsbefehls wird der modifiziert Inhalt des SPSR zurück in den CPSR
geladen. Im Falle von FIQ oder IRQ wird das entsprechende I- oder F-Flag wieder gelöscht und die
Interrupts wieder eingeschaltet.
2.4 Nested Interrupts
Von Nested Interrupts spricht man, wenn ein Interrupt höhererer Priorität während der Abarbeitung einer Interruptroutine niedrigerer Priorität ausgeführt wird. Bei der ARM Architektur ist dies nur durch
manuelle Beeinflussung des Stacks und der Interrupt Register möglich.
12
2.5 Die ARM Befehlssätze
2.5 Die ARM Befehlssätze
Da unsere Programmierbeispiele alle in C geschrieben sind, gibt es keine Notwendigkeit ein Experte in
ARM Assembly Programierung zu werden. Viele der komplexen Features werden vom C-Compiler und
der Keil Entwicklungsumgebung abgenommen. Ein Verständnis des unterliegenden Maschinenkodes ist
jedoch wichtig um effiziente Programme schreiben zu können. Im wesentlichen wird hier aber nicht auf
den Assemblycode eingegangen, eher auf die Unterschiede zu herkömmlichen Prozessoren.
Microprozessorarchitekturen hatten traditioneller Weise immer mindestens die gleiche Breite für Instruktionen wie für Daten. Das heisst, bei einem 32-Bit Mikroprozessor gab es keine Instruktionen die
kürzer waren als 32-Bit. Eine grosse Datenbreite bei Instruktionen hat den Vorteil, dass ein grösserer
Adressraum effizienter adressiert werden kann als wie mit einem 16-Bit Prozessor. 16-Bit Architekturen haben normalerweise kleinere Addressbereiche und weniger Register. Deswegen konnte man auch
die Instruktionen kürzer gestalten, was die Dichte des Kodes erhöhte. Das heisst, die Programme hatten
auf kleineren Speichern Platz, aber wegen der geringeren Datenbusbreite hatten die Prozessoren auch
weniger als die Hälfte der Leistung.
Eine besonderheit beim ARM Befehlssatz ist, dass jede Anweisung bedingt ausgeführt werden kann
und nicht nur die bedingten Befehle. Die ersten 4-bits jedes Befehls geben die Bedingung an, bei der
die Zeile ausgeführt wird, sie werden auf den Inhalt des CPSR Registers abgeprüft. Falls das Ergebnis
negativ ausfällt, wird in die Pipeline an Stelle des Befehls ein NOP eingefügt. Traditionelle Prozessoren
müssen dagegen einen Branch ausführen und die gesamte Pipeline wieder neu füllen. Dabei gibt es
einen Punkt, wo es effizienter ist die gesamte Pipeline zu löschen und neu zu füllen, anstatt sehr viele
NOPs durch die Pipeline zu senden. Dieser Punkt liegt bei drei Zeilen Code. Der folgende Befehl ist mit
bedingten ARM Befehlen am effizientesten:
if (x<100)
{
x++;
}
Der unten gezeigte Befehl legt das Ergebnis der Addition in Register Rd ab. Als Operand 1 dient Register
Rn. Operand 2 kann entweder ein Immediate Wert sein, oder ein weiteres Register, dessen Wert noch mit
einem Barell Shifter geschoben werden kann.
13
2 Architektur des ARM7 CPU Core
ARM Data Processing Instruction
28 27 26 25 24
31
Cond
00
I
0000 = EQ
0001 = NE
0010 = >=
…
1110 = Immer
21 20 19
OpCode
S
16 15
Rn
12 11
Rd
0
Operand2
Destination
Register
0100 = ADD
0010 = SUB
1101 = MOV
…
Operand1
Register
Beispiel:
ADDEQ R2,R4,R5 ;If Z flag set R2:= R4 + R5
Abbildung 2.8: Bei den 32-Bit ARM Befehlen sind jeweils 4-Bits für 16 mögliche Ziel und Quellregister reserviert
Thumb Data Processing Instruction
15 14
0
1
13 12 11 10
0
0
0
0
9 8
7
Op
6
5
4 3 2 1 0
Rs
Rd
Source/Destination
Register
Source
Register 2
Beispiel:
ADC R0, R2 ; R2:= R2 + R0 + C-bit
0101 = ADC
0110 = SBC
0000 = AND
…
Abbildung 2.9: Zum Vergleich ein Thumb Befehl. Hier sind nur 3-Bits für die Register reserviert. Das heisst nur
die unteren 8 Register können direkt durch die Thumb Anweisung adressiert werden.
Bei ARM Prozessoren nutzt man die Vorteile von 16- und 32-Bit Architekturen in dem man, je nach Bedarf, einen 32-Bit Befehlssatz, genannt ARM-Befehlssatz und einen 16-Bit Befehlssatz genannt ThumbBefehlssatz benutzen kann. Der Thumb-Befehlssatz ist eine Untermenge des ARM Befehlssatzes und
bietet fast die gleichen Möglichkeiten wie der ARM-Befehlssatz. Benötigt man den vollen Befehlssatz
so kann man auf den ARM Befehlssatz umschalten.
Thumb Befehle ermöglichen so einen 16-Bit Befehlssatz auf einer 32-Bit Architektur anzuwenden und
14
2.5 Die ARM Befehlssätze
haben den Vorteil der Leistung einer 32-Bit Architektur und der Kodedichte eines 16-Bit Prozessors. Die
Befehle finden nun auf kleineren Speichern Platz, was bei portablen Applikationen, wie z.B. Mobiltelephonen wichtig ist. Thumb Kode nimmt typischerweise 65% der Grösse von ARM Kode ein, läuft aber
160% schneller als ARM code der auf einem 16-Bit breiten Speicher abgelegt wäre. Bei der Ausführung
von Thumb Kode wird dieser, für den Benutzer nicht sichtbar, in Echtzeit und ohne Leistungsverlust, zu
vollen 32-Bit ARM Befehlen dekromprimiert.
Decompressing 16-bit Thumb Code
16 bit
Thumb code
Instruction
Pipeline
Thumb
Decompressor
ARM
Instruction
Decoder
Abbildung 2.10: Echtzeitdekomprimierung eines Thumb Befehles
Man geht davon aus, dass für die meisten Befehle der Thumb Befehlssatz ausreichend ist. Braucht man
mehr Rechenleistung, so schaltet man während der Ausführung des Kodes auf den 32-Bit Befehlssatz
um. Umschalten vom ARM Befehlssatz in den Thumb Befehlssatz geschieht durch Ausführen eines speziellen Befehles (BX). Zurückschalten auf den ARM Befehlssatz geschieht beim Eintritt in Exceptions
(Interrupt, Reset, Abort Undef) Die Verfügbarkeit von 16-Bit Thumb und 32-Bit ARM Befehlssätzen gibt
Entwicklern die Möglichkeit auf der Ebene von Subroutinen je nach Anwendungsanforderungen entweder Leistung oder Kode Umfang zu betonen. So können zum Beispiel kritische Schlaufen für Interrupts
oder DSP Algorythmen mit vollem ARM Befehlssatz kodiert werden und mit Thumb Kode zusammen
gelinkt werden.
Zum Vertiefen in die ARM Architektur und den Befehlsatz wird das „ARM7 TDMI Technical Reference
Manual“ empfohlen [ARM00].
15
3 ARM Software Entwicklungsumgebung
3 ARM Software Entwicklungsumgebung
Als „debuggen“ wird das Auffinden, Diagnostizieren und Eliminieren von Fehlern in Hardware und
Heutzutage vor allem auch in Software bezeichnet. Ein Werkzeug zur Fehlerbereinigung von Software
nennt sich Debugger. Der Debugger ermöglicht in der Regel eine Ablaufverfolgung des zu untersuchenden Programmes in einzelnen Schritten oder zwischen definierten Haltepunkten. Ein Debugger ist
oft Bestandteil einer Programm-Entwicklungsumgebung (auch integrierte Entwicklungsumgebung (bzw.
IDE) genannt).
3.1 Bisherige Methode
Die althergebrachte Methode, die Software für ein Embedded System (das früher so gar nicht genannt
wurde) zu testen, waren Logikanalysatoren, die mittels Software in der Lage waren, den Kontroller der
Zielhardware zu emulieren. Dazu waren sie an den Kontroll-, Adress- und Datenbus angeschlossen und
zeichneten deren Signale auf. Die integrierte Software konnte damit nachvollziehen, was der Kontroller
auf der Zielhardware tat. Mittels eines so genannten Tracespeichers konnte damit der Programmablauf
des Kontrollers über mehrere hundert oder tausend Programmschritte nachvollzogen werden. Der Nachteil der Methode: Ein 16 Bit Kontroller mit 1MB Speicher (heute ein sehr kleines System!) und diversen
Kontrollbits für Lesen, Schreiben und andere Dinge, bringt es leicht auf über 40 Leitungen, die auf der
Leiterplatte kontaktiert werden müssen. Außerdem ist die Emulation nur in Assembler möglich. Als
nächstes haben moderne Kontroller häufig ihren Speicher integriert, wodurch keine externen Leitungen
für Kontroll-, Adress- und Datenbus zur Verfügung stehen.
3.2 In Circuit Emulation (ICE)
Abhilfe für diese Probleme schufen die In-Circuit Emulatoren. Für diese Geräte wird in der Regel vom
Hersteller des Kontrollers eine spezielle Variante gebaut, der sog. „Bond-Out Chip“. Hier werden die
(z.B.) 40 Leitungen direkt aus dem Chip herausgeführt und auf einer Verbindungsplatte (Pod) gesammelt,
die wiederum in der Regel per Flachleitung mit dem eigentlichen ICE verbunden ist. Der Bond-Out Chip
muß anstelle des normalen Kontrollers auf der Leiterplatte eingebaut werden. Der ICE ist in der Regel
in die Entwicklungssoftware für den Kontroller direkt integriert. Es bedarf nicht mehr des Umwegs über
den Logikanalysator. Debugging in Hochsprache ist damit möglich.
Normalerweise kommt der ICE beim Debugging zum Einsatz. Da er praktisch auch auf das „Innenleben“ des Kontrollers einblicken und Einfluß nehmen kann (Programcounter, Stackpointer, Statusregister und solche Dinge), ist der Programmablauf nun wunderbar kontrollierbar. Da die Zugriffe auch in
(wahrer) „Echtzeit“ möglich sind, lassen sich damit auch Probleme analysieren, die mit sog. In-System
Programmern nicht mehr erfassbar sind, da diese ihre Daten über verhältnismäßig langsame Schnittstellen bekommen. Der auch schon bei den Logikanalysatoren zum Einsatz gekommene Tracespacher ist
dabei ein ausschlaggebendes Element. Je tiefer dieser Speicher ist, je mehr er also aufzeichnen kann, desto länger zurück kann man den Programmablauf verfolgen. Dies hilft beim Debugging von komplexen
Systemen enorm. Vor allem Probleme mit Interrupts sind auf diese Art vergleichsweise leicht aufspürbar.
16
3.2 In Circuit Emulation (ICE)
3.2.1 Probleme mit ICE
Das große Problem der ICE heute ist die hohe Taktgeschwindigkeit der Kontroller und deren manchmal extrem kurze Produktlebenszeit. Für den Hersteller des Kontrollers bedeutet ein Bond-Out Chip
fast eine Neuentwicklung desselben. Damit wird er eigentlich nur dann interessant, wenn er in hohen
Stückzahlen produziert werden kann. Dies ist bei Entwicklungssystemen regelmäßig aber nicht der Fall.
So haben die Chiphersteller immer häufiger kein Interesse daran, einen Bond-Out Chip zu entwickeln.
Die hohe Taktgeschwindigkeit ist eine weitere Hürde. Bei mehreren hundert Megahertz Takt sind die
Leitungsinduktivitäten und -kapazitäten ein großes Problem, da die Signale vom Bond-Out Chip zum
ICE sehr verfälscht werden können. Damit ist der ICE nicht mehr in der Lage, den Kontroller richtig zu
interpretieren oder zu kontrollieren.
Außerdem sind ICE in der Regel recht teure Produkte, mehrere zigtausend Euro lassen sich damit locker
ausgeben (der „Rolls-Royce“ der ICE liegt im sechsstelligen Bereich!). Auch ein Bond-Out Chip ist in
der Regel nicht billig (hier sind Preise im vierstelligen Bereich nicht die Ausnahme). Und durch eine
kleine Unachtsamkeit sind diese Chips leicht zu zerstören.
3.2.2 Integrierte ICE auf ARM chip
Scan Chain
PC
USB
ULINK
JTAG
Port
JTAGcontroller
LPC2138
ARM Core
Scan Flip-Flops
Abbildung 3.1: JTAG debug interface im LPC2138
Anstelle die vielen Prozessorsignale auszubonden ist es auch möglich mit etwas zusätzlicher interner
Logik die Zustände der Signale intern in regelmässigen Zeitabständen abzuspeichern und in ein serielles Signal umzuwandeln, dass dann mit nur einer einzigen Datenleitung nach aussen gesendet werden
kann. Der externe Debugger holt sich die Informationen der Adressen, Daten, Stackpointer und Programmzähler etc. dann aus der seriellen Verbindung zum Prozessor. Zusätzlich kann der Debug Host
den Programmablauf des Prozessors anhalten, die Register oder Speicher auslesen und manipulieren und
danach den Programmablauf wieder fortfahren.
Eine Zusatzschaltung im ARM Kern genannt ICEBreaker erlaubt das setzen von zwei Breakpoints. Der
Wert in den zwei Breakpoint Registern wird vom ICEBreaker ständig mit den Adressen, Daten und
Steuersignalen des ARM verglichen. Wenn eine Übereinstimmung stattfindet, wird der Prozessor vom
17
3 ARM Software Entwicklungsumgebung
ICEBreaker angehalten. Alle Adress, Daten und Steuerleitungsbits sind maskierbar. Maskierte Bits beinflussen den Vergleicher nicht.
Der Verbindung zwischen Debugger und ARM Prozessor erfolgt über die JTAG Schnittstelle. Die JTAG
Schnittstelle übernimmt also nicht nur Testfunktionen, sondern auch wird auch als Debug Port benutzt.
Dabei dient die TDI Leitung zum seriellen Einschieben der Daten und die TDO Leitung zum Auslesen
der Daten. In der Regel muß noch ein zusätzlicher Steckplatz für ihre Schnittstelle auf der Leiterplatte
(zumindest beim Entwicklungsmuster) integriert werden.
VCC 3-3
TRST
TDO
TMS
TCK
RTK
TDI
RST
10 kΩ
VCC 3-3
1
3
5
7
9
11
13
15
17
19
2
4
6
8
10
12
14
16
18
20
Abbildung 3.2: JTAG connector am MCB2130
18
3.3 ARM ETM
3.3 ARM ETM
Da der ICEBreaker wegen des seriellen Auslesens und der dadurch verbundenene zeitlichen Verzögerung
nicht die Tiefe der Kontrolle über den Zielkontroller wie ein ICE ermöglicht, lassen sich mangels Tracespeicher komplexe zeitliche Fehler nicht ohne weiteres aufklären. Abhilfe schafft das Embedded Trace
Macro (ETM). ETM erlaubt Real Time Debugging und verfügt über Werkzeuge für intensiveres Testen
des Kodes, wie Kode Abdeckung und Leistungsanalyse. Ein Unterschied zum ICE Breaker ist, dass er
nicht via die JTAG Anschlüsse mit der Aussenwelt kommuniziert, sondern eigens dafür vorgesehene 20
Leitungen benötigt. Man hat also ein ähnliches Problem wie beim bondout der Prozessoranschlüsse. Um
dieses Problem zu umgehen werden die 20 Traceleitungen meistens mit anderen Leitungen gemultiplext.
In der Tracebetriebsart sind dann diese Leitungen für die ursprünglich vorgesehenen Funktionen nicht
verwendbar.
Part
Trace
Analyser
ETM Trace Trigger
JTAG
Interface
ARM 7
PIPESTATE 0
PIPESTATE 1
PIPESTATE 2
TRACESYNC
TRACEPKT 0
TRACEPKT 1
TRACEPKT 2
TRACEPKT 3
PC
Embedded ICE
Abbildung 3.3: Schnittstellen zum ARM-ETM
19
TRST
TDO
TMS
TCK
RTCK
TDI
RST
VCC2
VCC1
EXTTRIG
DBGACK
TRACECLK
4 ARM7 System Peripherie am Beispiel des LPC2138
4 ARM7 System Peripherie am Beispiel des LPC2138
Die physikalische Implementierung des ARM7 cores ist in unserem Anwendungsbeispiel eingebettet
in den Low Power Controller LPC2138 von Philips Semiconductors. Bisher wurde nur die Architektur
des ARM7 TDMI Cores beschrieben. Um damit ein System aufzubauen benötigt es aber noch weitere
Bausteine. Bausteine die eng mit dem ARM7 core verbunden sind, bezeichnet man als System Peripherie.
Dazu gehören Flash-Speicher, SRAM und Vectored Interrupt-Controller, Caches, interne Buse, externe
Busschnittstellen, Taktgeneratoren, Bootloader und weitere. System Peripherie kann von ARM gegen
Lizensgebühr zur Verfügung gestellt, von anderen Firmen eingekauft oder selbst entwickelt werden. Da
dies kein LPC3138 Referenzbuch ist, sind nicht alle Systemperipherals vollständig beschrieben. Mehr
darüber ist zu erfahren im UM10120 Referenz Manual [Phi05b], im LPC213x Datasheet[lpc2138] und
in „Insider’s Guide To the Philips ARM 7 Based Microcontrollers“[martin]
Folgende Core Peripherals sind im LPC2138 enthalten:
• 32kByte static RAM
• 512kByte Flash-Speicher (mehrmals programierbarer, elektrisch löschbarer nicht volatiler Speicher)
• Bootloader
• Taktgenerator mit PLL erlaubt ARM mit bis zu 60MHz zu takten
• Pin-Connect-Block erlaubt IC pins individuelle zu Konfigurieren
• AHB Bus Bridge (Schnittstelle zwischen System und I/O Peripherie)
• Vectored Interrupt-Controller unterstützt 15 Vectored Interrupts
• Neun Externe Interrupt Eingänge
20
TMS
LPC2131/2132/2134/2136/2138
TDI
TCX
XTAL2
TDO
TEST/DEBUG
INTERFACE
XTAL1
EMULATIONON
TRACE MODULE
TRST
ARM7TDMI-S
AHB BRIDGE
PLL
system
clock
RST
SYSTEM
FUNCTIONS
VECTORED
INTERRUPT
CONTROLLER
ARM7 local bus
AMBA AHB
(Advanced High-performance Bus)
INTERNAL
SRAM
CONTROLLER
INTERNAL
FLASH
CONTROLLER
8/16/32 kB
SRAM
32/64/128/
256/512 kB
FLASH
AHB
DECODER
AHB TO VPB
BRIDGE
VPB
DIVIDER
VPS (VLSI
peripheral bus)
SCL0,1
EINT3:0
8xCAP0
8xMAT
EXTERNAL
INTERRUPTS
I2C SERIAL
INTERFACES 0 AND 1
CAPTURE
COMPARE
TIMER 0 / TIMER 1
SPI AND SSP
SERIAL INTERFACES
SDA0,1
SCK0,1
MOSI0,1
MISO0,1
SSEL0,1
AD0.7:0
AD1.7:0
AOUT
P0.31:0
P1.31:16
PWM0:1
A/D CONVERTERS
0 AND 1
UART0/UART1
TXD0,1
RXD0,1
DSR1(1), CTS1(1)
RTS1(1), DTR1(1)
DCD1(1), RI1(1)
D/A CONVERTER
REAL TIME CLOCK
GENERAL
PURPOSE I/O
WATCHDOG
TIMER
PWM 0 AND 1
SYSTEM
CONTROL
Abbildung 4.1: Blockdiagramm des LPC2138
21
RTXC1
RTXC2
VBAT
4 ARM7 System Peripherie am Beispiel des LPC2138
4.1 Bus Struktur
Von Aussen „sieht“ der Programmierer des LPC2138 den adressierbaren Bereich als einen zusammenhängenden vier GByte Adressbereich. Intern zum LPC2138 ist der Adressbereich aber über verschiedene
Busse aufgeteilt.
Vectored
Interrupt
Controler
ARM 7
Local Bus
Advance High Performance Bus
Program
Code/Data
AHB/VPB
Bridge
VLSI Peripheral Bus
ON Chip
Peripherals
Abbildung 4.2: Bus Struktur im LPC2138
Der ARM7 core ist mit dem von ARM definierten Advanced High Performance Bus(AHB)verbunden.
Dies ist die schnellste Methode um sich an den ARM-core anzuschliessen. Am AHB angeschlossen ist
der Vectored Interrupt Controller und die VLSI Bus Peripheral Bridge (VPB). Da der Interrupt Controller verantwortlich für die Verwaltung aller Interrupt Quellen auf dem IC ist, muss er eine schnelle
Verbindung zum ARM core haben.
Schliesslich gibt es noch einen lokalen Bus, der das Flash- und S-RAM verbindet. Es wäre möglich auch
die On-Chip Speicher über den AHB Bus zu verbinden, jedoch hätten Kollisionen mit den Peripheriebausteinen Leistungsverluste zur Folge. Aus diesem Grund haben die Speicher einen eigenen Bus.
Die VPB ist eine Brücke zu einem langsameren Bus, der ursprünglich von der Firma VLSI, heute Philips,
entwickelt wurde. Dies hat mehrere Vorteile:
1. Die Taktrate auf dem VPB bus kann mit einem Taktteiler reduziert werden um einen langsameren
I/O Baustein zu betreiben.
2. Geringere Taktraten bedeuten auch einen geringeren Stromverbrauch.
3. Ein langsamerer VPB Baustein, entkoppelt durch die VPB Bridge, verlangsamt den AHB Bus
nicht.
22
4.2 Memory Map
4.2 Memory Map
Der Memory Map gibt an, in welchen Adressbereichen sich der Flash-Speicher, das SRAM und die
peripheren Bausteine liegen. Der LPC2138 ist mit 32kByte static RAM und 512 kByte Flash-Speicher
ausgestattet. Der Flash Speicher hat einen kleinen Cache, so dass häufig aufgerufene Seiten schneller
vom vergleichsweise langsamen Flash-Speichern abrufbar sind.
icherbereichs-Aufteilung LPC2138
4.0 GB
0xFFFF FFFF
AHB Peripherals
3.75 GB
3.5 GB
0xF000 0000
VPB Peripherals
3.0 GB
0xE000 0000
0xC000 0000
Reserved for
External Memory
2.0 GB
0x8000 0000
Boot Block
Reserved for
On-Chip Memory
On-Chip Static RAM
1.0 GB
Reserved for Special Registers
0x4000 0000
0x3FFF 8000
Reserved for
On-Chip Memory
On-Chip Non-Volatile Memory
0.0 GB
0x0000 0000
Abbildung 4.3: Speicherbereichs-Aufteilung des LPC2138
Der Flashspeicher beginnt bei Adresse 0x0000 0000 und wird abgelöst vom SRAM, beginnend bei
0x4000 0000.
Der LPC2138 wird während der Herstellung mit einem Bootloaderprogram und einem ARM Real Debug
Monitorprogram versehen, welche im Adressbereich 0x7FFF FFFF bis 0x8000 0000 untergebracht sind.
Die Region zwischen 0x8000 0000 bis 0xE000 0000 ist für externe Speicher reserviert. Eine andere
Familie der Philips LPC Kontroller, die LPC22xx Serie, kann mit 4 Chip-Selects externe Memory Blöcke
bis zu 16-Mbyte ansteuern.
23
4 ARM7 System Peripherie am Beispiel des LPC2138
Die Peripherals die an den VPB bus angeschlossen sind, befinden sich im Adressbereich zwischen
0xE000 0000 und 0xE020 0000. Jedem Peripheribaustein wird ein 16k Bereich erlaubt. Die Vektored
Interrupt Unit, welche an den AHB bus angeschlossen ist, befinded sich an der Spitze des Adressbereiches bei 0xFFFF F000.
Falls das Anwendungsprogram ausserhalb der benutzten Speicherplätze zugreift wird ein Exception Abort generiert. Der Abortmechanismus ist fest einprogrammiert und kann nicht geändert oder abgestellt
werden.
24
4.3 Der Flash Speicher
4.3 Der Flash Speicher
4.3.1 Programmieren der Special Function Register
Als erstes sollte erwähnt werden, wie die „Special Function Registers“, das sind alle Register die nicht
zum ARM7 Core gehören und von der Anwendersoftware gesetzt und rückgesetzt werden können, wie
z.B. setzen von General Purpose I/O Pins, Registerbits im I/O controller etc.
Special Function Register
Abbildung 4.4: Allgemeine Darstellung eines Special Function Registers
Jedes Special Function Register wird von drei Registern gesteuert. Einem Set Register, welches dazu
verwendet wird Bits zu setzen. Einem Clear Register, welches, wenn man eine logische Eins darauf
schreibt, das entsprechende Bit zurücksetzt und einem Status Register, welches dazu dient den Wert des
Registers auszulesen. Wenn man an dieses Registersteuerschema nicht gewohnt ist, macht man oft den
Fehler, eine logische Null in das Clear Register zu schreiben, um das Bit zurückzusetzen. Der Vorteil
dieser Art von Programmierung ist es, dass man einzelne Bits modifizieren kann, ohne den Inhalt der
anderen Registers vorher auszulesen oder in Software mitzuführen.
Manche Register erlauben es auch mehrere Bits auf einmal, durch schreiben auf das Status Register, zu
setzen.
4.3.2 Flash Speicher Pogrammierung
Der LPC2138 hat einen eingebauten Flash Speicher. Flash bedeutet, beim Ausschalten der Spannung
behält der Speicher seinen Inhalt. Der Speicher kann jederzeit elektrisch gelöscht und wieder neu programmiert werden. Dies ist noch möglich, wenn ein damit aufgebautes Gerät bereits gefertigt wurde oder
schon beim Kunden im Einsatz ist. Um die Programmierung des Flashes in der Anwendung zu ermöglichen, sind im LPC2138 einige spezielle Funktionen eingebaut. Wenn der Kunde sein Gerät einschaltet,
25
4 ARM7 System Peripherie am Beispiel des LPC2138
sollte der Kode normalerweise aus dem Flashspeicher ablaufen. Was aber, wenn der Flashspeicher noch
überhaupt nicht programmiert wurde, wie zum Beispiel unmittelbar ab der Herstellung? Der Prozessor
würde sofort abstürzen und man hätte keine Chance den Flash Speicher jemals zu programmieren. Die
Lösung dieses Problems sieht folgendermassen aus:
4.3.3 Memory Map Control
Der Speicherort der ersten 64 Bytes, angefangen bei Programm Counter Adresse 0x00000000, ist konfigurierbar. Wie im Kapitel 2.3 beschrieben, befindet sich, beginnend bei der PC Adresse 0x00000000,
die Interrupt Vektor Tabelle. Diese Interrupt Vektor Tabelle kann, je nach Einstellung des Registers
MEMMAP, in unterschiedlichen Speichern untergebracht werden. Zur Auswahl stehen: Interner FlashSpeicher, Externes Memory (falls das entsprechende LPC Model über eine Externe Schnittstelle verfügt),
interner RAM Speicher, und internes Bootloader ROM. Nach Reset ist der Memory Map Controller so
eingestellt, dass auf Adresse 0x00000000 der Inhalt des Bootloader Roms gemappt ist. Gemappt heisst,
das sich die 64 Bytes Bootloader Vektor Tabelle im normalen Betriebszustand in einem Adressbereich
unterhalb 0x80000000 befindet(so wie in Kapitel 4.2 beschrieben)aber unmittelbar nach Reset auch bei
Adresse 0x00000000 erscheint.
Der erste Eintrag in der Bootloader Vektor Tabelle ist der Reset Vektor, welcher auf den Bootloader Kode
Eintrittspunkt bei Adresse 0x7fffffff springt. Das Bootloader Programm prüft als erstes, ob der FlashSpeicher überhaupt programmiert ist. Dies erfolgt durch Ermitteln einer Checksumme, die mit einem
in der Vektortabelle dafür vorgesehenen Register verglichen wird (Vorher geschehen noch einige andere
Tests, die im Kaptitel 3.6.2 des „Insider Guides“ [Mar05] nachgelesen werden können). Wenn diese Tests
herausfinden, dass die Programmierung des Flash-Speichers gültig ist, wird der Wert im MEMMAP
Register auf Flash Mapping umgeschaltet. Das hat zur Folge, dass auf Adresse 0x00000000 jetzt der
Flashspeicher abgebildet wird, der Programzähler auf 0x00000000 zurückgesetzt wird und damit das
eigentliche Applikationsprogram starten kann.
Ermitteln ob das Flash programmiert ist
Abbildung 4.5: Testen ob die Vektortabelle im Flash gültig ist
Stellen die Tests fest, dass der Flash Speicher noch nicht programmiert worden ist, dann leitet der Boot-
26
4.3 Der Flash Speicher
loader ein Programm ein, dass den Flash Speicher über die serielle Schnittstelle (RS232) läd. Durch
einen externen IC-Pin kannn man diesen Fall auch erzwingen; z.B. für einen Softwareupgrade. Die nötige Firmware dazu ist fest im Bootloader Program installiert.
Das Programmieren des Flash Speichers mit Hilfe der Bootloader Routinen ist auch vom Anwenderprogram aus möglich z.B. für Softwareupgrades.
Möchte man das Anwendungsprogram von einem externen Speicher oder vom eingebauten RAM (macht
nur Sinn zur Programmentwicklung) starten, kann man im MEMMAP Register bestimmen in welchen
Adressbereich die Vektortabelle gemappt werden soll.
27
4 ARM7 System Peripherie am Beispiel des LPC2138
4.4 Interrupt System
Der ARM Core selbst hat ein einfaches Interrupt System mit nur zwei Eingängen Fast Interrupt Request
(FIQ) und Interrupt Request (IRQ). Die FIQ Leitung hat Priorität gegenüber der IRQ Leitung und es
sollte nur ein Interrupt an ihr angeschlossen werden, damit diese so schnell als möglich reagieren kann.
Benötigt man eine Interrupt Verwaltung von mehreren Interrupt Leitungen, so muss man ausserhalb
des ARM Cores eine zusätzliche Interruptsteuerung einsetzen. Diese bietet ARM selbstversatändlich
in ihrem Portfolio gegen Lizensgebühren an. Im LPC2138 ist eine solche Schaltung genannt Vectored
Interrupt Controller (VIC) eingebunden.
Vectored Interrupt Controller im LPC 2138
Bis zu 22 Interrupt
Quellen
FIQ
VICVectAddr 0
VICVectAddr 1
VICVectAddr 2
VICVectAddr 15
EINT3
VICIntEnable
ARM7
VICvectCntl 0..15
IRQ
VICIntSelect
Vector Address Highest Priority
Registers
Interrupt Slot
EINT2
EINT0
….
SPI0
I2C0
Lowest Priority
Interrupt Slot
Vector Address
Abbildung 4.6: Vectored Interrupt Controller
Der VIC verarbeitet alle Interrupt Quellen auf dem Chip und zusätzlich die der externen Interrupt Anschlüsse. Diese können als vectored Interrupts über die VIC mit den FIQ oder IRQ Leitungen des ARM
cores verbunden werden. Es ist programmierbar ob eine Interruptquelle einen FIQ oder IRQ auslöst.
Es gibt 15 Interrupt Slots. Mit Register VICvectCntl wird eine der 22 Interrupt Quellen einem bestimmten Slot zugewiesen. Bei gleichzeitiger Ansteuerung von mehreren Interrupt Slots hat der Slot mit der
niedrigeren Nummer die Priorität. Register VICIntSelect bestimmt, ob ein Interrupt slot einen FIQ oder
IRQ auslöst. Mehrere Interrupt Slots können jeweils einem IRQ oder FIQ Interrupt zugewiesen werden.
Damit FIQ für schnelle Interrupts reserviert bleibt, sollte man diesem aber nur einen Slot zuweisen.
4.4.1 Eintreten in die Interrupt Routine
Bei Eintreffen eines Interrupts kopiert die VIC die Vector Adresse des ausgelösten Slots in das Vector
Address Register. Dies ist die Adresse, an die die Interrupt Subroutine gelinkt wurde.
Der folgende Vorgang beschreibt, wie der Programmzähler mit der Start Adresse der Interrupt Subroutine
geladen wird:
28
4.4 Interrupt System
In der Exception Vector Tabelle (siehe unten und Abbildung 2.6, Kapitel 2.3), befindet sich als Eintrag
für den IRQ Vektor auf Adresse 0x0000 0018 der Befehl LDA PC,[PC,#-0xFF0].
Bei Eintritt des Interrupts zeigt der Programm Counter auf 0x0000 0018 + 8 (Prefetch in der Pipeline).
Durch den LDA Befehl wird der Wert 0xFF0 vom PC subtrahiert. Da 0xFF0 grösser als die Vektor
Adresse 0x0000 0018 ist, gibt es einen negativen Überlauf und die resultierende Adresse ist 0xFFFF
F030. Der LDA Befehl läd den Inhalt dieser Adresse in den PC. Da Adresse 0xFFFF F030 das Vector
Adress Register des Vectored Interrupt Controllers ist, zeigt der PC jetzt auf den Start der Interrupt
Subroutine. Somit sind die nachfolgend ausgeführten Befehle die Interrupt Subroutine.
Sprung zur Interrupt Vector Adresse
0xFFFF FFFF
LDR
Vector Address Register
0xFFFF 0030
IRQ Interrupt Vector
0x0000 0018
PC,[PC, # -0x0FF0]
0x0000 0000
Abbildung 4.7: Negativer Überlauf resultiert dass der Inhalt von 0xFFFF F030 in den PC geladen wird
Die Exceptiontabelle mit dem LDA Befehl befindet sich im Start-up-Code:
Vectors: LDR PC,Reset_Addr
LDR PC,Undef_Addr
LDR PC,SWI_Addr
LDR PC,PAbt_Addr
LDR PC,DAbt_Addr
NOP
LDR PC,[PC, #-0x0FF0] /* Vector from VicVectAddr */
LDR PC,FIQ_Addr
4.4.2 Verlassen eines Interrupts
Vor dem Verlassen einer Interrupt-Routine muss man sicherstellen, dass das Interrupt-Status-Flag, welches den Interrupt ausgelöst hat, gelöscht ist. Zusätzlich muss man einen Dummy Write (0x00000000)
auf das VICVectAddr Register ausführen, um der VIC mitzuteilen, dass das Ende der Interruptroutine
erreicht ist. Danach behandelt der VIC einen eventuell anstehenden Folgeinterrupt.
29
4 ARM7 System Peripherie am Beispiel des LPC2138
4.4.3 Beispiel Programmieren der Interrupts
Unten ist eine Ausschnitt eines Hauptprogramms indem eine externe Leitung zum LPC2138 als Interrupt Leitung programmiert wird. Bei Eintritt in die Interrupt Routine sollen LEDs auf dem Keil Board
eingeschaltet werden.
void main (void)
{
void EXTINTVectoredIRQ (void) \_\_irq; //Necessary for the Linker to calculate your
vector
IODIR1 = 0x000FF000; //Set the LED pins as outputs
PINSEL0 = 0x20000000; //Enable the EXTINT1 interrupt
VICVectCntl0 = 0x0000002F; //select a priority slot for a
// given interrupt
VICVectAddr0 = (unsigned)EXTINTVectoredIRQ; // pass the address
// of the IRQ into
// the VIC slot
VICIntEnable = 0x00008000; //enable interrupt
while(1); //wait in a loop until interrupt arrives
}
Im Folgenden wird die Interrupt Routine dazu gezeigt:
void EXTINTVectoredIRQ (void) __irq
{
IOSET1 = 0x000FF000; // Set the LED pins
EXTINT = 0x00000002; // Clear the peripheral interrupt flag
VICVectAddr = 0x00000000; // Dummy write to signal end
// of interrupt
}
4.4.4 External Interupt Registers
Mit den External Interrupt Registern kann man die Art und Weise wie die vier externen Interrupts ausgelöst werden bestimmen:
• EXTINT: Dies ist das Status Register der externen Interrupts. Auslesen zeigt an, ob ein externer Interrupt ausgelöst wurde. Beim Edge triggered Interrupt muss das Entsprechende Bit dieses
Registers vor Ende der Interrupt Routine durch Schreiben einer Eins in Register CLREXTINT
zurückgesetzt werden.
• EXTMODE: Ein Interrupt kann Edge (Flanken) Sensitiv oder Level(Pegel) Sensitiv sein. Der Edge
sensitive Interrupt wird ausgelöst, wenn sich sein Signal von Null auf Eins oder umgekehrt ändert.
Das Interrupt Flag bleibt nach einer Flanke so lange gesetzt, bis es von der Interrupt Subroutine
zurückgesetzt wird. Der Level Sensitiv Interrupt ist aktiv solange der Signalpegel Null oder Eins
ist.
• EXTPOLAR: Wurde ein Level Sensitiv Interrupt gewählt, dann bestimmt dieses Register, ob ein
Interrupt Signal aktiv ist wenn das Signal High oder Low ist. Wurde ein Edge Sensitiver Interrupt gewählt, dann bestimmt dieses Register ob es an der steigenden oder fallenden Flanke einen
Interupt auslöst.
Vorsicht: Nach dem Programmieren einer der Externen Interrupt Register muss EXTINT zurückgesetzt
werden bevor die Interupts im VIC Controller eingeschaltet werden. Ansonsten kann schon das Programmieren einen unbeabsichtigten Interrupt auslösen.
30
4.5 Externe Bus Schnittstellen
4.5 Externe Bus Schnittstellen
Für viele Systeme genügen die im Microcontroller vorhandenen SRAM oder Flash Speicher. Manchmal sind aber grössere Speicherkapazitäten notwendig. Das EBI (External Bus Interface) erlaubt externe
Speichermedien an den Prozessor anzuschliessen. Moderne EBI unterstützen synchrone DRAMs, NAND
und NOR-Flash sowie SD-Speicherkarten und verfügen über eine Fehlerkorrekturschaltung. Mit einem
EBI kann man auch auf andere Peripherie, wie zum, Beispiel einen LCD Bildschirm, zugreifen. In diesen
Fällen muss man einen Microcontroller wählen, der mit einer externe Speicherschnittstelle ausgestattet
ist. Solche Prozessoren sind meistens etwas teurer, da ein grösseres Gehäuse notwendig ist um die zusätzlichen Adress- Daten- und Steuerleitungen herauszuführen.
Der Hauptadressbereich, in dem auf externe Speicher zugegriffen kann, ist in der Memory Map des Prozessors meist fest vergeben. Dieser fest eingestellte Speicherbereich kann durch Programmierung flexibel
auf mehrere verschiedene Speicher oder Peripheriebausteine aufgeteilt werden.
Abbildung 4.8: Memory Map der Atmel AT91X40 Serie
4.5.1 Adressdekoder für die Chip Selects
An den EBI Block können mehrere Speicher oder Peripherals angeschlossen werden. Die Auswahl welcher Speicher angesprochen werden soll erfolgt mit Chip Select Signalen, die von einem programmierbaren Adressdekoder gesteuert werden. Jedem Chip Select ist meistens ein Chip Select Register zugeordnet, in dem die Basisadresse des Chip Selects sowie die Grösse des Speicherbereiches, welcher der
Chip Select abdeckt, eingestellt wird.
31
4 ARM7 System Peripherie am Beispiel des LPC2138
Chip Select Controll Register
Base Adress
(höchste Bits der
Basis Adresse)
Seitengrösse
00 = 1 M Byte
01 = 4 MByte
10 = 16 MByte
11 = 64 MByte
Chip Select
Enable
Wait States
eingeschaltet
Byte Write
Access Type
Number of
Wait States
Data Float
Output Time
Datenbusbreite
10 = 8-bit
01 = 16-bit
Abbildung 4.9: EBI Chip Select Register des AT91X40
Das Feld BA gibt die oberen Adressbits der Chip Select Basisadresse an. Das Feld Pages gibt die Speichergrösse an. 0b00=1M Byte, 0b01=4MBytes, 0b10=16MBytes, 0b11=64 MBytes. Beispiel: Hat BA
den Wert "0b‘100000000000“, und das Feld Pages den Wert 0b11 so beginnt der Speicherbereich bei
0x80000000 und endet bei 0x86ffffff
Ist der angeschlossene Speicher kleiner als der eingestellte Bereich, wird der Speicherinhalt nach überSpeicher
ist kleiner als Seitengrösse
schreiten Externer
der obersten Adresse
gespiegelt.
4.5.2 Anschliessen von externen Speichern
Neben den Chip Select Leitungen (NCS) haben EBIs meist 16 bis 32 Bit breite Datenleitungen, an denen
8, 16 oder 32 Bit breite externe Speicher angeschlossen werden können. Read (NRD) und Write (NWR)
Steuer Leitungen steuern die entsprechenden Zugriffe zu den Speichern.
Zum Ansteuern von Speichern die mehr als ein Byte breit sind, werden zusätzlich noch Bank Enable Lei-
32
4.5 Externe Bus Schnittstellen
tungen (NWR0 und NWR1) benötigt, falls man einzelne Byte Schreibzugriffe auf die Speicher erlaubt.
Diese verhindern, dass die nicht zu beschreibenden Speicherbänke davon beeinflusst werden.
Die Anzahl der Adressleitungen (Axx) bestimmt die Grösse des extern anschliessbaren Speichers. Oft
werden die höheren Adressleitungen noch mit anderen Pins gemultiplexed, um das anschliessen von sehr
grossen Speichern als Option zu erlauben.
Verbinden von 8-bit Speichern
Abbildung 4.10: Anschliessen eines 8-bit Speichers an einen 16-bit EBI (Speicher rechts)
Da der Programmzähler immer Byte-weise erhöht wird, auch wenn 16-bit oder 32-bit externer Speicher
angeschlossen ist, wird bei 16-bit Speicherzugriffen und 16-bit externem Speicher das Adressbit A0
überflüssig. Aus diesem Grund wird Adressleitung A0 des Speicherbausteins an Adressleitung A1 des
EBI angeschlossen. Bei 32-bit Externem Speicher muss die Addressleitung A0 des Speichers an A2 des
externen Speichers angeschlossen werden.
Verbinden von 16-bit Speichern
Abbildung 4.11: Bei 16-bit breiten Speichern wird A1 des Prozessors an A0 der Speicher angeschlossen
33
4 ARM7 System Peripherie am Beispiel des LPC2138
4.5.3 Buszyklen
Um Prozessor und Speicher möglichst unmittelbar zu verbinden, ist das EBI direkt am AHB angeschlossen. Der EBI wird dabei meist mit dem Prozessor Mastertakt (MCLK) betrieben.
Die folgenden Beispiele sind dem Atmel AT91X40 Datenblatt entnommen, jeder Hersteller und Modeltyp verwendet aber seine eigene Implementierung und Timing des externen Businterfaces!
Im gezeigten Beispiel wird bei der ersten Flanke des Prozessortaktes MCKI die Adresse bereitgestellt.
Eine halbe Flanke später wird dem Speicherbaustein durch aktivieren des Signals NRD (low aktiv) mitgeteilt, dass er seine Daten auf den EBI Bus legen darf. Schon eine weitere 1/2 Taktflanke später liest
der Prozessor die Daten ein. Das heisst, bei einem Prozessortakt von 60 MHz, hat der Speicherbaustein
weniger als 1/2 Taktperiode (< 8 ns) Zeit um die Daten bereitzustellen. Die schnellsten CMOS Speicher
haben aber Zugriffszeiten von mindestens 20 ns. Aus diesem Grund ist es nötig, Wait States in den Speicherzugriff einzufügen. Wait States können für jeden Chip Select individuell eingestellt werden. Manche
EBIs unterscheiden sogar zwischen separaten Wait States für Read und Write Zyklen.
Keine Wait States
Prozessor gibt
Adressen aus
Prozessor speichert
Daten
MCKI
ADDR
NCS
NRD
ODER
NWE
NWE = Low aktives Write Enable
Abbildung 4.12: EBI Zugriff beim AT91X40 ohne Wait States
34
Ein Wait State
4.5 Externe Bus Schnittstellen
Prozessor gibt
Adressen aus
Prozessor speichert
Daten
MCKI
ADDR
NCS
NRD
ODER
NWE
1 Zyklus
Wait State
Abbildung 4.13: EBI Zugriff mit einem Wait State
4.5.3.1 Externe Wait
Manche Peripherals sind nicht zu jeder Zeit zugreifbar, zum Beispiel wenn der Speicher von mehreren
Prozessoren geteilt wird und ein ein anderer Prozessor gerade auf den Speicher zugreift. In diesem Fall
dient ein externes Wait Signal (NWAIT) dazu dem Prozessor mitzuteilen, das der begonnene Speicherzyklus noch nicht beendet werden kann.
Externer Wait
Prozessor fügt
Wait ein wenn
NWAIT = 0
Prozessor speichert
Daten
MCKI
ADDR
WAIT
NCS
NRD
ODER
NWE
1 Zyklus
Wait State
Abbildung 4.14: Einfügen von Externer Bus Wait Zyklen
35
4 ARM7 System Peripherie am Beispiel des LPC2138
4.5.3.2 Early Read
Wie wir aus Abbildung 4.12 sehen, wird normalerweise das NRD Signal erst eine halben Takt nach
dem Schreibezugriff aktiviert. Es gibt Speicher, bei denen es von Vorteil sein könnte, wenn man das
NRD Signal schon gleichzeitig mit den Adressen aktiviert. Für solche Fälle kann man einen Early Read
Protokoll wählen. Dieses spart bei Lesezugriffen fasst eine Halbe Taktperiode. Damit der Prozessor nach
einem Schreibezyklus Zeit hat den Bus hochohmig zu schalten, wird vor dem Read Zyklus ein Wait State
eingefügt, falls dieser einem Schreibezyklus folgt.
Early Read Protokoll
Speicher gibt
Daten aus
Prozessor speichert
Daten
MCKI
ADDR
NCS
NRD
ODER
NWE
Abbildung 4.15: Early Read Zyklus
4.5.3.3 Bus Relax Zeiten
Da Datenübertragungen auf dem EBI Bus bidirektional erfolgen, muss der Speicher zwischen Read und
Write umschalten. Beim Write treibt der Prozessor, bei Read treibt der Speicher den Bus. Da manche
Speicher den Bus noch lange nach einem Lesezyklus treiben, muss der Prozessor zwischen Read und
Write Zyklen eine kleine Zugriffspause einlegen. Diese Zyklen nennen sich „Data Float Zyklen“ und
werden ebenfalls meist im Chip Select Register programmiert. Im gezeigten EBI Beispiel heisst das
Bitfeld, welches bestimmt wie viele zusätzliche Takte eingefügt werden, TDF.
36
5 Anwender Peripherie des LPC2138
Ebenfalls im LPC2138 enthalten sind externen Schnittstellen wie die serielle Schnittstelle zu einem Terminal oder Computer, die Schnittstellen zu anderen ICs im Gerät wie I2C und SPI, sowie Timer zum
Erzeugen von Zeitkonstanten, Analog Digitalkonverter und eine Uhr.
Folgende Peripheriebausteine sind enthalten:
• Echtzeituhr mit geringem Stromverbrauch
• Zwei AD Konverter
• Ein DA Konverter
• Zwei 32-Bit Timer
• Zwei UARTS (für RS232 Schnittstelle)
• Zwei Fast-I2C Schnittstellen (400kHz)
• Serial Peripheral Interface (SPI)
Ffigure
5.1 Setzen und Rücksetzen von lpc2138 Registern
Die Steuerung der Controllbits im LPC2138 ist etwas ungewöhnlich. Jedes Register wird über drei Steuerregistern bedient. Mit dem Status Register kann der Inhalt des Registers ausgelesen werden. Mit einem
„Set“ Register können durch Schreiben einer 1 individuelle Bits gesetzt werden. Konträr dazu gibt es
„Clear“ Register, mit dem, durch Schreiben einer 1, die entsprechenden Bits wieder gelöscht werden
können. Diese Anordnung hat den Vorteil, dass Bits, die „in Ruhe“ gelassen werden sollen, nicht programmiert werden müssen. Normalerweise löst man diese Probleme durch Auslesen und ver-odern des
bestehenden Wertes mit den gewünschten Bits bevor man den neue gebildeten Wert in das Register abspeichert. Dies benötigt also mindestens drei Prozessorzyklen, die man sich beim LPC2138 sparen kann.
Der häufigste Fehler den LPC2138 Neulinge machen ist, eine 0 in das „Clear“ register zu schreiben, was
keine Auswirkungen auf das Bit hat.
Der Nachteil dieses Verfahrens ist, dass wenn mehrere Bits gleichzeitig von ’0’ auf ’1’ und von ’1’ auf
’0’ wechseln müssen, dies nicht in einem Schreibzyklus geschehen kann. In diesm Fall ist es bei manchen
Registern zusätzlich möglich das Status Register mit dem gewünschten Wert zu beschreiben, was dann
alle Bits auf einmal ändert.
37
5 Anwender Peripherie des LPC2138
5.2 General Purpose I/O
Nach Reset konfiguriert der Pin Connection Block alle Pins als General Purpose I/O (GPIO) Das GPIO
wird von 5 Registern gesteuert.
• Das IODIR Register steuert ob ein Pin entweder Eingang oder Ausgang ist.
• Falls der Pin als Ausgang konfiguriert ist, kann durch schreiben auf das IOSET Register der jeweilige Pin auf ’1’ gesetzt werden. Achtung: Beschreiben des IOSET mit ’0’ löscht das Register nicht
(siehe auch Kapitel 5.1).
• Schreiben einer ’1’ in das IOCLR Register löscht das jeweilige Register.
• Lesen des IOPIN Registers zeigt den Status am jeweiligen I/O Pin an. Unabhängig davon ob der
Pin als Eingang oder Ausgang programmiert wurde.
• Das fünftePurpose
Register ist das in Kapitel
5.3 beschriebene PINSEL Register.
General
I/O
GPIO PIN
I0 PIN
GPIO PIN
I0 SET
1 1 0 0
I0 CLR
I0 DIR
Abbildung 5.1: General Purpose I/O Steuerung
38
SFR
5.3 Pin Connect Block
5.3 Pin Connect Block
Alle I/O Pins des LPC2138 sind über einen Multiplexer, genannt Pin Connect Block, mit einer Anzahl
interner Funktionen verbunden. Der Pin Select Block erlaubt dem Benutzer einen Pin als General Purpose
I/O (GPIO) zu benutzen oder bis zu drei andere Funktionen zu wählen. Bei Reset sind alle I/O Pins als
GPIO Konfiguriert, die weiteren Funktionen werden über die 3 PINSEL Register, PINSEL0, PINSEL1
und PINSEL2, ausgewählt. Beispiel: Um den externen Interrupt EINT1 zu benutzen, muss das PINSEL
Register des entsprechenden Pins von der GPIO Funktion auf EINT1 gesetzt werden.
GPIO Port0.5
MISO (SPI0)
Match0.1 (Timer 0)
AD0.7
00
01
P0.5
10
11
Bit 11 u. 10 von
PINSEL0 Register
Abbildung 5.2: Pin Connect Block
39
LPC Ausgangspad
5 Anwender Peripherie des LPC2138
5.4 General Purpose Timer
The LPC2138 hat zwei General Purpose Timer welche in der Struktur identisch sind. Der Kern jedes
Timers bildet ein 32-Bit Timer Counter (T0TC und T1TC), der Zähler wird mit dem internen Prozessortakt(PCLK) über einen Taktteiler (Prescaler) angesteuert, welcher die eigentliche Zählerfrequenz erzeugt. Der Prescaler besteht aus dem Prescaler Counter Register (T0PC und T1PC)welche mit jedem
PCLK erhöht wird, ist der Wert im T0PR respektive T1PR Register erreicht, wird TxPC zurückgesetzt
und beginnt von neuem. Mit dem Timer Control Register(T0TCR und T1TCR) wird der Zähler eingeschaltet und kann zurückgesetzt werden.
Prescaler im Timer
Prescaler Reg
PCLK
Prescaler
Reset
Timer Counter
Enable
Timer Control
Abbildung 5.3: Timer Counter und Prescaler
Pro Zähler gibt es vier 32-Bit Match Register (TxMR0 bis TxMR3) diese werden mit dem Timer Counter
verglichen. Wird Gleichheit festgestellt, wird ein Ereigniss ausgelöst, dass dazu benutzt werden kann
entweder den Zähler zu stoppen, zurückzusetzen, einen Interrupt oder einen externen Pin anzuregen.
Meistens benutzt man den Timer dazu, längere Zeitkonstanten zu erzeugen, die das laufenden Programm
über einen Interrupt unterbrechen.
40
Match Register im Timer
5.4 General Purpose Timer
Timer Counter
Reset Tc
Stop Tc
=
External Match Register
Interrupt
Match Register
Abbildung 5.4: Timer Match Register
Eine andere mögliche Anwendung des Timers ist, diesen als genaue Stoppuhr zu benutzen. Eine Pegeländerung der externen Capture Pins (CAP) wird dazu benutzt, den momentanen TC Zählerwert in eines
von vier Capture Registern (TxCR0 - TxCR3) abzuspeichern. Das Capture Control Register (T0CCR und
T1CCR) steuert ob eine steigende, fallende oder beide Flanken den Capture Vorgang auslösen; zusätzlich
kann dabei auch noch ein Interrupt erzeugt werden.
41
5 Anwender Peripherie des LPC2138
5.5 I2CInterface
Das I2C interface wurde von Philips erfunden, der Hintergedanke war ein einfacher serieller Bus, mit
dem die ICs innerhalb von HiFi und Fernsehgeräten miteinander verbunden werden können. Zum Beispiel der Mikrokontroller mit dem Lautstärkeregler oder dem Radiotuner etc. Heutzutage findet man
diesen Bus auch in Mobiltelephonen um z.B. den Spannungsregler der Stromversorgung zu steuern oder
er ist sogar in LEDs eingebaut um den Farbwechsel zu steuern. Der I2C Bus ist als Multimasterbus mit
bis zu 400K-Bits pro Sekunde ausgelegt, die Arbitrierung erfolgt automatisch. In Abbildung 5.5 ist ein
typisches I2C System gezeigt, in dem ein LPC2138 mit zwei Port Expander Bausteinen zusammenarbeitet. Die beiden I2C Leitungen SCL und SDA müssen mit Pull-Up Widerständen bestückt werden. Die
Treiber der I2C Bus Peripherals bestehen aus Open-Drain oder Open-Collector Transistoren. Der I2C
funktioniert nach dem Prinzip des wired-AND.
Wie alle anderen Peripheriebausteine des LPC2138, muss der Pin Connect Block so konfiguriert werden,
dass die Serial-Clock (SCL) und Serial-Data (SDA) Leitungen nach aussen geführt werden.
I2C Schnittstelle
Abbildung 5.5: Typische I2C bus configuration
42
5.5 I2CInterface
5.5.1 Beispiel eines I2C Bus transfers
I2C Master sendet Daten an Empfänger
Bei der I2C Kommunikation muss zunächst einmal der Master und der Slave ermittelt werden. In diesem
Beispiel ist der LPC2138 der Bus Master und der Peripheriebaustein der Slave.
Abbildung 5.6: I2C Bus Protokoll
1. Durch Setzen des I2C-Enable und Löschen des Acknowledge Bits im I2C Control Registers wird
der I2C Bus als Bus Master an den Bus angeschaltet.
2. Der Bus Master muss zunächst eine Start-Condition auf dem Bus signalisieren. Dies geschieht, in
dem die SDA Leitung auf Low gezogen wird, während die SCL Leitung auf High bleibt (siehe Abb.
5.7). Die Spezifikation schreibt vor, dass sich das SDA Signal während einer Datenübertragung
nie ändert solange SCL high ist. So können die Busteilnehmer Start und Stop Bedingungen von
Datenübertragungen unterscheiden.
3. Als nächstes wird die 7-Bit Adresse an den Bus gelegt, gefolgt von einem Bit, dass die gewünschte
Datenrichtung, Read oder Write, signalisiert. Jedes I2C Peripheral hat seine eigene 7-Bit Adresse.
4. Wenn der Bus-Slave diese Präambel aus Start Bits Adressen und Daten korrekt empfangen hat,
antwortet er mit einer Bestätigungsmeldung. Das Acknowledge Bit wird vom Slave jeweils im
neunten Bit einer Datenübertragung übertragen. Der Sender schaltet den Open-Collector Tranistor
aus, während der Empfänger ein Acknowledge mit einem Low, ein Not-Acknowledge mit einem
High signalisiert.
5. Von jetzt ab können die Daten als Serie von Daten-Bytes und Acknowledges übertragen werden.
6. Sind alle gewünschten Daten übertragen, sendet der Master nach dem letzten Byte die StopCondition auf den Bus. Diese besteht aus einer Änderung des SDA signals von low nach high,
während das SCL Signal high bleibt (siehe Abb. 5.7).
Für eine Detailierte Beschreibung des I2C Bus Protokolls wird die I2C Bus Spezifikation empfohlen
[Phi00].
43
5 Anwender Peripherie des LPC2138
Stop
Meldung
Start
Meldung
Repeated Start
Meldung
Abbildung 5.7: I2C Bus Timing, Unterscheidung von Start und Stop Conditions
44
Stop
Meldung
5.5 I2CInterface
5.5.2 Register im I2C Baustein
Register des I2C Blocks
Der I2C Peripheriebaustein hat 7 Register .
I2CONSET
Adressen/Daten
I2 STAT
I2 DAT
ARM
CORE
SCL
I2 ADR
Interrupts
SDA
I2 SCLH
I2 SCLL
I2CONCLR
Abbildung 5.8: I2C Control und Status Register
Das Steuerregister I2CONSET, I2CONCLR besteht aus 2 getrennten Registern eines zum Setzen und
eines zum Rücksetzen der Steuerbits.
31
0
12CONSET
12Cenable Start Stop Interrupt
31
acknowledge
0
12CONCLR
Abbildung 5.9: I2C Steuerregister
Aufgelistet ist die Bedeutung der Bits:
• AA: Assert Acknowledge, wen auf eins, wird auf empfangene Daten ein Acknowledge zurückgegeben.
45
5 Anwender Peripherie des LPC2138
• SI: I2C interrupt. Wenn gesetzt, hat sich der Zustand des IIC Buses geändert. So lange es gesetzt
ist, bleibt SCL low und es werden keine weiteren SCL Pulse mehr gesendet. So lange bis die I2C
interrupt routine zurücksetzt. Danch können weiter I2C transaktionen durchgeführt werden.
• STO: Wenn dieses Bit gesetzt wird, überträgt der Bus Master eine Stop condition.
• STA: Wenn gesetzt, wird der Bus in Master Mode gebracht und eine Start Bedingung gesendet.
Die Bit-Rate wird ebenfalls von 2 Registern (I2CSCLH, I2CSCLL) bestimmt.
Das Status Register (I2CSTAT) gibt Steuercodes zurück, die die unterschiedlichen Busgeschehnisse
wiederspiegeln (siehe Beschreibung in 5.5.3)
Im I2CDAT werden die zu sendenden Daten geschrieben oder die empfangenen Daten ausgelesen.
Im I2CADR wird die Netzwerk-Adressen des I2C Blocks, wenn im Slave Mode, eingetragen.
5.5.3 I2C Interrupts und Status Register
Der I2C-Bus ist sehr stark Interrupt getrieben. Nach jeder Transaktion (Start Bit gesendet, Acknowledge
Bit empfangen, Slave Adresse wurde gesendet etc.) stoppt der I2C-Master-Baustein den SCL Takt und
sendet einen Interrupt zum steuernden Mikrokontroller. Der Mikrokontroller liest das Statsusregister aus
(I2CSTAT) und entscheidet die nächste sinnvolle Transaktion. Abbildung 5.10 beschreibt die Inhalte der
I2C Status-Codes und die möglichen weiteren Schritte. Genauere Informationen liefert das „LPC21213x
User Manual“ [Phi05b] Sektion 11.8
I2CSTAT
Status Code
Ursache des Interrupts
Aktionen des Masters beim
Eintritt in diese Interrupt
Routine
0x08
Das Start bit wurde auf den
Bus gegeben
Die Slave Adresse kann gesendet
werden
0x18
Slave Adresse + W wurde
übertragen und ACK wurde
empfangen
Ein Daten Byte kann jetzt übertragen
werden.
Slave Adresse + R wurde
übertragen und ACK wurde
empfangen
Ein Daten Byte kann jetzt empfangen
werden.
Daten wurden zum Slave
gesendet und ACK wurde
empfangen
Ein weiteres Daten Byte kann jetzt
übertragen werden.
Data Byte wurde empfangen
Das I2C Datenregister kann jetzt
ausgelesen werden
0x40
0x28
0x50
Wurden bereits alle Daten
übertragen, kann an dieser Stelle
das Stop bit auf den Bus gegeben
werden
Abbildung 5.10: Bedeutungen der wichtigsten I2C Status Register Kodes
46
5.5 I2CInterface
5.5.4 Beispiel: Ansteuern des Radio IC TEA5764HN mit I2C
5.5.4.1 TEA5764 Register Ketten
Abbildung 5.11 zeigt wie die Lese (0R,1R..) Und Schreibe-Register (0W, 1W..) für das I2C sichtbar
sind. Beim Lesen oder Schreiben gibt das I2C Register zuerst die Adresse auf den Bus. Diese Adresse
entspricht der im TEA5764 fest einprogramierten Adresse für die FM Register: 0b0010 000. Danach
liest oder schreibt das I2C alle Register der Reihenfolge nach ein oder aus. Man sieht, dass das Register
INTFLAG nur lesbar aber nicht schreibbar ist und deshalb in der Kette der schreibbaren Register nicht
erscheint. Aus diesem Grund ist die Register Position in den Schreib und Leseketten unterschiedlich.
Mehr über die Register des TEA5764 findet man im TEA5764 Datasheet [Phi05a].
Register Kette im TEA Radiochip
I2C
Adresse
…
0010 000 0R
1R
2R
3R
4R
0010 000
0W
1W
2W
3W
9R
4W …
10R
11R
5W
6W
12R
TNCNTRL1
FRQSETLSB
FRQSETMSB
INTMSK
TESTMODE
TESTBITS
INTFLAG
Abbildung 5.11: Schreibe und Leseregisterketten im TEA5764 Radiochip
5.5.4.2 Beispiel C-Code zum Ein/Aus-lesen der TEA5764 Registerketten
Zum Lesen und Schreiben des I2C steht je eine vorgefertigte Routine zur Verfügung. Den Routinen muss
jeweils ein Array Pointer zu einem Lese bzw. Schreibebuffer, die I2C Netzwerkadresse und die Länge
des Arrays in Byte übergeben werden. Befindet sich das Ziel Register vor dem Ende des Kette so kann
die Arraylänge verkürzt werden und man spart so Aus/Ein-lese Zeit.
47
Daten Array zum senden an I2C
5 Anwender Peripherie des LPC2138
char iicarray[n]={0xaa,0xbb,0xcc,…,0xn}
writeI2CData(&iicarray[0],i2cadresse,länge)
Länge des Arrays
Pointer
zum ersten
Eintrag im Array
Daten Array zum lesen von I2C
Adresse der
Register-Kette
0b0010 000 = FM
0b0010 001 = RDS
Abbildung 5.12: Schreiberoutine zu einem Peripheral am I2C Bus
char iicarray[n]={0xaa,0xbb,0xcc,…,0xn}
readI2CData(&readiic[0],i2cadresse,länge)
Länge des Arrays
Pointer
zum ersten
Eintrag im Array
Adresse der
Register-Kette
0b0010 000 = FM
0b0010 001 = RDS
Abbildung 5.13: Leseroutine zu einem Peripheral am I2C Bus
C-Kode Beispiel zum Auslesen einer I2C Registerkette
status=I2CInit(); //Initialisiert den I2C Baustein im LPC2138
char temp[28]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//definiert ein 27 Byte Array und initialisiert es mit Null
readI2CData(&temp[0],0x20,28); //Liest alle 28 lesbaren Register und
//schreibt die Werte in Array temp
C-Kode Beispiel zum Beschreiben einer I2C Registerkette. Ein Array von 7 Bytes wird mit Werten
initialisiert, der I2C Write Routine wird der Pointer auf das Array übergeben und die 7 Bytes werden auf
I2C Adresse 0b0010 000 geschrieben.
char fmInitString[7]={0x00,0x00,0x00,0xc9,0x52,0x00,0x00};
writeI2CData(&fmInitString[0],0x20,7);
48
5.6 SPI Interface
5.6 SPI Interface
Der SPI Bus ist wie der I2C Bus eine serielle Datenverbindung zwischen Peripheriebaustein und Mikrokontroller. Anders als beim I2C gibt es keinen Adressierungsmechanismus in der Datenübertragung. SPI
hat ausserdem keine Intelligenz den Bus zu verwalten. Die Anwendersoftware muss das SPI initialisieren
und die Datenübertragung selbst verwalten.
Das SPI Interface besteht aus vier Externen Pins:
• SCK: Ein vom Master erzeugtes serielles Taktsignal, welches als Taktquelle für eine Datenrate
von bis zu 400kbits/sec dient
• SSEL: Da SPI keine Adressierung hat, muss das low aktive Slave Select aktiviert werden um den
Slave anzusprechen. Beim LPC2138 wird dies von einem GPIO Pin erledigt
SPI (Serial Peripheral Interface) zwischen ARM
MOSI: Datenübertragungssignal vom Master zum Slave
und• LCD-Display
• MISO: Datenübertragungssignal vom Slave zum Master
ARM
P0.4
SCLK
P0.5
MISO
P0.6
MOSI
P0.12
SSEL
SPI Master
Character
Display
SPI Slave
Abbildung 5.14: Signale der SPI Schnittstelle
Das Timing und Protokoll des SPI-Bus ist nicht strikt standardisiert, es gibt sehr viele Varianten davon.
Aus diesem Grund müssen bei der Initialisierung des SPI-Controllers Details wie Polarität des Taktsignales und Taktphase eingestellt werden. Auch die Ordnung der übertragenen Bits ist nicht bei jedem
SPI Protokoll gleich. Im Control Register muss deshalb eingestellt werden, ob MSB oder LSB zuerst
übertragen werden soll.
49
5 Anwender Peripherie des LPC2138
5.6.1 Beispiel Ansteuern des LCD displays mit SPI
Die folgende Beschreibung widmet sich kurz dem SPI Protokoll zur Ansteuerung des LCD Displays auf
der Radioplatine, welches kompatibel zum Samsung KS0073 LCD Controller ist. Die LCD-Controller
spezifische Ansteuerung wird von einer zur Verfügung gestellten Subroutine übernommen, so dass der
Benutzer der Subroutine nur die Zeilenzahl und den Anfang eines ASCII-Datenarrays übergeben muss.
Abbildung 5.15: Protokoll der SPI Schnittstelle
Abbildung 5.15 zeigt das Zeitverlaufsdiagram der SPI Signale spezifisch für den Samsung KS0073 LCD
Controller, wie er im LCD display des Radioboards verwendet wird.
5.6.2 Senden des Start-Bytes
Bevor Daten zum LCD übertragen werden können, muss erst der Synchronisations-String bestehend aus
5 aufeinanderfolgenden Einsen übertragen werden. Danach wird die Datenübertragungsrichtung festgelegt. Dies geschieht mit Bit R/W. Wenn R/W=0, bedeutet dies, dass die Datenübertragung vom Mikrocontroller zum LCD gerichtet ist. Bit RS gibt an ob die nachfolgenden Daten für das Befehlsregister
bestimmt sind oder ob es sich um ASCII Daten zum Anzeigen handelt. Das Ende des Start-Byte signalisiert eine Null. Danach können die Daten gesendet werden.
Nach dem Senden eines Start-Bytes muss der Microcontroller vor dem Senden weiterer Daten warten,
bis das Buffer Empty Flag (SPIF-Bit) im SPI Controller gesetzt ist und damit signalisiert, dass weitere
Daten in den SPI Controller Buffer geschoben werden dürfen.
5.6.3 Senden von Daten oder Befehlen
Es ist nicht möglich dem KS0073 ein ganzes Datenbyte auf einmal zu senden. Das Datenbyte muss in
zwei 4-Bit Stücke aufgeteilt werden, welche dann aber als Byte mit den 4-LSB mit null aufgefüllt gesendet werden. Beispiel: Aus einem Byte „10110001“ werden zwei Bytes „10110000“ und „00010000“.
Um mehrere Bytes zu senden, ist nur vor dem ersten Datenbyte ein Start-Byte nötig. Danach können alle
Datenbytes aufeinanderfolgend übertragen werden.
5.6.4 KS0073 Befehle und Daten
Programmieren des KS0073 erfolgt mit Befehlen und Daten. Befehle setzen Bits in den Steuerregister
des LCD-Controllers. Daten, in ASCII codiert, werden direkt auf dem Display angezeigt. Damit der Con-
50
5.6 SPI Interface
troller Daten von Befehlen unterscheiden kann, muss man im Start-Byte das RS-Bit setzen. Befehle und
Register zum Programmieren des LCD-Kontrollers werden im KS0073 Datenblatt erklärt [Sam05]. Auch
das LCD-Modul Datenblatt gibt einige wichtige Informationen zum Programmieren des LCD Displays
[Ele05].
5.6.5 Subroutine zum Senden von ASCII Daten auf das LCD Display
Nachdem der SPI-controller und das Display initialisiert wurde, benutzt man die sprintf Routine um bis
zu 20 Zeichen je Displayzeile anzuzeigen. Subroutine sendLine2Display(zeilenzahle,tempstring) erledigt
das Aussenden auf das Display.
char tempstring[21];
status=SPIInit(); //Initialisiere SPI
spiDelay(500000); //Warte bis SPI die Daten verarbeitet hat
status=displayInit(); //Initialisiere LCD-controller
displayOn(1);
//Schalte Display ein
clearDisplay(); //Lösche Display
sprintf(tempstring,"’Hallo Welt"’); //Schiebe "’Hallo Welt"’ in tempstring
sendLine2Display(4,tempstring); //Zeige "‘Hallo Welt"’ auf Zeile 4 an
spiDelay(1000000);//Warte bis SPI die Daten verarbeitet hat
51
6 Übung 1
6 Übung 1
6.0.6 Aufsetzen der Entwicklungsumgebung
6.0.6.1 Projekt einrichten und Default Startup Datei kopieren
1. Legen Sie sich lokal auf dem PC (z.B. d:esi/projekt) ein Projektverzeichnis an (z.B. esiueb1.
2. Starten Sie das Programm Keil uVision4. Bestätigen Sie die Meldung Can not open Project file
mit OK.
3. Starten Sie ein neues Projekt unter Project -> New uVision Project..., legen Sie das Projekt auf
das unter 1. angelegten Projektverzeichnis und geben Sie dem Projekt einen Namen (z.B. esiueb1)
4. Im nächsten Schritt werden Sie gefragt den Prozessor zu wählen: Wählen Sie den NXP -> LPC2138.
Beantworten Sie die Frage, ob der LPC2100 Startup Code kopiert werden soll mit Ja.
6.0.6.2 Dateistruktur aufbauen und Quelldateien kopieren
1. Kopieren Sie das source Verzeichnis von meiner ESI Web-Seite unter Übung1 in Ihr Projektverzeichnis.
2. Legen Sie im Projektverzeichnis zwei neue Unterverzeichnisse obj und lst an. Dort sollen später
die vom Compiler generierten Objektcodes und Listings abgelegt werden. Dies macht das Projektverzeichnis übersichtlicher. Ihr PC Projektverzeichnis sollte jetzt so aussehen:
Abbildung 6.1: Projaketdateien am PC
3. Als nächstes richten Sie die Verknüpfungen der Dateien im uVision4 Projekt ein. Nennen Sie
den Top Level im uVision4 Projektfenster (links oben) von Target1 in einen sinnvolleren Namen
um (z.B. esiueb1). Umbenennen können Sie, in dem Sie den Namen mit der linken Maustaste
selektieren und dann den neuen Namen eingeben.
4. Expandieren Sie Ihr neu benanntes Projekt und die darunter liegende Source Group 1. Wie Sie
52
sehen, wurde der startup.s Code bereits mit dem Projekt gelinkt. Jetzt soll noch der C-Source
Code zu Ihrem Projekt hinzugefügt werden. Dazu selektieren Sie im Projektfenster mit der rechten
Maustaste das Verzeichnis Source Group1 und wählen Sie Add files to Group source. Addieren Sie
alle C-Dateien aus Ihrem aus der Web-Seite kopierten Verzeichnis source.
Danach sollten die gelinkten Dateien im uVision4 Projekt wie folgt dargestellt werden:
Abbildung 6.2: uVision4 Projekt nach linken der Source Dateien
6.0.6.3 Optionen einstellen
Die folgenden Einstellungen machen Sie im uVision4 unter: Project -> Options for Target... oder Alt+F7
1. Im Reiter Listing wählen Sie unter Select Folder for Listings..., wo die Listings abgespeichert
werden sollen. Wählen Sie dafür das vorher angelegte Unterverzeichnis lst.
2. Im Reiter Output wählen Sie unter Select Folder for Objects..., wo die Objects abgespeichert werden sollen. Wählen Sie dafür das vorher angelegte Unterverzeichnis obj.
Stellen Sie sicher, dass Create Executeable ausgewählt ist.
3. Im Reiter Linker wählen Sie: Use: Memory Layout from Target Dialog
4. Im Reiter Debug wählen Sie: Use: ULINK ARM Debugger
5. Im Reiter Utilities wählen Sie: Use Target Driver for Flash Debugging-ULINK ARM Debugger
6. Im Reiter Utilities unter Settings prüfen Sie ob der Flash Programming Algorythm für den LPC2000
IAP2 512kB Flash konfiguriert ist. Falls das Programming Algorythm Feld noch leer ist, addieren
Sie den Flash Algorythm mit dem Knopf Add.
7. Im Reiter Utilities unter Settings setzen Sie den Hacken bei Reset and Run.
8. Schliessen Sie den Dialog Options for Target mit OK ab.
9. Kompilieren Sie das Projekt mit Project -> Build Target oder F7. Sie sollten 0 Errors und 2
Warnings erhalten. Weiterhin sollt der Kompiler die Werte für Program Size angeben, welche sich
im Bereich von 3.8 kB bewegen.
10. Schliessen Sie das Radioboard mit dem ULINK2 an die USB Schnittstelle Ihres PC an. Falls
Sie die weissen ULINK2 Kästchen haben, müssen Sie das Radioboard noch zusätzlich über den
USB Stecker mit Strom versorgen. Bei der ULINK Version mit der offenen Platine entfällt die
Stromversorgung über das USB Kabel.
11. Laden Sie das Programm auf ein Target Board mit Flash -> Download. Das Programm sollte sofort
53
6 Übung 1
starten
und auf
dem LCD Display sollte Hello World What’s up zu lesen sein.
Target
Hardware
MCB2130
Radioplatine
SCL
JTAG
ARM
LPC2134
GPIO 0.15
MOSI
MISO
EINT0
EINT2
IOPIN0.13
Radio
TEA5764
SDA
INTx
P0.15
P0.12
P0.6
P0.5
CS
SID
SOD
LCD display
P0.7
P0.1
ENA
Drehgeber
P0.13
ENB
P1.16, P1,17, P1.18
Tastatur
P1.19, P1,23
Abbildung 6.3: Blockdiagramm der Ziel-Hardware
54
6.0.7 Starten des Debuggers
Verbinden Sie U-Link und Radioboard so wie in Übung 1 beschrieben.
1. Starten Sie uVision, laden sie mit Flash -> Download das Beispielprogramm.
2. Starten sie die Debug Session: Debug -> Start/Stop Debug Session.
3. Lassen Sie das Programm mit Debug -> run laufen. Auf dem Display sollte „Hello World“ erscheinen und es ist eine feste Radiofrequenz eingestellt. Im Kopfhörer können sie aber noch nichts
hören, da der Verstärker noch stumm geschaltet ist.
4. Der Kopfhörer ist stumm geschaltet, wenn das Signal auf GPIO 0.15 low ist. Ändern Sie main.c so,
dass GPIO 0.15, als Ausgang (IODIR0 Register) initialisiert wird und setzen Sie diesen Ausgang
in den Zustand logisch ’1’ (IOSET0 Register). Danach sollten sie eine Station empfangen können.
Achten Sie auf die Stelle im C-code, wo Sie den GPIO programmieren, wenn Sie Ihn zu früh
programmieren, wird er möglicherweise von einer der Subroutinen wieder überschrieben.
6.0.8 Anzeigen eines Zählers auf dem Display
1. Schreiben sie das Programm main.c so um, dass auf dem Display ein Zählwert angezeigt wird, der
sich, jedesmal wenn das Testprogram erneut durch die Hauptschleife läuft, um eins erhöht.
2. Auf dem Display soll stehen: Zählerwert: [Nummer] Runden
55
7 Übung 2
7 Übung 2
7.0.9 Auslesen der Chip ID
Der Microcontroller kommuniziert mit dem Radiochip (TEA5764 Datenblatt ausgelegt und in der WEBPage) über die I2C Schnittstelle. Mit der folgenden Übung sollen Sie mit der I2C Schnittstelle vertraut
gemacht werden. Als erstes soll die Chip ID des TEA5764 ausgelesen werden.
7.0.9.1 Einführung
Beim Radioboard wird der ARM Microcontroller als Master und der TEA5764 als I2C Slave betrieben.
Jeder I2C Slave wird über eine meist fest einprogrammierte Adresse angesprochen. Der TEA5764 hat
zwei I2C Slaves und deshalb auch 2 Adressen. Ein I2c Slave steuert den RDS Block, der andere das FM
Radio. Wir wollen zunächst nur das FM Radio bedienen.
Radiochip TEA5764HN
R
L
Stereo-Decoder
Tuning System
Demod
RDS-Decoder
Frequenzy
Check
Register
Frequenzy
Set
Register
Steuer Register
Empfangs-Pegel
Stereo
Autosearch
Audio-Mute
I2C
Abbildung 7.1: Block Diagramm des Radio mit I2C
Der I2C Master sended dem Slave zunächst die Adresse und ob es sich um einen Read oder Write Transfer handelt. Beim Lesen sendet der Slave einen Byte Burst aller seiner vorhandenen Register, solange
wie der Master den Datenempfang bestätigt. Beim Schreiben sendet der Master Byte Burst Daten zum
Slave, solange dieser die Daten jeweils bestätigt.
56
I2C Master sendet Daten an Empfänger
Abbildung 7.2: I2C Protokolll
Zu beachten ist, dass die Byte Register in einer Kette aufgereiht sind und Register weiter hinten in der
Kette nicht einzeln ausgelesen oder geschrieben werden können. Die Kette muss immer beginnend vom
Register 0 bis zu dem Register welches interessiert ausgelesen bzw. geschrieben werden. Beim Lesen
verwirft der Benutzer Daten die ihn nicht interessieren. Beim Schreiben müssen alle Register der Kette
Kette im TEA Radiochip
immer wieder neu Register
beschrieben werden.
I2C
Adresse
…
0010 000 0R
1R
2R
3R
4R
0010 000
0W
1W
2W
3W
9R
4W …
10R
11R
5W
6W
12R
TNCNTRL1
FRQSETLSB
FRQSETMSB
INTMSK
TESTMODE
TESTBITS
INTFLAG
Abbildung 7.3: Read und Write Register im Slave
Zum Lesen steht die Routine readi2CData zur Verfügung. Zunächst legt man ein Datenarray von der
Länge aller auszulesender Register an. Danach muss der readi2CData Routine der Pointer zum Eintrag
0 des Arrays, die I2C Adresse des Slaves und die Länge des Arrays bzw. die Anzahl der auszulesenden
Bytes übergeben werden. Nach Ausführung der Routine stehen die ausgelesenen Daten im Array zur
Verfügung.
Die writei2CData Routine ist reziprok aufgebaut.
57
7 Übung 2
Abbildung 7.4: Softwareroutine zum lesen des I2C Slaves
7.0.9.2 Ausführung der Übung
Lesen sie mit dem I2C Interface die Chip-ID des Radiochip aus und zeigen sie diese auf dem Display an.
Die Adresse der I2C Register finden sie auf Seite 34, Tabelle 13.
Vergleichen sie Chip ID mit der im Datenblatt des TEA5764 angegebenen Chip-ID (TEA5764 Datenblatt, Seite 44 Tabelle 42/43).
7.0.10 Anzeigen der Eingestellten Radiofrequenz
Lesen sie mit Hilfe des I2C die eingestellte Radiofrequenz des TEA5764 aus (Register FREQCHKMSB
und FREQCHKLSB), wandeln sie diese mit Hilfe der im Script oder Datenblatt angegebenen Formel
um und zeigen sie diese auf dem LCD Display an. (TEA5764 Datenblatt, Seite 7 Formel 1)
7.0.11 Auswerten des Drehgebers
1. Schreiben sie eine Interruptroutine zum zählen von Pulsen des Drehgebers.
2. Die Kontakte des Drehgebers Prellen, überlegen sie sich, wie sie dieses prellen mit Software unterdrücken können und bauen sie dies in ihre Software ein.
3. Werten sie jetzt die zwei vom Drehgeber erzeugten Signale so aus, dass der Zähler bei Rechtsdrehung nach oben zählt, und bei Linksdrehung nach unten.
4. Transferieren Sie den Wert des Drehgeberzählers per I2C in die Register FREQSETMSB und
FREQSETLSB des Radiotuner, so dass sie mit Hilfe des Drehgebers die FM-Frequenz verstellen
können.
Sie haben jetzt genug mit dem Debugger geübt und können nun mit dem Projekt beginnen
58
8 Hardware-Umgebung des Radio Projektes
Die Hardwareumgebung ist ein Keil MCB2130 Development Board mit dem ARM basierenden Philips LPC2138 Kontroller. Darauf aufgesteckt ist die Platine, welche den Radio IC, das LCD Display,
den Drehgeber, Kopfhörerverstärker und Tastatur enthält. Die Stromversorgung erfolgt über die USB
Schnittstelle auf dem MCB2130. Diese USB Buchse hat, ausser der Stromversorgung, sonst keine weitere Funktion.
Target Hardware
MCB2130
Radioplatine
SCL
JTAG
ARM
LPC2134
GPIO 0.15
MOSI
MISO
EINT0
EINT2
IOPIN0.13
Radio
TEA5764
SDA
INTx
P0.15
P0.12
P0.6
P0.5
CS
SID
SOD
LCD display
P0.7
P0.1
ENA
Drehgeber
P0.13
ENB
P1.16, P1,17, P1.18
Tastatur
P1.19, P1,23
Abbildung 8.1: Blockdiagramm der Ziel-Hardware
59
8 Hardware-Umgebung des Radio Projektes
8.1 Das Keil MCB2130 Development board
Das Keil Entwicklungsboard enthält alles was man zum Entwickeln einer Hardware um den ARM7 Prozessor braucht. JTAG Schnittstelle zum anschliessen des Debuggers, zwei serielle Schnittstellen, Lautsprecher (den wir nicht benutzen), Analogeingang und acht LEDs (Wenn die Radioplatine aufgesteckt
ist, werden manche der LED Ansteuerleitungen als Eingänge benutzt, was zu Fehlfunktionen führen
könnte)
8.2 Radioboard mit LCD
Die Radioplatine ist an die Konfigurierbaren Schnittstellen P0 und P1 angesteckt, über die sie auch Ihre
Versorgungsspannung bezieht. Auf der Radioplatine befindet sich der FM Empfänger, LCD Display,
Kopfhörerverstärker, Drehgeber und Tastatur.
8.2.1 Drehgeber
Der Drehgeber soll dazu verwendet werden die Radiofrequenz einzustellen. Mechanische Kontakte dienen zur Erzeugung zweier zeitlich versetzter Signale. Dreht man den Drehknopf nach links, so eilt Signal
EINT Signal GPIO voraus. In umgekehrter Richtung eilt Signal GPIO Signal EINT voraus.
Drehgeber
Linksdrehung
Rechtsdrehung
GPIO0.13
GPIO0.13
EINT0, EINT2
EINT0, EINT2
Rising Edge
interrupts
Falling Edge
interrupts
Es werden die externen Interrupt Eingänge
EINT2 und EINT0 benutzt
Abbildung 8.2: Vom Drehgeber erzeugte Pulse
Die Drehrichtung kann vom Prozessor festgestellt werden, indem man mit der fallenden Flanke von
EINT0 einen Interrupt auslöst. Die steigende Flanke löst einen Interrupt auf EINT2 aus. Beim Auswerten
der Interrupts EINT0 und EINT1 kann man über Einlesen des GPIO0.13 pins von dessen logischen
Zustand auf eine Links bzw. Rechts-drehung schliessen. Vorsicht, die Konatkte sind mechanisch und
können prellen.
60
8.2 Radioboard mit LCD
8.2.2 Radio IC TEA5764
Der TEA5764 ist ein FM Stereo Radio auf einem Chip. Empfangsstufe, Zwischenfrequenz, PLL Abstimmung, Stereodecoder und sogar ein RDS decoder sind auf dem Chip integriert. Das Einstellen der
Frequenzen und andere Steuerfunktionen erfolgen über die I2C Schnittstelle.
Radiochip TEA5764HN
R
L
Stereo-Decoder
Tuning System
Demod
RDS-Decoder
Frequenzy
Check
Register
Frequenzy
Set
Register
Steuer Register
Empfangs-Pegel
Stereo
Autosearch
Audio-Mute
I2C
Abbildung 8.3: Radiochip TEA5764
8.2.2.1 Berechnen der Abstimmfrequenz
Einstellen der Frequenzen erfolgt über das Frequency Set Register. Dazu müssen die Werte für die beiden
8-bit FRQSETMSB und FRQSETLSB Register berechnet und beschrieben werden (Write Register 1 &
2, Read Register 2 & 3). Die Berechnung des in die Register zu schreibenden Wertes ist wie folgt:
NDEC =
4x( fRF + fIF )
fre f
NDEC = DezimalwertdesFrequencySetRegister
fRF = GewuenschteAbstimm f requenzHz
fIF = Zwischen f requenz(225kHz)
fre f = Re f erenz f requenzdesQuartzoszillators(32.768kHz)
Beispiel um einen Sender mit der Frequenz 100.1 MHz zu empfangen:
NDEC =
4x(100.1x106 + 225x103 )
= 12246.704
32768
61
8 Hardware-Umgebung des Radio Projektes
8.2.2.2 Frequenzzähler
Die eingestellte Oszillator Frequenz wird gezählt und kann über die I2C Schnittstelle ausgelesen (Frequency Check Register) und auf dem Diplay angezeigt werden. Die Umrechnung ist identisch mit der
Berechnung der Abstimmfrequenz.
8.2.2.3 Steuerregister
Im Steuerregister kann man das Stummschaltungsverhalten bei fehlender Trägerfrequenz, die StereoMono Umschaltung usw. eingestellt werden. Ausserdem kann die Feldstärke des empfangenen Signales
ausgelesen werden. Die Steuerung für den selbständigen Sendersuchlauf ist auch in diesem Register
vertreten.
62
8.3 Entwicklungssystem
8.3 Entwicklungssystem
Das Keil µVision Entwicklungssystem ist per USB und ULink Adapter am JTAG Anschluss des MCB2130
Development Board angeschlossen.
Ausführliche Informationen liefert der „µVision Users Guide“ [Kei06].
8.4 Beispiel Anwendungssoftware
Als Einsteigerbeispiel wurde eine Einsteigersoftware geschrieben. Sie enthält Routinen zum Ansteueren
des SPI, IIC und LCD Displays.
63
8 Hardware-Umgebung des Radio Projektes
8.5 Softwarepflichtenheft
8.5.1 Display
Auf dem Display muss folgende Information ersichtlich sein:
• Radiofrequenz
• Eingestellter Preset Kanal
• Statusanzeige: Stereo->Mono->Speichern. Stereo Anzeige nur bei vorhandenem Stereopilotsignal,
sonst Anzeige Mono.
• Feldstärke des empfangenen Senders als Ganzzahl. Pluspunkte gibt es, wenn ein Display Logo
erzeugt wird, dass die Feldstärke wie eine Analoganzeige erscheint (ähnlich Mobiltetlephon).
• Numerische Anzeige von 16 voreinstellbaren Stationen. Falls die Station mit dem Drehrad oder
dem Suchlauf verstellt wurde, erscheint H.
• Betriebsart (Suchlauf, Preset)
Abbildung 8.4: Anordnung der Bedien- und Anzeigeelemente
8.5.2 Suchlauf
1. Dücken der Taste „Suchen Auf“ sucht Sender überhalb der momentan eingestellten Frequenz.
2. Drücken der Taste“Suchen Ab“ sucht Sender unterhalb der momentan eingestellten Frequenz.
3. Es spielt keine Rolle, ob die Frequenz bei Start des Suchlaufes mit dem Drehrad, über die Stationstasten oder über einen vorangegangenen Suchlauf eingestellt wurden.
4. Überschreitet der Suchlauf beim Aufwärtssuchen die Frequenz 108 MHz, so beginnt er wieder bei
87.5 MHz.
5. Unterschreitet der Suchlauf beim Abwärtssuchen die Frequenz 87.5 MHz, so beginnt er wieder bei
108 MHz.
64
8.5 Softwarepflichtenheft
6. Startet der Suchlauf bei einer über die Stationstasten eingestellten Frequenz, so wechselt die Stationseinstellung von einer numerischen Zahl in ein H (Hand).
8.5.3 Frequeneinstellung per Handrad
1. Drehen des Handrades nach rechts erhöht die gerade gehörte Frequenz mit einem Raster von
50kHz Schritten, beginnend bei 87.5 MHz
2. Drehen des Handrades nach links verringert die gerade gehörte Frequenz mit einem Raster von
50kHz Schritten, beginnend bei 108 MHz.
3. Überschreitet man 108 MHz, beginnt die Frequenzeinstellung wieder bei 87.5 MHz
4. Unterschreitet man 87.5 MHz, wird die Frequenzeinstellung wieder bei 108 MHz fortgesetzt
5. Verstellt man eine über die Stationstasten eingestellten Frequenz, so wechselt die Preset Kanalanzeige von einer numerischen Zahl in ein H (Hand).
8.5.4 Speichern einer Frequenz
1. Suchen sie einen Sender mit der Suchlauftaste oder stellen Sie diesen direkt mit dem Drehrad ein.
2. Drücken sie die „Speichern“ Taste min. 3s, bis in der Anzeige Station blinkt
3. Stellen sie mit den Stations Auf/Ab Tasten die Station ein, an der sie die vorher eingestellte Frequenz abspeichern wollen.
4. Drücken sie die Speicher Taste min. 3s, die Station wird gespeichert und die Anzeige Station hört
auf zu blinken.
5. Wird die Taste während des Speicherzustandes während 1 Minute nicht zum zweiten mal gedrückt,
schaltet das Gerät automatisch in den normalen Betriebszustand zurück.
8.5.5 Frequeneinstellung per Stationstasten
1. Mit den Tasten „Station Auf“ und „Station Ab“ kann man 16 voreingestellte Stationen abrufen.
2. Überschreitet man Station 16, so wird wieder bei Station 1 begonnen.
3. Unterschreitet man Station 1, so wird wieder bei Station 16 fortgesetzt.
8.5.6 Umschalten zwischen Mono- und Stereoempfang
Drücken sie die Taste Speichern nur kurz. Die Funktion wechselt von Mono nach Stereo. Erneutes kurzes
Drücken lässt die Anzeige von Stereo nach Mono wechseln. Auf dem Display erscheint die Anzeige
„Stereo“ nur wenn auch tatsächlich ein Stereosender empfangen wird
65
D
C
B
A
R13
C15
P0X201
P0C1502 P0C1501
X2
100n
1
GND
33n
C13
XTAL
47p
C10
27p
2 C14
GND
GND
X1C
P0X1058
GND
Xn
C31
10n
C12
12p
GNDRF
P0U1038
C8
2
100k
10k
R11
10n 33n
R10
C9
39 P0U1039
CAGC
40P0U1040
n.c.
38
36 P0U1036
RFIN1
37 P0U1037
RFIN2
35P0U1035
CD3
34 P0U1034
VCAA
GND
GND
P0D102
P0S501
S5
P0S401
S4
P0S301
S3
P0S201
S2
S1
P0S101
D2
P0D202
33nH
P0L202
33nH
P0L201
P0L302
P0R102
P0R101
P0D201
C3
33n
P0C301 P0C302
P0S502
P0S402
P0S302
P0S202
P0S102
P0L301
P0R302
P0R202
P0R201
P0R301
47k
C5
33n
33n
R12
C6
C7
33n
3
P0R402
C17
R2
100k
GND GND
GND
D Varactor
D Varactor
L2
L3
P0D101
D1
GND
31P0U1031
n.c.
32 P0U1032
FREQIN
33 P0U1033
XTAL
TestPoint
P0X301
100n
X3
C30
GND
P0X1057
GND
X1K
GND
P0X106
P0X105
R4
P0R401
GND
P0X104
C18
X1E
P1.21
P1.22
P1.23
P1.17
P1.18
P1.19
P1.30
P1.32
P0.28
P0.29
P0.30
P0.31
P1.26
P1.27
P0.24
P0.25
P0.26
P0.27
GND
P0X1044
P0X1043
P0X1042
P0X1041
X1I
P0X1028
P0X1027
C4
C33
10n
GND
16
12
n.c. P0U1011
11
SDA
P0U1012
P0U1015
15
VCCD P0U1014
14
GNDD P0U1013
13
GNDD
P0U1016
CD2/INTCON3
P0U1019
19
GNDD
P0U1018 18
INTCON2 P0U1017
17
n.c.
20
0
P0U1020
P0U100
INTX
Heat Sink
n.c.
P0X1048
P0X1047
P0X1046
P0X1045
P0X1032
P0X1031
P0X1030
P0X1029
P0X1016
P0X1015
P0X1014
P0X1013
N0SDA
SDA
GND
GND
33n
P0C3202 P0C3201
C32
GND
N0INTX
INTX
GND
U1
TEA5764HN
21
P1.29
P0U1021
P1.28
P1.25
P0X1026
P1.24
P0X1025
X1G
P0X1012
P0X1011
P0X1010
P1.20
P1.16
P0X109
4
GND
GND
100n
C25
SDA
P0X401
X4
2
2.5k
CW
N0SDA
SDA
N0SCL
SCL
N0ENA
ENA
N0VAFR
VAFR
P0R1702
CCW
R17
R19
8.2k
GND
3.3V
N0VAFL
VAFL
N0RST
RST
N0SWPORT
SWPORT
R18
3.3k
3.3V
X5
R14 P0X5011
1
3.3k
SCL
N0BUSENABLE
BUSENABLE
3.3V
4
X1F
P0.6
P0.7
P0.2
P0.3
P0.12
P0.13
P0.14
P0.15
P0.9
P0.10
P0.11
P0.23
P0.19
P0X1052
2
GND
2.5k
CW
P0R1602
CCW
R16
5
P0.22
P0.18
P0X1056
P0X1055
P0X1054
P0X1053
P0X1040
P0X1039
P0X1038
P0X1037
P0X1024
P0X1023
P0X1022
P0X1021
2.2u
P0C2702 P0C2701
C27
2.2u
P0C2602 P0C2601
C26
P0.21
P0.17
P0X1051
P0X1050
P0.20
P0.16
P0X1049
X1J
P0X1036
P0X1035
P0X1034
P0.8
P0X1033
X1H
P0X1020
P0X1019
R20
8.2k
P0R1601
P0.5
P0.1
P0X1018
P0.4
P0.0
P0X1017
5
GND
GND
N0MUTE
MUTE
N0INTX
INTX
GND
C22
22u
4
5
6
8
7
2
3
1
Standby
VAFL+
VAFL-
VAFR+
VAFRSVRR
P0D304
P0D306
P0D305
Mode
P0D308
MUTE
P0D307
P0D303
P0D302
P0D301
SCK0
P0X801
X8
SOD
P0X701
X7
SID
N0MUTE
MUTE
N0ENB
ENB
N0CS
CS
N0ENA
ENA
N0SID
SID
N0SOD
SOD
X6
N0SCK0
SCK0
P0X601
6
P0D3015
15
3
P0R502
P0R501
3.3V
R5
100k
P0X103
P0Y102
P0C1402 P0C1401
100n
C29
GND
Y1
P0Y101
1
100n
C28
C11
33n
GND
L1
GND
120nH
P0C2801 P0C2802
C34
GND
47u/16V
C16
C2
P0X101
P0X102
GND
P0R1301
10 Ohm
P0R1302
FM antenna 100p
3.3V
470uF/5V
GND
C1
3.3V
3.3
3.3
P0C202
P0C201
X1A
7
P0X107
P0C2901 P0C2902
3.3
P0C101
P0C1602 P0C1601
P0C3001 P0C3002
8
P0C3401 P0C3402
29
P0X108
P0U1030
P0C102
P0L102
P0L101
P0C1301 P0C1302
28
3.3
MPXIN
16
6
GND
12
11
P0D3011
GND
3.3V
2
Document Number
S6
GND
15
LCD1
P0LCD1015
GND
27 Ohm
R8
100k
7
3.3V
R9
100k
8
N0ENA
ENA
N0ENB
ENB
8
*
Revision
This document is property of InES - Institute of Embedded Systems
No copying or distribution without prior written permission of InES
Zurich University of Applied Sciences
InES - Institute of Embedded Systems
PO Box 805
8401 Winterthur
Switzerland
GND
17
18
P0LCD1018
P0LCD1017
R6
EA DIP204 LCD
n.c.
A
C
Drehrichtungsencoder
Phonejack3
4P0LCD104
R/S
5 P0LCD105
R/W (SID)
6 P0LCD106
E (SCK)
7P0LCD107
D0
8P0LCD108
D1
9P0LCD109
D2
10
P0LCD1010
D3
11
P0LCD1011
D4
12
P0LCD1012
D5
13
P0LCD1013
D6
14
P0LCD1014
D7
2k
CW
P0R1502
CCW
R15
3.3V
Sheet 1 of 1
Print date: 12.04.2006 Drawn by: zei
File: D:\Protel\Documents\ARM Radio\ARM Radio1.SchDoc
A3 *
Size
*
Title
J2
P0J201
P0J204
P0J205
© InES
C19
100n
C24
220u
P0C2401 P0C2402
P0C2301 P0C2302
C23
220u
C21
100u
14
P0D3014
P0D3012
BUFFER
OUT2
OUT1
P0C2001 P0C2002
GND
D3
TDA8559
P0C2102 P0C2101
GND
C20
100n
N0CS
CS
N0SID
SID
N0SCK0
SCK0
N0SOD
SOD
7
1
3
X1D
P0C1001 P0C1002 P0C1101 P0C1102
P0C1201 P0C1202
P0C3101 P0C3102
30
CPOUT
P0U1029
n.c.
2
P0C802
P0R1002
P0C801
P0R1102
P0R1001
P0R1101
P0C902
P0C901
LOOPSW
P0U101
1
GNDA
P0U102
2
P0U1028
GNDD
LO1
3P0U103
P0U102727
LO2
4P0U104
P0U1026
26
MPXOUT
R3
100k
6 P0U106
PILLP
P0R1401
P0R1402
P0R1501
P0R1503
R1
100k
P0C602
P0R1202
P0C601
P0R1201
CD1
5P0U105
P0C702
SCL
P0C701
33n
N0VAFL
VAFL
P0C502
P0C402
P0C401
23
N0VAFR
VAFR
P0U1024
24
P0C1701 P0C1702
P0U1025
25
VAFL
P0C501
P0U1022
22
INTCON1
P0C1801 P0C1802
8
P0R1902
P0R1901
100k
SWPORT
N0SWPORT
1
3
2.2u
VAFR
P0U108
BUSENABLE
N0BUSENABLE
P0C2501 P0C2502
P0R1801
P0R1802
P0R1701
P0R1703
2.2u
P0U107
7
3
TMUTE
10P0U1010
SCL
N0SCL
P0R2002
1P0R2001
P0R1603
P0U1023
VREFDIG
9
P0U109
P0C3301 P0C3302
P0C2202 P0C2201
P0D3016
P0D309
3
C
3
VP2
13P0D3013
GND
2
P0S603
1
VP1
P0LCD102
VDD
1P0LCD101
VSS
2
X1B
P0C1901 P0C1902
P0LCD103
VEE
16P0LCD1016
RST
A
P0S601
3.3V
P0D3010
N0RST
B
P0S602
P0R602
P0R601
P0R802
P0R801
66
P0R902
RST
P0R901
1
D
C
B
A
8 Hardware-Umgebung des Radio Projektes
8.6 Schaltpläne der Versuchsboards
SWPORT
BUSENABLE
8.6 Schaltpläne der Versuchsboards
67
8 Hardware-Umgebung des Radio Projektes
68
Literaturverzeichnis
[ARM00] ARM, LTD: ARM7 TDMI Technical Reference Manual. 1. : , 2000. – ARM Programming
Model. http://www.arm.com
[Ele05]
E LECTRONIC, Assembly: LCDModul 4x20 eadip204-4. 1. : , 2005. – Programmer’s Referenz
Manual für 4 Zeilen Dot Matrix LCD display. http://www.lcd-module.de/deu/
pdf/doma/dip204-4.pdf
[Kei06]
K EIL: uVision Users Guide. 1. : , 2006. – Programmer’s Referenz Manual für 4 Zeilen Dot
Matrix LCD display. http://www.keil.com/support/man/docs/uv3/
[Mar05]
M ARTIN, Trevor: The Insider’s Guide To The Philips ARM7 Based Microcontrollers. 2.
Hitex(UK) Ltd., 2005. – 214 S. – Programmieranleitung zu den Philips LPC2100 Microkontrollern mit praktischen Programmierbeispielen in Assembler und C.. – ISBN 0–9549988–1
[Phi00]
P HILIPS, Semiconductors: The I2C-Bus Specification. 2. Philips Semiconductors, 2000. –
46 S. – Philips I2C Specification
[Phi05a]
P HILIPS, Semiconductors: TEA5764 Datasheet. 1. : , 2005. – Referenz Manual for TEA5764.
http://www.semiconductors.philips.com/pip/TEA5764HN_2.html
[Phi05b] P HILIPS, Semiconductors:
UM10120 Volume 1:LPC213x User Manual.
1.
: , 2005. –
Programmer’s Referenz Manual für LPC2138. Detailierte Register und Programmierbeschreibung. Keine Angaben über Pinout oder elektrische
Daten. http://www.semiconductors.philips.com/acrobat_download/
usermanuals/UM10120_1.pdf
[Sam05]
S AMSUNG, Electronics:
60 Segment Driver & Controller for DOT Matrix LCD.
1.
: , 2005. –
Programmer’s Referenz Manual für 4 Zeilen Dot Matrix LCD display.
http://www.samsung.com/Products/Semiconductor/
DisplayDriverIC/MobileDDI/BWSTN/S6A0073X/S6A0073X.htm
69
Index
Abort, 7
Acknowledge, 43
AHB, 22
ARM-Befehlssatz, 14
ASCII, 50
banked Registers, 9
Bond Out, 16
Bootloader, 26
Capture, 41
Current Program Status Register, 7
Debugger, 16
Drehgeber, 60
Echtzeit, 14
Embedded Trace Macro, 19
ETM, 19
Exception, 11
Exception Abort, 24
extint, 30
extmode, 30
extpolar, 30
extrne Speicher, 23
Fast Interrupt, 7
FIQ, 7
Flash, 23, 25
General Purpose Register, 7
GPIO, 38
ICE, 16
Intellectual Property, 1
interrupt, 28
IOCLR, 38
IODIR, 38
IOPIN, 38
IOSET, 38
IP, 1
IRQ, 7
jtag, 17
KS0073, 50
Link Register, 9
PCLK, 40
Pipeline, 6
Prescaler, 40
Programmzähler, 7
Register Banking, 9
RISC, 1
Safed Program Status Register, 7
SCL, 42
SDA, 42
SP, 7
SPI, 49
SPSR, 7
SRAM, 23
Stack Pointer, 7
Stromverbrauch, 3
Supervisor, 7
System on Chip, 2
tdi, 17
tdo, 17
tea5764, 47
Thumb, 14
Timer, 40
Tracespeicher, 16
Undefined, 7
User, 7
Verilog, 2
VHDL, 2
VLSI, 1
VPB, 22