The TI MSP430 are ultra-low-power 16-bit RISC microcontrollers. Since a while, TI sells eval kits called "LaunchPad" for $ 4.30 for their "value line" (i.e. cheap) MSP430 products. These have a debugging and programming interface (USB).
To use the LaunchPad with Debian GNU/Linux (sid, as of 2012-10-04), some packages have to be installed
aptitude install gcc-msp430 gdb-msp430 \
msp430-libc msp430mcu mspdebug binutils-msp430
Debugging
mspdebug supports the LaunchPad for programming and debugging using its rf2500
driver (which is also used for the eZ430-RF2500 and Chronos watch). It is started with
mspdebug rf2500
This program offers a powerful command line interface for memory dump, programming and debugging. It also has a GDB remote stub, so you can debug your programs with GDB. Connecting via the debugger stops the currently running program (presumably the preloaded demo program). To continue execution, type
run
and press ^C to stop again. This will show the current register values and a short disassembly.
(mspdebug) run
Running. Press Ctrl+C to interrupt...
^C
( PC: 0fc86) ( R4: 00282) ( R8: 0ab57) (R12: 00000)
( SP: 0027a) ( R5: 05a08) ( R9: 0fb5b) (R13: 0fd90)
( SR: 000dd) ( R6: 0adff) (R10: 0aee2) (R14: 00000)
( R3: 00000) ( R7: 0fa3f) (R11: 0bf73) (R15: 0ffff)
0xfc86:
0fc86: 30 41 RET
0fc88: f2 40 0a 00 00 02 MOV.B #0x000a, &0x0200
0fc8e: 03 3c JMP 0xfc96
0fc90: 92 42 70 01 72 01 MOV &0x0170, &0x0172
You can switch on beautifully colorized output:
opt color true
My LaunchPad came with a MSP430G2231. It seems that newer LaunchPads come with a different device. Features of the MSP430G2231:
- 1.8-3.6V
- 16MHz
- 2kB Flash, 128B RAM
- 10-Bit ADC, 8 IOs, WDT, Timer, USI (SPI, I2C)
Memory map:
F800h-FFFFh
: Flash, 4 segments of 512 bytes
1000h-10FFh
: Information Memory, 4 segments of 64 bytes, stores calibration values!
0200h-027Fh
: RAM
0000h-01FFh
: SFR, Peripherals
FFC0h-FFFFh
: Interrupt Vectors, Reset = FFFEh
The LaunchPad has a red LED (connected to P1.0) and a green LED (P1.6) and a button (P1.3).
After reset, the 16-bit value at FFFEh is read. This is used as initial value of the PC register to start execution. Let's examine the boot process!
(mspdebug) md 0xFFFE 2
0fffe: c2 fc |.. |
(mspdebug) dis 0xFCC2
0xfcc2:
0fcc2: 31 40 7e 02 MOV #0x027e, SP
0fcc6: b2 40 6e fd 36 02 MOV #0xfd6e, &0x0236
0fccc: b2 40 6e fd 38 02 MOV #0xfd6e, &0x0238
0fcd2: b0 12 66 fd CALL #0xfd66
0fcd6: 0c 93 TST R12
0fcd8: 02 24 JZ 0xfcde
0fcda: b0 12 8e fb CALL #0xfb8e
0fcde: 0c 43 CLR R12
0fce0: b0 12 00 f8 CALL #0xf800
...
Before our own program is programmed, we should save the Flash memory content. The following command will save 2048 bytes, starting at F800h, to the Intel HEX file MSP-EXP430G2-2231.ihx.
hexout 0xF800 2048 MSP-EXP430G2-2231.ihx
During playing, I had an accident, inadvertently typing "mw 0xFFFE 2
" instead of "md 0xFFFE 2
" which overwrites the value C2h at FFFEh with 02h. It was not possible to correct this with "mw 0xFFFE 0xC2
" because the Flash is initialized to all logic 1s and can be set bit-wise to 0. Writing the memory to an Intel HEX file, correcting the value at FFFEh to C2h (and correcting the checksum), and reprogramming the device with "prog MSP-EXP430G2-2231.ihx
" restored the old contents. BTW: The "prog
" command complained for the invalid checksum and also said which value it expected. So no hand calculation of the value was necessary. :-)
Compiling
As first example program, let's use the blinking LED proposed by TI at http://processors.wiki.ti.com/index.php/Blink_your_first_LED (you have to scroll down a bit). Copy-paste the example program to a file called blink.c
and change the included .h-file to the device you own. Then compile using
msp430-gcc -mmcu=msp430g2231 -o blink.elf blink.c
The result can be examined (and disassembled) using
msp430-objdump -d blink.elf
Back in the mspdebug commmand line, program the new firmware to the MCU and start it:
prog blink.elf
run
Nice blinking should be visible.
MSP430 FRAM Devices
The MSP-EXP430FR5739 Experimenter Board with an MSP430 FRAM MCU can also be programmed. It comes with an MSP430FR5739 soldered to the board. Its features are
- 2-3.6V
- 24MHz
- 16kB FRAM, 1kB SRAM
- 10-BIT ADC, 32 IOs, Comparator, Timer, USCI (UART, IrDA, SPI, I2C)
The memory map is as follows:
C200h-FFFFh
: FRAM
1C00h-1FFFh
: RAM
1A00h-1A7Fh
: Device Descriptor Info (FRAM)
1800h-19FFh
: Information memory (partly mirrored, FRAM)
1000h-17FFh
: Bootstrap loader (ROM)
0000h-0FFFh
: SFRs, Peripherals
FF80h-FFFFh
: Interrupt Vectors, Reset = FFFEh
The MSP-EXP430FR5739 Experimenter Board is a bit more expensive than the LaunchPad (but has a similar form factor). It comes with 8 blue LEDs (everything needs blue LEDs!), an accelerometer, an NTC, two buttons, ... These are connected as follows:
- LED0..3: PJ.0 .. PJ.3
- LED4..8: P3.4 .. P3.7
- S1: P4.0
- S2: P4.1
- Accel X: P3.0/A12
- Accel Y: P3.1/A13
Simple alternate blink program
#include <msp430fr5739.h>
unsigned int i = 0;
void main(void) {
// Stop watchdog timer.
WDTCTL = WDTPW + WDTHOLD;
// enable PJ.0 and PJ.1 as outputs
PJDIR |= 0x01 | 0x02;
// switch on first LED and switch off second LED
PJOUT = (PJOUT & ~(0x01 | 0x02)) | 0x01;
// main loop
for (;;) {
// toggle LEDs
PJOUT ^= 0x01 | 0x02;
// delay
for(i=0; i< 20000; i++);
}
}
Save this to a file blink-fram.c
and compile with
msp430-gcc -mmcu=msp430fr5739 -o blink-fram.elf blink-fram.c
Important: To download, the mspdebug command "prog
" cannot be used, because it issues a Flash erase command. The FRAM devices don't need an erase, because it can be written like normal RAM. Therefore program the device with the "load
" command. But first, the FRAM contents should be backuped:
hexout 0xC200 0x3E00 MSP-EXP430FR5739-Demo.ihx
load blink-fram.elf
run
And again, nice blue blinking should be visible
This was only a very coarse run through the tools, but the usage is really astonishing simple, yet powerful. More to come (GDB, Makefile, Eclipse, ...)