MSP-EXP430G2 Launchpad: быстрый старт в Linux

разделы: MSP430 , дата: 17 августа 2017г.

Я все-таки не удержался, и приобрел MSP430 LaunchPad. Это может показаться довольно странным решением, учитывая, что для прошивки чипов я активно использовал BSL, и вроде как LaunchPad был не очень-то необходим.

Кроме того, LaunchPad уже лет пять стоит в несколько раз больше чем 4.3USD да и цена за доставку может неприятно удивить.

Ok, мои аргументы:

  • SBW(spy-bi-wire). На плате распаян программатор MSP430UIF использующий протокол SBW. В первую очередь, я брал LaunchPad ради него. Прошивка через SBW - поддерживается всеми чипами серии MSP430x2xxx, чего не скажешь о BSL.
  • Работать с программатором MSP430UIF можно из Linux(ну наконец-то!).
  • Через SBW можно, не только прошивать, но и отлаживать прошивку. Как можно было убедиться, в Proteus почти ничего не работает, здесь же можно разобраться в работе того или иного алгоритма на конкретном чипе, а не на абстрактной симуляции. Да, и естественно, что отладка работает в том числе и в Linux.

Несмотря на то, что далее речь пойдет преимущественно о работе в среде Linux, к Windows все описанное тоже будет применимо, при условии использования Energia в версии для Windows и чего-то вроде CYGWIN. Для программирования MSP430 в Windows имеются следующие IDE: 1) Code Composer Studio aka CCStudio; 2) IAR Workbench for MSP430. На первый я даже смотреть не стал, т.к. это Eclipse который все ненавидят, а второй отказался работать с LaunchPad'ом. Нет там поддержки MSP430UIF оказывается.

    Так же в двух словах хочется пробежаться по преимуществам платформы MSP430 перед AVR:
  • Единая карта регистров. Не нужно каждый раз лезть в datasheet переписывая программу c ATtiny13 на ATtiny45 к примеру. Адреса и наименования для регистров всех моделей одной линейки одинаковы.
  • Цена. Обычно в розницу "младший" MSP430F2001, в корпусе DIP-14, стоит раза в два дешевле ATtiny13.
  • 3.3-вольтовая логика. Разрабатываемую схему легко можно будет адаптировать для stm32 при необходимости, если схема "разрастётся".
  • Простота. Для написания программы под MSP430 не требуется SPL, написанный на Си алгоритм легко перенести как на AVR, так и на STM8/STM32.
  • 16-битность. Арифметические операции с двухбайтовыми целыми числами выполняются одной инструкцией, что экономит место на flash-памяти и делает алгоритм быстрее.
  • Отсутствие фьюзов.
    Что касается самого LaunchPad, здесь нужно отметить:
  • Т.к. на плате распаян программатор MSP430UIF, то для прошивки чипам не нужен загрузчик Arduino. Можно купить чип в магазине, вставить его в панельку, запустить Energia(версия Arduino для MSP430) и сразу начать программировать. Это как если бы USBASP был распаян на плате Arduino.
  • На плате два светодиода: зеленый и красный, вместо одного красного в Arduino.
  • Светодиоды можно отключить от микроконтроллера сняв расположенные рядом джампики.
  • Кроме кнопки RESET, имеется еще одна кнопка на P1.3.
  • На плате имеется датчик температуры.
  • Кроме программатора, на плате распаян чип USB-TTL конвертера.
  • Часть программатора соединяется с частью чипа через джампики. Их можно вообще снять, и подключить шлейф для прошивки или отладки микроконтроллера распаяного на другой плате. Вообще же, это называется eZ430 разъем.
  • На оборотной стороне платы имеются резиночки, предотвращающие соприкосновение контактов платы с поверхностью стола.

Часто можно встретить комментарии, что MSP430 чипы бедны на периферию. Мощные чипы конечно у TI конечно же есть, но здесь в цене начинает сильно выигрывать продукция фирмы STM. Однако STM не делает чипы в DIP корпусе, и STM8 не имеет поддержки в Linux, поэтому "младшие" MPS430 для замены ATtiny13/ATtiny2313 мне кажутся наиболее интересными. Кроме того они более "прокачены" чем ATtiny. Например MSP430F2002 имеет на борту аппаратный SPI и I2C, а MSP430F2003 имеет 16-битный сигма-дельта АЦП(!). Такого вообще нет ни у AVR ни у STM.

Ок, пора за дело.

