Chris:
Der Keil Startup Code für LPC21xx und LPC22xx paßt komplett auf diese
gesamte Bausteinserie und ist ausgereift. Bei den neueren LPC23xx und
24xx hab ich allerdings keine Erfahrung.
Die Keil Startup.s in der Demo-Version ist voll in Ordnung und die selbe
wie in der Vollversion, enthält alle Grundinitialisierungen, auch die,
die man auf Grund der Geschwindigkeit und Änderung der Operation Modes
in C nicht so gut bewerkstelligen kann:
Initialisierung der Stacks für alle Operation Modes
Heap Speicherreservierung (für ARM RealView)
Interrupt- und Exception- Vektoren mit Default-Labels (Endlos-Schleifen
für die Exceptions, die man bei Bedarf anpassen kann)
PLL Initialisierung
MAM Setup
External Memory Controller
Selbst habe ich hinzu gefügt:
IRQ Surprise Interrupt Handler mit IRQ Surprise Interrupt Zähler
FIQ Surprise Interrupt Handler mit FIQ Surprise Interrupt Zähler
Diese Zähler kann man z.B. über UART an Hyperterminal ausgeben oder auf
dem CAN-Bus an den CAN-Analyser ins Nutzdatenfeld, um zu sehen, ob der
ARM irgendwelche Mätzchen (Unannehmlichkeiten) macht.
Und die Unannehmlichkeiten habe ich tatsächlich, bis zu 100000 FIQ
Capture Interrupts pro Sekunde (aus hochgenauer Frequenzmessung) und
Watchdog Feed, das konnte bisher nicht gelöst werden.
Wenn du den Startup-Code selbst erstellen wolltest, nur um den ARM erst
mal überhaupt vernünftig ans laufen zu bekommen, wärst du eine Weile nur
damit beschäftigt, bis dein ARM überhaupt vernünftig läuft.
Die Startup.s selbst zu erweitern, ist natürlich jedem User frei
vorbehalten.
Ich verwende LPC2129 und 2138, die Dinger laufen mit der Keil Startup
völlig reibungslos.
Im C-Code nach main() initialisiert man denn das was man für seine
Anwendung noch braucht, z.B. I/O-Ports, die Peripherals und Exception
Behandlung Funktionen (ganz normale Funktionen, nicht als IRQ o.ä.
deklariert).
Für die Exceptions Undef, DAbt, PAbt, habe ich einen Sprung von den
Vektoren in der Startup.s zu einer C-Funktion installiert und die
entsprechende Endlosschleife gelöscht.
Die Exceptions behandele ich zunächst noch als schnell initialisierten
Watchdog-Reset mit zwei falschen Feed-Befehlen, da ich mit den
Exceptions zur Zeit noch nichts konkretes anzufangen weiß. Später in der
richtigen Anwendung, sollte natürlich niemals mehr eine Exception
auftreten.
Mit dem ARM Assembler wird man früher oder später etwas vertraut,
spätestens dann, wenn man mal 2 separate unabhängige Programme im ARM
installieren muß und die Interruptvektoren an das aktive Programm
umleiten muß.
Gruß
Dietmar