{"id":629,"date":"2013-02-03T17:55:02","date_gmt":"2013-02-03T16:55:02","guid":{"rendered":"http:\/\/www.admindu.de\/wordpress\/?p=629"},"modified":"2014-01-22T17:51:41","modified_gmt":"2014-01-22T16:51:41","slug":"nxp-lpc1114fn28-arm-cortex-m0-im-dip28","status":"publish","type":"post","link":"https:\/\/www.admindu.de\/wordpress\/?p=629","title":{"rendered":"NXP LPC1114fn28 &#8211; ARM im DIP"},"content":{"rendered":"<p>Erstaunt habe ich festgestellt, dass es von NXP mit dem <a title=\"LPC1114fn28\" href=\"http:\/\/www.nxp.com\/products\/microcontrollers\/cortex_m0\/lpc1100_x_l\/LPC1114FN28.html\" target=\"_blank\">LPC1114fn28<\/a> einen ARM Cortex M0 basierten Microcontroller im DIP28 Geh\u00e4use gibt. Da habe ich mir doch \u00fcber <a title=\"Mouser\" href=\"http:\/\/de.mouser.com\/\" target=\"_blank\">Mouser<\/a> gleich ein paar bestellt. Es gibt viele, kommerzielle Toolchains f\u00fcr ARM. Genannt sei hier <a title=\"Keil\" href=\"http:\/\/www.keil.com\/arm\/mdk.asp\" target=\"_blank\">Keil,<\/a> <a title=\"code_red\" href=\"http:\/\/www.code-red-tech.com\/\" target=\"_blank\">code_red<\/a> oder <a title=\"IAR\" href=\"http:\/\/www.iar.com\/en\/Products\/IAR-Embedded-Workbench\/ARM\/\" target=\"_blank\">IAR<\/a>. Allerdings ist es mir, wie immer, lieber auf freie Software zu setzen.<\/p>\n<p><!--more--><\/p>\n<p>Nach einiger Recherche bin ich auf die <a title=\"Summon Toolchain\" href=\"https:\/\/github.com\/esden\/summon-arm-toolchain\" target=\"_blank\">Summon-Toolchain<\/a> gesto\u00dfen. Diese basiert auf dem <a title=\"Linaro\" href=\"http:\/\/www.linaro.org\/\" target=\"_blank\">Linaro-Fork<\/a> des GCC. Der Compile der Toolchain hat auf meinem Ubuntu 12.04 LTS, als auch auf Mac OSX Montain Lion (mit <a title=\"Mac Ports\" href=\"http:\/\/www.macports.org\/\" target=\"_blank\">Mac-Ports<\/a>), ohne Probleme funktioniert. Um den Code in den Flash zu laden habe ich auf Linux und Mac OSX <a title=\"lpc21isp\" href=\"http:\/\/sourceforge.net\/projects\/lpc21isp\/\" target=\"_blank\">lpc21isp<\/a> 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 <a title=\"Fix lpc21isp\" href=\"http:\/\/www.mikrocontroller.net\/topic\/276753#new\" target=\"_blank\">Thread <\/a>diskutierte, \u00c4nderung l\u00f6st das Problem zu Mindestens teilweise:<\/p>\n<div>\n<div>\n<table width=\"975\">\n<tbody>\n<tr>\n<td>\n<div>\n<pre>@@ -1962,17 +1974,28 @@ static int LoadFiles1(ISP_ENVIRONMENT *IspEnvironment, const FILE_LIST *file)\r\n {\r\n     int ret_val;\r\n\r\n-    if(!file || !file-&gt;prev)\r\n+    if(!file)\r\n     {\r\n-        return -1;\r\n+      printf(\"rh Load files 1 a: return 0\\n\");\r\n+      return 0;\r\n     }\r\n+    printf(\"rh File name: [%s]\\n\", file-&gt;name);\r\n\r\n-    DebugPrintf( 3, \"Follow file list %s\\n\", file-&gt;name);\r\n-\r\n-    ret_val = LoadFiles1( IspEnvironment, file-&gt;prev);\r\n-    if( ret_val != 0)\r\n+#ifdef rh_excluded\r\n+    if(!file-&gt;prev)\r\n     {\r\n-        return ret_val;\r\n+      printf(\"rh Load files 1 b: return 0\\n\");\r\n+      return 0;\r\n+    }\r\n+#endif\r\n+\r\n+    if (file-&gt;prev != NULL) {\r\n+      DebugPrintf( 3, \"Follow file list %s\\n\", file-&gt;name);\r\n+      ret_val = LoadFiles1( IspEnvironment, file-&gt;prev);\r\n+      if( ret_val != 0)\r\n+       {\r\n+         return ret_val;\r\n+       }\r\n     }\r\n\r\n     DebugPrintf( 3, \"Attempt to read File %s\\n\", file-&gt;name);<\/pre>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Danach war es mir m\u00f6glich Code in den Chip zu laden. Alles, was man dazu brauch ist dann noch ein USB2UART Konverter. Ich verwende dazu <a title=\"USB2UART\" href=\"http:\/\/www.elv.de\/mini-usb-modul-um2102-komplettbausatz.html\">diesen<\/a> hier von ELV. Der ist sehr g\u00fcnstig und funktioniert gut. F\u00fcr 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\u00f6glich. Hier ein Beispielaufruf von lpc21isp:<\/p>\n<pre>lpc21isp firmware.hex \/dev\/ttyUSB0 19200 12000<\/pre>\n<p>Diese <a title=\"CodeBase\" href=\"http:\/\/www.microbuilder.eu\/Projects\/LPC1114ReferenceDesign\/LPC1114CodeBase.aspx\" target=\"_blank\">Code-Sammlung<\/a> von <a title=\"Microbuilder\" href=\"http:\/\/www.microbuilder.eu\/home.aspx\" target=\"_blank\">Microbuilder.eu<\/a> erleichtert den Einstieg zus\u00e4tzlich. 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\u00e4uft. 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 \ud83d\ude09 Wenn man alles richtig gemacht hat, dann blinkt die LED im Sekundentakt und man kann auf die &#8220;serielle Konsole&#8221; connecten und dort einige Kommandos absetzen. Die Default-Rate ist 115200 Bps und kann bei Bedarf im Code angepasst werden. Ein guter Einstieg f\u00fcr 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\u00fcr eigenen Projekte verwenden m\u00f6chte.<\/p>\n<p>Nach wenigen Tagen Einarbeitung war es mir m\u00f6glich einige der &#8220;Treiber&#8221;, die ich f\u00fcr den Atmega bereits geschrieben oder gesammelt hatte, auf den Cortex M0 zu portieren. Z.B. f\u00fcr den <a title=\"DHT11\" href=\"http:\/\/www.micro4you.com\/files\/sensor\/DHT11.pdf\" target=\"_blank\">DHT11 Feuchte und Temperatur Sensor<\/a> oder f\u00fcr HD44780 basierte LCD-Module (wie z.B. <a title=\"LCD Modul\" href=\"http:\/\/www.pollin.de\/shop\/dt\/MTczOTc4OTk-\/Bauelemente_Bauteile\/Aktive_Bauelemente\/Displays\/LCD_Modul_TC1604A_01.html\" target=\"_blank\">dieses hier <\/a>von Pollin), die ich im aktuellen Fall wegen dem geringen PIN-Count des LPC1114 via <a title=\"I2C\" href=\"http:\/\/de.wikipedia.org\/wiki\/I%C2%B2C\" target=\"_blank\">I2C<\/a> und einem <a title=\"PCF8574\" href=\"http:\/\/www.nxp.com\/documents\/data_sheet\/PCF8574.pdf\" target=\"_blank\">PCF8574<\/a> Port-Extender angebunden habe. Auch die PWM-Funktion und die Timer des LPC lassen sich mit der Codebase direkt verwenden. Die &#8220;serielle Konsole&#8221; l\u00e4sst sich einfach erweitern.<\/p>\n<p>Kurz: Es macht viel Spa\u00df mit dem K\u00e4fer zu basteln. Auch wenn der Einstieg gef\u00fchlt komplizierter war als beim Atmega. Dieses <a title=\"Buch\" href=\"http:\/\/www.amazon.de\/The-Definitive-Guide-Arm-Cortex-M0\/dp\/0123854776\">Buch<\/a> hier kann ich noch sehr empfehlen. Ansonsten finden sich viele Quellen im Netz bzw. direkt auf den Webseiten von ARM und NXP. Als n\u00e4chstes m\u00f6chte ich mir die <a title=\"SWD\" href=\"http:\/\/www.arm.com\/products\/system-ip\/debug-trace\/coresight-soc-components\/serial-wire-debug.php\" target=\"_blank\">SWD Schnittstelle<\/a> des LPC anschauen. Entsprechende Debug-Hardware auf JTAG-Basis ist im Atmel-\u00d6kosystem noch relativ teuer. Wohingegen es ARM-Devel Boards mit SWD Hardware und ausgef\u00fchrtem Bus auf der PIN-Leiste schon f\u00fcr 10 &#8211; 20 Eur gibt. Sowie Open-Source Tools wie <a title=\"LibSWD\" href=\"http:\/\/sourceforge.net\/apps\/trac\/libswd\" target=\"_blank\">LibSWD<\/a> und <a title=\"OpenOCD\" href=\"http:\/\/openocd.sourceforge.net\/\" target=\"_blank\">OpenOCD<\/a>.<\/p>\n<p>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.<\/p>\n<p><a href=\"http:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-628\" alt=\"lpc1114-1\" src=\"http:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-1-300x225.jpg\" width=\"300\" height=\"225\" srcset=\"https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-1-300x225.jpg 300w, https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-1-1024x768.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Auf dem Display wird die &#8220;Uptime&#8221; hochgez\u00e4hlt. Die rote LED h\u00e4ngt am PWM und wird im Loop gedimmt. Die gr\u00fcne LED blinkt, wie zu Beginn beschrieben, im Sekundentakt.<\/p>\n<p><a href=\"http:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-627\" alt=\"lpc1114-2\" src=\"http:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-2-300x225.jpg\" width=\"300\" height=\"225\" srcset=\"https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-2-300x225.jpg 300w, https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-2-1024x768.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Und hier noch ein Screenshot von der UART-Konsole:<\/p>\n<p><a href=\"http:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-uart.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-639\" alt=\"lpc1114-uart\" src=\"http:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-uart-300x300.png\" width=\"300\" height=\"300\" srcset=\"https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-uart-300x300.png 300w, https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-uart-150x150.png 150w, https:\/\/www.admindu.de\/wordpress\/wp-content\/uploads\/2013\/02\/lpc1114-uart.png 491w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erstaunt habe ich festgestellt, dass es von NXP mit dem LPC1114fn28 einen ARM Cortex M0 basierten Microcontroller im DIP28 Geh\u00e4use gibt. Da habe ich mir doch \u00fcber Mouser gleich ein paar bestellt. Es gibt viele, kommerzielle Toolchains f\u00fcr ARM. Genannt sei hier Keil, code_red oder IAR. Allerdings ist es mir, wie immer, lieber auf freie &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.admindu.de\/wordpress\/?p=629\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;NXP LPC1114fn28 &#8211; ARM im DIP&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49],"tags":[72,74,75,73,77,78,76],"class_list":["post-629","post","type-post","status-publish","format-standard","hentry","category-arm-bastelei","tag-arm","tag-cortex-m0","tag-linaro","tag-lpc1114fn28","tag-lpc21isp","tag-nxp","tag-summon"],"_links":{"self":[{"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=629"}],"version-history":[{"count":28,"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/629\/revisions"}],"predecessor-version":[{"id":846,"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/629\/revisions\/846"}],"wp:attachment":[{"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.admindu.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}