Содержание:

  1. Energia (Arduino для MSP430)
  2. MSP430F2001
  3. MSPDEBUG
  4. Отладка с помощью GDB

1) Energia (Arduino для MSP430)

Launchpad имеет разные ревизии, они отличаются eZ430 разъемом и набором чипов. В первые ревизии в комплекте поставлялись чипы MSP430G2211 и MSP430G2231 c двумя кБ flash-памяти, без аппаратного UART интерфейса и в 14-пиновом корпусе. Моя версия LaunchPad'а имеет ревизию 1.5, в комплект которой входят чипы: MSP430G2553 и MSP430G2452. Так же в руководстве пользователя, пункт 1.4, сказано что с кнопки на P1.3 был убран подтягивающий резистор R34 и конденсатор C24, для уменьшения энергопотребления. Не знаю как они сделали кнопку без подтягивающего резистора, ну да ладно.

Принципиальную схему и печатную плату можно посмотреть в вышеупомянутом руководстве, сейчас нас будет интересовать распиновка для имеющихся чипов. Их можно найти например, здесь:

В MSP430G2452 нет аппаратного UART, и на картинке видно, что нужно переставить джампики, чтобы использовать программный UART.

Итак, я думаю начнем с Arduino-подобной Energia, а затем переключимся на чистый Си.

На сайте Energia доступна для скачивания последняя версия E18. Я буду использовать версию E14, т.к. E18 заточена на новые версии Launchpad'ов, вроде: MSP-EXP430FR4133 или MSP-EXP432P401R, и если поддержка MSP430G2553 там еще осталась, то MSP430G2452 "выпилили". В версии для Windows Energia должна поставляться с драйверами(я не проверял), в Linux драйвера не нужны, зато нужно добавить правила udev в /etc/udev/rules.d/, что бы можно было прошивать микроконтроллер из под непривилегированного пользователя. После чего следует перезагрузить udev:

 # udevadm control --reload-rules && udevadm trigger

При подключении Launchpad к компьютеру в dmesg появляется такой лог:

[50610.807682] usb 1-1.1: new full-speed USB device number 11 using ehci-pci
[50611.066905] usb 1-1.1: New USB device found, idVendor=0451, idProduct=f432
[50611.066914] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[50611.066920] usb 1-1.1: Product: Texas Instruments MSP-FET430UIF
[50611.066924] usb 1-1.1: Manufacturer: Texas Instruments
[50611.066928] usb 1-1.1: SerialNumber: 36FF49ABB1CF363D
[50621.190032] hid-generic 0003:0451:F432.0009: usb_submit_urb(ctrl) failed: -1
[50621.190043] hid-generic 0003:0451:F432.0009: timeout initializing reports
[50621.190274] hid-generic 0003:0451:F432.0009: hiddev0,hidraw4: USB HID v1.01 Device [Texas Instruments Texas Instruments MSP-FET430UIF] on usb-0000:00:02.1-1.1/input1
[50621.301136] cdc_acm 1-1.1:1.0: No union descriptor, testing for castrated device
[50621.301185] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
[50621.303129] usbcore: registered new interface driver cdc_acm
[50621.303136] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

Новое устройство должно быть видно через lsusb:

# lsusb |grep 0451:f432
Bus 001 Device 011: ID 0451:f432 Texas Instruments, Inc. eZ430 Development Tool

После подключения у нас появляется последовательный порт:

# ls -l /dev/ttyA*
crw-rw-rw- 1 root dialout 166, 0 Aug 16 14:16 /dev/ttyACM0

Найдя в примерах Blink, в поддерживаемых чипах следует выбрать MSP430G2553:

Serial Port и "Programmer(в E18 версии) не имеют значения.

При клике мышкой на иконку загрузки скетча(стрелочка вправо), в случае успешной компиляции и загрузки, в служебном окне появится такой лог:

Можно раскомментировать строку #define LED GREEN_LED, тогда вместо красного светодиода будет мигать зеленый.

Как видно из лога, размер прошивки составил 816 байт, что не сильно меньше чем на 8-битном ATmega328. Даже если по мотивам, составить программу на чистом Си, то размер прошивки все равно будет занимать 434 байт.

void delay_ms(unsigned int ms )
{
    unsigned int i;
    for (i = 0; i<= ms; i++)
        __delay_cycles(16000);
}

void setup() {
    WDTCTL = WDTPW | WDTHOLD;
    P1DIR = 0x01;
}

void loop() {
    P1OUT ^=BIT0;
    delay_ms(1000);
}

