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