NXP LPC1114fn28 – ARM im DIP

Erstaunt habe ich festgestellt, dass es von NXP mit dem LPC1114fn28 einen ARM Cortex M0 basierten Microcontroller im DIP28 Gehäuse gibt. Da habe ich mir doch über Mouser gleich ein paar bestellt. Es gibt viele, kommerzielle Toolchains für ARM. Genannt sei hier Keil, code_red oder IAR. Allerdings ist es mir, wie immer, lieber auf freie Software zu setzen.

Nach einiger Recherche bin ich auf die Summon-Toolchain gestoßen. Diese basiert auf dem Linaro-Fork des GCC. Der Compile der Toolchain hat auf meinem Ubuntu 12.04 LTS, als auch auf Mac OSX Montain Lion (mit Mac-Ports), ohne Probleme funktioniert. Um den Code in den Flash zu laden habe ich auf Linux und Mac OSX lpc21isp verwendet. Das Programm ist ebenfalls Open-Source und liegt somit als Source-Code vor. Um das Tool auf Mac OSX zu kompilieren ist es notwendig das -static Flag aus den CFLAGS im Makefile zu entfernen. Des weiteren gibt es einen Bug, der in manchen Szenarien das Laden der HEX-Dateien verhindert. Folgende, in diesem Thread diskutierte, Änderung löst das Problem zu Mindestens teilweise:

@@ -1962,17 +1974,28 @@ static int LoadFiles1(ISP_ENVIRONMENT *IspEnvironment, const FILE_LIST *file)
 {
     int ret_val;

-    if(!file || !file->prev)
+    if(!file)
     {
-        return -1;
+      printf("rh Load files 1 a: return 0\n");
+      return 0;
     }
+    printf("rh File name: [%s]\n", file->name);

-    DebugPrintf( 3, "Follow file list %s\n", file->name);
-
-    ret_val = LoadFiles1( IspEnvironment, file->prev);
-    if( ret_val != 0)
+#ifdef rh_excluded
+    if(!file->prev)
     {
-        return ret_val;
+      printf("rh Load files 1 b: return 0\n");
+      return 0;
+    }
+#endif
+
+    if (file->prev != NULL) {
+      DebugPrintf( 3, "Follow file list %s\n", file->name);
+      ret_val = LoadFiles1( IspEnvironment, file->prev);
+      if( ret_val != 0)
+       {
+         return ret_val;
+       }
     }

     DebugPrintf( 3, "Attempt to read File %s\n", file->name);

Danach war es mir möglich Code in den Chip zu laden. Alles, was man dazu brauch ist dann noch ein USB2UART Konverter. Ich verwende dazu diesen hier von ELV. Der ist sehr günstig und funktioniert gut. Für einen minimalen Aufbau auf dem Bread-Board reicht also das USB-Breakout, sowie zwei 100nF Folienkondensatoren zwischen VSS und VDD, sowie VSSA und VDDA. Die Schaltung kann komplett mit der vom USB-Breakout bereit gestellten 3.3v Spannungsversorgung betrieben werden. Ein Netzteil oder Spannungswandler ist nicht notwendig. Somit ist der Einstieg sehr einfach möglich. Hier ein Beispielaufruf von lpc21isp:

lpc21isp firmware.hex /dev/ttyUSB0 19200 12000

Diese Code-Sammlung von Microbuilder.eu erleichtert den Einstieg zusätzlich. Der Code baut mit der Summon-Toolchain sofort und kann dann mit lpc21isp in den Chip geladen werden. Die Codebase geht davon aus, dass die Firmware auf einem Development-Board von Microbuilder läuft. Daher ist es notwendig die blinkende LED an einem anderen PIN unter zu bringen und den Code entsprechend anzupassen. Ich habe hierzu den PIN 26 (Port PIO0_3) genommen. Anode der LED auf den PIN, Kathode via 270 Ohm auf GND. Auch ist zu beachten, dass auf dem Devel-Board ein externer Quarz verwendet wird. D.h. entweder muss man auf dem Bread-Board einen solchen Quarz stecken, oder aber den Code anpassen um den internen Oszillator des LPC1114 zu verwenden. Ansonsten tut sich gar nichts 😉 Wenn man alles richtig gemacht hat, dann blinkt die LED im Sekundentakt und man kann auf die “serielle Konsole” connecten und dort einige Kommandos absetzen. Die Default-Rate ist 115200 Bps und kann bei Bedarf im Code angepasst werden. Ein guter Einstieg für Anpassungen an der Codebase ist die Datei projectconfig.h. Generell ist es sinnvoll mittelfristig allen Code zu sichten, vor Allem wenn man selber Erweiterungen vornehmen oder diesen als Basis für eigenen Projekte verwenden möchte.

Nach wenigen Tagen Einarbeitung war es mir möglich einige der “Treiber”, die ich für den Atmega bereits geschrieben oder gesammelt hatte, auf den Cortex M0 zu portieren. Z.B. für den DHT11 Feuchte und Temperatur Sensor oder für HD44780 basierte LCD-Module (wie z.B. dieses hier von Pollin), die ich im aktuellen Fall wegen dem geringen PIN-Count des LPC1114 via I2C und einem PCF8574 Port-Extender angebunden habe. Auch die PWM-Funktion und die Timer des LPC lassen sich mit der Codebase direkt verwenden. Die “serielle Konsole” lässt sich einfach erweitern.

Kurz: Es macht viel Spaß mit dem Käfer zu basteln. Auch wenn der Einstieg gefühlt komplizierter war als beim Atmega. Dieses Buch hier kann ich noch sehr empfehlen. Ansonsten finden sich viele Quellen im Netz bzw. direkt auf den Webseiten von ARM und NXP. Als nächstes möchte ich mir die SWD Schnittstelle des LPC anschauen. Entsprechende Debug-Hardware auf JTAG-Basis ist im Atmel-Ökosystem noch relativ teuer. Wohingegen es ARM-Devel Boards mit SWD Hardware und ausgeführtem Bus auf der PIN-Leiste schon für 10 – 20 Eur gibt. Sowie Open-Source Tools wie LibSWD und OpenOCD.

Hier noch zwei Bilder von meinem aktuellen Bread-Board Aufbau. Der blaue Baustein gleich beim USB-Breakout ist der DHT11 Sensor. In der Mitte ist der LPC1114 eingebaut und ganz vorne sieht man den PCF8574, der die Display-Anbindung realisiert. Das Poti stellt den Display-Kontrast ein.

lpc1114-1

Auf dem Display wird die “Uptime” hochgezählt. Die rote LED hängt am PWM und wird im Loop gedimmt. Die grüne LED blinkt, wie zu Beginn beschrieben, im Sekundentakt.

lpc1114-2

Und hier noch ein Screenshot von der UART-Konsole:

lpc1114-uart

Leave a Reply