Теперь посмотрим что там с UART, видоизменим немного Blink и переставим джампики как на картинке выше:

Размер прошивки сразу вырос до 2454 байт.

Теперь попробуем залить этот скетч в MSP430G2452, не забыв переставить джампики обрано:

Как ни странно, пошивка с программным UART'ом по размеру оказалась даже меньше чем для аппаратного UART в MSP430G2553.

2) MSP430F2001

Я уже упоминал, что меня более интересуют бюджетные MSP430F20xx. Добавить сходу поддержку для этих чипов в Energia по примеру MSP430G2453 у меня не получилось, зато можно воспользоваться единой картой регистров у чипов серии MSP430x2xxxx из залить в, скажем, MSP430F2001 прошивку от MSP430G2231. Прошивка должна быть в пределах одного килобайта конечно же, т.е. вариант с программным UART отпадает.

По крайней мере Blink, у меня заработал. Как можно видеть из лога, программатор определил чип как MSP430F2013, хотя фактически в панельку был установлен MSP430F2001-й чип. Однако, несмотря на успех прошивки, ее размер в 764 байт, практически не оставляет выбора.

Откроем окно настроек через меню->File->Preferences, и поставим галочку на чекбоксе Show verbose output during: upload:

После чего попробуем еще раз прошить микроконтроллер:

Здесь нам нужно найти команду для прошивки микроконтроллера, и как можно видеть, прошиваются они с помощью mspdebug.

/opt/energia/hardware/tools/msp430/bin/mspdebug rf2500 --force-reset prog /tmp/build7959367529642479031.tmp//Blink.cpp.hex

3) MSPDEBUG

Как можно догадаться из названия утилиты, mspdebug предназначена для отладки микроконтроллера, и прошивка это лишь одна из его функций.

Можно воспользоваться версией которая входит в состав Energia, а можно самостоятельно собрать актуальную версию mspdebug. Страница проекта https://github.com/dlbeer/mspdebug

Начинаем вбивать в консоль:

$ git clone https://github.com/dlbeer/mspdebug.git
$ cd mspdebug
$ make

Моим gcc-7.1, собралось без проблем:

palladium:~/mspdebug: ls -l
итого 2484
-rw-r--r-- 1 flanker users    2717 авг 17 07:33 AUTHORS
-rw-r--r-- 1 flanker users     850 авг 17 07:33 BSDmakefile
-rw-r--r-- 1 flanker users   15237 авг 17 07:33 COPYING
-rw-r--r-- 1 flanker users    8490 авг 17 07:33 ChangeLog
-rw-r--r-- 1 flanker users    5638 авг 17 07:33 EmbeddedMode.txt
-rw-r--r-- 1 flanker users    5908 авг 17 07:33 Makefile
-rw-r--r-- 1 flanker users    1896 авг 17 07:33 README
-rw-r--r-- 1 flanker users 1472245 авг 17 07:33 chipinfo.db
drwxr-xr-x 2 flanker users    1720 авг 17 07:34 drivers
drwxr-xr-x 2 flanker users     480 авг 17 07:34 formats
-rwxr-xr-x 1 flanker users  924616 авг 17 07:34 mspdebug
-rw-r--r-- 1 flanker users   38491 авг 17 07:33 mspdebug.man
drwxr-xr-x 2 flanker users     500 авг 17 07:34 simio
-rw-r--r-- 1 flanker users   37874 авг 17 07:33 ti_3410.fw.ihex
-rw-r--r-- 1 flanker users     720 авг 17 07:33 ti_3410.fw.txt
drwxr-xr-x 2 flanker users     520 авг 17 07:34 transport
drwxr-xr-x 2 flanker users     900 авг 17 07:34 ui
drwxr-xr-x 2 flanker users    1340 авг 17 07:34 util
palladium:~/mspdebug: ./mspdebug --version
MSPDebug version 0.25 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2017 Daniel Beer 
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Chip info database from MSP430.dll v3.3.1.4 Copyright (C) 2013 TI, Inc.

Кидаем его в local и проверяем:

palladium:~/mspdebug: mv ./mspdebug /usr/local/bin/
'./mspdebug' -> '/usr/local/bin/mspdebug'
palladium:~/mspdebug: cd
palladium:~: mspdebug -version
You need to specify a driver. Try --help for a list.
palladium:~: mspdebug --version
MSPDebug version 0.25 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2017 Daniel Beer 
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Chip info database from MSP430.dll v3.3.1.4 Copyright (C) 2013 TI, Inc.

