My colleagues Frank Duignan and Richard Hayes have been experimenting with an ARM Cortex M0 microcontroller in a dual inline package (DIP) which can be plugged straight into a breadboard. The chip they’re using is LPC1114FN28/102, which is made by NXP and is available for less than €2. Frank spent a bit of time working out how to program the chip using a low-cost USB-to-serial converter, so the whole thing provides a micrcontroller programming setup that’s incredibly inexpensive, but quite powerful!
Following Frank’s instructions, I’ve just got my first simple flashing LED example working on the ARM LPC1114. Here’s a couple of snaps of my breadboard circuit:
The following code (filename “main.c”) is really just a stripped back version of a more extensive example Frank sent me, so I must emphasise that all credit here goes to him.
// // main.c - Blinking LED example for ARM LPC1114 // Written by Ted Burke (based on code by Frank Duignan) // Last updated 29-11-2013 // #include "lpc111x.h" int main() { // Turn on clock for GPIO, IOCON and ADC SYSAHBCLKCTRL |= BIT6 + BIT13 + BIT16; GPIO0DIR = BIT8; // Make PIO0_8 an output GPIO0DATA = 0; // Turn off PIO0 outputs int n; while(1) { GPIO0DATA = BIT8; // Turn on PIO0_8 n=1000000; while(--n); GPIO0DATA = 0; // Turn on PIO0_8 n=1000000; while(--n); } }
I’m using the following build script (filename “build.bat”), also courtesy of Frank Duignan. Note the full path included in the linker command on line 3. If your installation directory is different from mine, you will need to modify line 3 to match your own installation folder. Note that the default installation folder may be different on other versions of Windows (note that my installation folder is under “C:\Program Files (x86)\”).
arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -g -c init.c -o init.o arm-none-eabi-gcc -mcpu=cortex-m0 -mthumb -g -c main.c -o main.o arm-none-eabi-ld init.o main.o -L "C:\Program Files (x86)\GNU Tools ARM Embedded\4.7 2013q3\lib\gcc\arm-none-eabi\4.7.4\armv6-m" -lgcc -T linker_script.ld --cref -Map main.map -nostartfiles -o main.elf objcopy -O ihex main.elf main.hex
I built my program using the gcc compiler from the GNU Tools for ARM Embedded Processors. This was the version I installed (4.7 2013q3):
During the installation, the following dialog box appears. I suggest ticking the check box to “Add path to environment variable”.
I used Flash Magic to transfer the compiled program (main.hex) to the microcontroller:
To compile the example code above, three more files are required: a header file “lpc111x.h”, a linker script “linker_script.ld”, and a C file called “init.c” which contains initialisation code for the ARM. All three files can be downloaded (along with lots of other useful info) from Frank’s web page. Alternatively, a quick way to get all three is to download this zip file (I just zipped the three files with Frank’s permission – thanks Frank!).
So, before building the program, my project folder contained the following five files:
Then I built the program by running the batch file build.bat.
After building, the project folder contained the following files:
Finally, I transferred the compiled program (“main.hex”) to the LPC1114 using FlashMagic.
Good, to begin with.
Thanks
Thanks Dsoberoi, you’re welcome!
Will ping u for some issue. I am trying to introduce same o my students.
Do, by all means! Also, please take a look at my colleague Frank Duignan’s web page:
http://eleceng.dit.ie/frank/arm/BareMetalLPC1114/index.html
Frank’s our local ARM guru and has lots of great examples online. His page is well worth a look.
Ted
I had gone through that.
I had received samples from NXP India and want same to be used by students now. Ur article has been a good help. Could not find “lpc111x.h”, a linker script “linker_script.ld”, and a C file called “init.c” in a Zipped file, in the link as indicated above. Pls. check the link.
Hi Dsoberoi,
Ok sorry, I see the problem now! The link Frank sent me for the zip file only works when I’m logged into my gmail. I’ve just checked with Frank if I could upload a new zip file containing those three files and he said that’s fine (thanks Frank!), so here’s the link:
ARM LPC111 development files from Frank Duignan (lpc111x.h, linker_script.ld, init.c)
Sorry about the confusion. I’ll update the post now with the new link.
Ted
Thanks.
Will start work, after my winter vacations. Let us see how my experiments goes ahead.
Ok, best of luck getting things working when you’re back at work. Have a happy holiday season!
Ted
Thanks. Best wishes.
Regards
Hi…I am having LPC2148 development board. I wanted to use Eclipse IDE with GCC compiler. So I using Eclipse IDE with the Sourcery CodeBench Lite (Bare Metal) . I started off with led_blinky. The build is successful with an warning:cannot find entry symbol _start. How do I solve this. The code did not blink any led.
Hi Kiran,
Sorry, but I’m not sure what the problem is there. You’re using a different ARM chip and development environment, so I don’t think I can offer much useful advice.
Ted
Being the hobbyist I am, couldn’t figure out what I was missing.
It’s the binutils I didn’t have on my windows machine, so during the translation from .elf to .hex I was getting a file not found error. Anyway, thought I’d share incase someone was as dumb as me.
Here’s a link to binutils pre-compiled for Windows.
http://sourceforge.net/projects/mingw/files/MinGW/Base/binutils/binutils-2.22/binutils-2.22-1-mingw32-bin.tar.lzma/download
Thanks Thomas!
Ted
Pingback: ARM-Cortex M0 programming with lpc1114FN28 – an overview | LE Xuan Sang – personal page
I wrote a makefile and built a better toolchain for it.
Also I ported the NXP’s header library and made it standalone and I built my own easy compiler macros for all the builtin functions.
Thanks for sharing your infos in the first place.
You’re welcome Benedikt. It definitely sounds like you’re making great progress with the NXP!
Ted