Я все-таки не удержался, и приобрел MSP430 LaunchPad. Это может показаться довольно странным решением, учитывая, что для прошивки чипов я активно использовал BSL, и вроде как LaunchPad был не очень-то необходим.
Кроме того, LaunchPad уже лет пять стоит в несколько раз больше чем 4.3USD да и цена за доставку может неприятно удивить.
Ok, мои аргументы:
Несмотря на то, что далее речь пойдет преимущественно о работе в среде Linux, к Windows все описанное тоже будет применимо, при условии использования Energia в версии для Windows и чего-то вроде CYGWIN. Для программирования MSP430 в Windows имеются следующие IDE: 1) Code Composer Studio aka CCStudio; 2) IAR Workbench for MSP430. На первый я даже смотреть не стал, т.к. это Eclipse который все ненавидят, а второй отказался работать с LaunchPad'ом. Нет там поддержки MSP430UIF оказывается.
Часто можно встретить комментарии, что MSP430 чипы бедны на периферию. Мощные чипы конечно у TI конечно же есть, но здесь в цене начинает сильно выигрывать продукция фирмы STM. Однако STM не делает чипы в DIP корпусе, и STM8 не имеет поддержки в Linux, поэтому "младшие" MPS430 для замены ATtiny13/ATtiny2313 мне кажутся наиболее интересными. Кроме того они более "прокачены" чем ATtiny. Например MSP430F2002 имеет на борту аппаратный SPI и I2C, а MSP430F2003 имеет 16-битный сигма-дельта АЦП(!). Такого вообще нет ни у AVR ни у STM.
Ок, пора за дело.
Содержание:
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.
Я уже упоминал, что меня более интересуют бюджетные 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
Как можно догадаться из названия утилиты, 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 BeerThis 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 BeerThis 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 байта - совсем другое дело!
Итак, с прошивкой разобрались, осталось разобраться с отладкой.
Mspdebug может служить gdb-сервером, если его запустить с опцией: mspdebug rf2500 gdb
palladium:~/blink430: mspdebug rf2500 gdb MSPDebug version 0.25 - debugging tool for MSP430 MCUs Copyright (C) 2009-2017 Daniel BeerThis 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, уже ,как говорится, во всеоружии.