Все Ок. Теперь создадим простейший проект. Для этого: а)создадим папку проекта:

$ mkdir blink430

б) добавим туда файл main.c

#include <msp430f2001.h>
#include <sys/types.h>
#define LED BIT0

void delay_ms(unsigned int ms )
{
    unsigned int i;
    for (i = 0; i<= ms; i++)
        __delay_cycles(1000);
}

int main(void) {
    // turn-off watchdog
    WDTCTL = WDTPW | WDTHOLD;

     //  setup DCO
    DCOCTL=CALDCO_1MHZ;
    BCSCTL1=CALBC1_1MHZ;

    P1DIR |= LED;

    for (;;)
    {
        P1OUT ^=BIT0;
        delay_ms(1000);
        }

    return 0;
}

в) добавим Макеfile

MCU=msp430f2001
OBJCOPY=msp430-objcopy
CC=msp430-gcc
CFLAGS=-mmcu=$(MCU) -DHARDWARE -ggdb -Os  -Wall
LDFLAGS=-mmcu=$(MCU)
OBJ=main.o
TARGET=blink
.PHONY: all clean

%.o:	%.c
	$(CC)  -c -o $@ $< $(CFLAGS)
all:	$(OBJ)
	$(CC) $(LDFLAGS) -o $(TARGET).elf  $(OBJ)
	$(OBJCOPY) -O ihex $(TARGET).elf $(TARGET).hex
install:
	@mspdebug -n rf2500 "prog $(TARGET).elf"
clean:
	@rm -v *.elf *.hex $(OBJ)

Осталось только компилятор из /opt/energia/hardware/tools/msp430/ скопировать /usr/local, и можно начать программировать на Си. Правда при копировании компилятора затрется ранее переброшенный туда mspdebug, т.к. energia имеет свою версию mspdebug.

Вбиваем теперь в папке проекта команду make && make install, и если в все было сделано правильно, то прошивка должна скомпилироваться и залиться в микроконтроллер:

palladium:~/blink430: make && make install
msp430-gcc  -c -o main.o main.c -mmcu=msp430f2001 -DHARDWARE -ggdb -Os  -Wall
msp430-gcc -mmcu=msp430f2001 -o blink.elf  main.o
msp430-objcopy -O ihex blink.elf blink.hex
MSPDebug version 0.25 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2017 Daniel Beer <dlbeer@gmail.com>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Chip info database from MSP430.dll v3.3.1.4 Copyright (C) 2013 TI, Inc.

Trying to open interface 1 on 015
rf2500: warning: can't detach kernel driver: No such file or directory
Initializing FET...
FET protocol version is 30394216
Set Vcc: 3000 mV
Configured for Spy-Bi-Wire
fet: FET returned error code 4 (Could not find device or device not supported)
fet: command C_IDENT1 failed
Using Olimex identification procedure
Device ID: 0xf201
  Code start address: 0xf800
  Code size         : 2048 byte = 2 kb
  RAM  start address: 0x200
  RAM  end   address: 0x27f
  RAM  size         : 128 byte = 0 kb
Device: F20x1_G2x0x_G2x1x
Number of breakpoints: 2
fet: FET returned NAK
warning: device does not support power profiling
Chip ID data:
  ver_id:         01f2
  ver_sub_id:     0000
  revision:       10
  fab:            40
  self:           0000
  config:         01
  fuses:          00
Device: F20x1_G2x0x_G2x1x
Erasing...
Programming...
Writing  132 bytes at fc00 [section: .text]...
Writing   32 bytes at ffe0 [section: .vectors]...
Done, 164 bytes total

164 байта - совсем другое дело!

Итак, с прошивкой разобрались, осталось разобраться с отладкой.

4) Отладка с помощью GDB

Mspdebug может служить gdb-сервером, если его запустить с опцией: mspdebug rf2500 gdb

palladium:~/blink430: mspdebug rf2500 gdb
MSPDebug version 0.25 - debugging tool for MSP430 MCUs
Copyright (C) 2009-2017 Daniel Beer 
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Chip info database from MSP430.dll v3.3.1.4 Copyright (C) 2013 TI, Inc.

Trying to open interface 1 on 020
Initializing FET...
FET protocol version is 30394216
Set Vcc: 3000 mV
Configured for Spy-Bi-Wire
Device ID: 0xf201
  Code start address: 0xf800
  Code size         : 2048 byte = 2 kb
  RAM  start address: 0x200
  RAM  end   address: 0x27f
  RAM  size         : 128 byte = 0 kb
