Trabalhando com o MSP430 no Linux
- por Sergio Prado
O MSP430 é um microcontrolador RISC de 16 bits e arquitetura von-Neumann da Texas Instruments, com foco em baixo custo e baixo consumo de energia. Dependendo do modo de economia de energia da CPU, o chip pode chegar num consumo tão baixo quanto 100nA!
A família MSP430 é composta por mais de 200 microcontroladores com diferentes configurações de periféricos, CPU (8MHz à 25MHz), RAM (128B à 18KB) e flash (500B à 256KB).
Dois produtos conhecidos da Texas que utilizam o MSP430 são o relógio eZ430-Chronos e a famosa placa MSP430 Launchpad.
A Launchpad é um kit de desenvolvimento fácil de usar e baratíssimo, custando apenas $4.30 doletas.
Pela figura acima, podemos ver que a placa tem um soquete DIP de 20 pinos possibilitando usar qualquer microcontrolador MSP430 da série “Value Line”. Na parte de cima da placa (na imagem acima) temos um outro MSP430, usado apenas como ferramenta de gravação e debugging através de uma interface USB, facilitando bastante o desenvolvimento com esta plataforma.
AS FERRAMENTAS DE DESENVOLVIMENTO
E por falar em facilidades, me surpreendi com a disponibilidade de ferramentas open source para trabalhar com esta plataforma, do compilador à ferramenta de gravação e debugging:
- gcc-msp430: Porte do gcc (GNU C compiler) para o MSP430.
- binutils-msp430: Ferramentas de manipulação de binários (linker, assembler, etc) para o MSP430.
- msp430mcu: Arquivos de cabeçalho, spec files e scripts do linker.
- msp430-libc: Biblioteca C padrão.
- gdb-msp430: GNU Debugger para o MSP430
- mspdebug: Ferramenta de gravação e debugging do MSP430.
Estas ferramentas fazem parte do projeto mspgcc, e já estão empacotadas para algumas distribuições GNU/Linux, incluindo o Ubuntu e o Fedora.
E como minha máquina de desenvolvimento é um Ubuntu 12.04, o procedimento de instalação via gerenciador de pacotes é bem simples:
$ sudo apt-get install msp430-libc mspdebug msp430mcu binutils-msp430 gcc-msp430 gdb-msp430 |
Depois de executar o comando acima, você pode verificar se o toolchain foi instalado com sucesso:
$ msp430-gcc --version msp430-gcc (GCC) 4.6.3 20120301 (mspgcc LTS 20120406 unpatched) Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
Durante a instalação, tive problemas com o pacote gdb-msp430. Descobri que existe um bug na instalação deste pacote no Ubuntu (vide bug 860045).
After this operation, 7,520 kB of additional disk space will be used. (Reading database ... 340210 files and directories currently installed.) Unpacking gdb-msp430 (from .../gdb-msp430_7.2~mspgcc-7.2-20110612-1ubuntu1_amd64.deb) ... dpkg: error processing /var/cache/apt/archives/gdb-msp430_7.2~mspgcc-7.2-20110612-1ubuntu1_amd64.deb (--unpack): trying to overwrite '/usr/share/gdb/python/gdb/__init__.py', which is also in package gdb 7.4-2012.04-0ubuntu2 Processing triggers for man-db ... Errors were encountered while processing: /var/cache/apt/archives/gdb-msp430_7.2~mspgcc-7.2-20110612-1ubuntu1_amd64.deb |
Se você tiver este mesmo problema, basta desinstalar o gdb nativo (pelo menos provisoriamente) para instalar o gdb do MSP430:
$ sudo apt-get remove gdb $ sudo apt-get install gdb-msp430 |
Se a versão que estiver empacotada para a sua distribuição for muito antiga, você pode compilar a última versão das ferramentas seguindo o roteiro neste link.
Para outros procedimentos de instalação, acesse a página wiki do projeto.
HELLO WORLD
Agora é o momento mais esperado de qualquer introdução à uma plataforma de desenvolvimento embarcada: o famoso pisca-led! No nosso caso, será um pisca-led duplo. Com o seu editor de textos favorito, crie o arquivo blink.c e implemente a aplicação:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <msp430g2231.h> #define LED1_MASK 0x01 #define LED2_MASK 0x40 int main(void) { volatile int i = 0; /* stop watchdog timer */ WDTCTL = WDTPW | WDTHOLD; /* set P1 direction */ P1DIR = LED1_MASK | LED2_MASK; /* leds off */ P1OUT = 0x00; for (;;) { /* toggle leds */ P1OUT ^= (LED1_MASK | LED2_MASK); /* delay */ for (i = 0; i < 10000; i++); } } |
Para compilar, basta passar o modelo da CPU (mude de acordo com o chip que você esta usando):
$ msp430-gcc -Os -mmcu=msp430g2231 blink.c -o blink.elf |
Agora conecte a Launchpad na USB da sua máquina de desenvolvimento. Deverá ser criado um dispositivo do tipo ttyACM, que você consegue visualizar nas mensagens de log do kernel:
$ dmesg ... [25315.096671] usb 2-1.2.3: new full-speed USB device number 11 using ehci_hcd [25325.260273] generic-usb 0003:0451:F432.0007: usb_submit_urb(ctrl) failed [25325.260338] generic-usb 0003:0451:F432.0007: timeout initializing reports [25325.260895] generic-usb 0003:0451:F432.0007: hiddev0,hidraw4: USB HID v1.01 Device [Texas Instruments Texas Instruments MSP-FET430UIF] on usb-0000:00:1d.0-1.2.3/input1 [25325.404540] cdc_acm 2-1.2.3:1.0: This device cannot do calls on its own. It is not a modem. [25325.404545] cdc_acm 2-1.2.3:1.0: No union descriptor, testing for castrated device [25325.404572] cdc_acm 2-1.2.3:1.0: ttyACM0: USB ACM device [25325.406877] usbcore: registered new interface driver cdc_acm [25325.406879] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters |
Para gravar na Launchpad basta chamar a ferramenta mspdebug:
$ sudo mspdebug rf2500 |
Primeiro programe o arquivo elf gerado:
(mspdebug) prog blink.elf |
E depois execute a aplicação:
(mspdebug) run |
Fácil, não?
Perceba aqui um detalhe. Em nenhum momento criamos o linker script. O processo de compilação gerou um arquivo do tipo ELF, um padrão para arquivos executáveis. O compilador, de acordo com a opção “-mmcu“, já organizou o código (seções text, data, bss) de forma que a ferramenta mspdebug possa interpretar estas informações, para então endereçar e gravar corretamente os dados na flash.
A ferramenta mspdebug é repleta de opções. Para uma lista completa das funcionalidades desta ferramenta, acesse sua página de manual:
$ man mspdebug |
DEBUGANDO
Para debugar, primeiro inicie o stub remoto do gdb. Este stub será a interface entre o gdb client e a interface de comunicação com o chip.
$ sudo mspdebug rf2500 "gdb" ... Bound to port 2000. Now waiting for connection... |
Abra um outro shell e inicie o gdb client:
$ msp430-gdb blink.elf |
Dentro do GDB client, conecte-se no stub para iniciar a seção de debugging:
(gdb) target remote localhost:2000 Remote debugging using localhost:2000 _reset_vector__ () at ../../gcc-4.6.3/gcc/config/msp430/crt0.S:105 105 mov.b &__WDTCTL, r5 |
Prato cheio para hackear um MSP430!
É sempre bom expandir os horizontes, e o mspgcc é mais uma opção para aqueles que querem usar ferramentas livres e gratuitas.
Happy coding!
Sergio Prado