Device: F20x1_G2x0x_G2x1x
Number of breakpoints: 2
fet: FET returned NAK
warning: device does not support power profiling
Chip ID data:
  ver_id:         01f2
  ver_sub_id:     0000
  revision:       10
  fab:            40
  self:           0000
  config:         01
  fuses:          00
Device: F20x1_G2x0x_G2x1x
Bound to port 2000. Now waiting for connection...

Перед дальнейшими действиями лучше будет проштудировать материал из этого поста Отладка прошивки в Linux с помощью эмулятора SimulAVR и отладчика AVR-GDB. Чтение из Flash памяти AVR

Итак, запускаем msp430-gdb:

palladium:~/blink430: msp430-gdb ./blink.elf
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=msp430".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/flanker/blink/blink.elf...done.
(gdb) 

Обращаю внимание, что прошивка должна быть скомпилирована с опцией -ggdb, она прописана в Makefile.

Подключаемся к серверу:

(gdb) target remote localhost:2000
Remote debugging using localhost:2000
_reset_vector__ () at ../../../gcc/gcc/config/msp430/crt0.S:105
105     ../../../gcc/gcc/config/msp430/crt0.S: Нет такого файла или каталога.
        in ../../../gcc/gcc/config/msp430/crt0.S

загружаем прошивку, ставим break, и запускаем микроконтроллер на отладку:

(gdb) load
Loading section .text, size 0x84 lma 0xfc00
Loading section .vectors, size 0x20 lma 0xffe0
Start address 0xfc00, load size 164
Transfer rate: 691 bytes/sec, 82 bytes/write.
(gdb) break main
Breakpoint 1 at 0xfc44: file main.c, line 17.
(gdb) continue
Continuing.

Breakpoint 1, main () at main.c:17
17              DCOCTL=CALDCO_1MHZ;
(gdb) 

Осматриваемся:

(gdb) disass
Dump of assembler code for function main:
   0x0000fc3e <+0>:     mov     #23168, &0x0120 ;#0x5a80
=> 0x0000fc44 <+6>:     mov.b   &0x10fe,&0x0056 
   0x0000fc4a <+12>:    mov.b   &0x10ff,&0x0057 
   0x0000fc50 <+18>:    bis.b   #1,     &0x0022 ;r3 As==01
   0x0000fc54 <+22>:    xor.b   #1,     &0x0021 ;r3 As==01
   0x0000fc58 <+26>:    mov     #1000,  r15     ;#0x03e8
   0x0000fc5c <+30>:    call    #0xfc6c 
   0x0000fc60 <+34>:    jmp     $-12            ;abs 0xfc54
End of assembler dump.
(gdb) list
12      int main(void) {
13              // turn-off watchdog
14              WDTCTL = WDTPW | WDTHOLD;
15
16               //  setup DCO
17              DCOCTL=CALDCO_1MHZ;
18              BCSCTL1=CALBC1_1MHZ;
19
20              P1DIR |= LED;
21
(gdb) info registers
pc/r0: fc44  sp/r1: 0280  sr/r2: 0003     r3: 0000  
fp/r4: 0f57     r5: 5a08     r6: f57d     r7: 7d7f  
   r8: d779     r9: dcc9    r10: c6ed    r11: fbcb  
  r12: 4eb9    r13: 006c    r14: 0080    r15: 0000  
(gdb) 

Адреса регистров ввода-вывода(РВВ) для семейства MSP430x2xxx можно посмотреть в руководстве пользователя (перевод на русский язык), таблица 8.1, страница 289. P1DIR располагается по адресу 0x0022, а P1OUT по адресу 0x0021.

Прогоним рабочий цикл:

 (gdb) x/xb 0x0021
0x21:   0xff
(gdb) n
18              BCSCTL1=CALBC1_1MHZ;
(gdb) n
20              P1DIR |= LED;
(gdb) x/xb 0x0022
0x22:   0x00
(gdb) n
24                      P1OUT ^=BIT0;
(gdb) x/xb 0x0022
0x22:   0x01
(gdb) x/xb 0x0021
0x21:   0xff
(gdb) n
25                      delay_ms(1000);
(gdb) x/xb 0x0021
0x21:   0xfe
(gdb)

После команды команды P1DIR|=LED; светодиод загорается т.к. в P1OUT изначально был забит единицами, а после команды P1OUT^=LED; светодиод гаснет.

На этом я думаю материала для быстрого старта достаточно, в следующий раз я планирую вернуться к теме I2C, уже ,как говорится, во всеоружии.