MSP430FR2433 Launchpad: быcтрый старт

разделы: MSP430 , дата: 6 февраля 2018г.

Под новый год компания Texas Instruments удачно напомнила о себе устроив распродажу своих новых Launchpad'ов по символической цене в 4.30$. В сочетании с бесплатной доставкой занявшей, в моем случае, всего девять дней со склада в США, получился вполне себе такой приятный подарок. Для сравнения, на "Мышаке" Launchpad MSP430FR2433 стоит сейчас 18$ со сроком доставки в три недели. Так что, как говорится, приобретайте у производителя.

Launchpad MSP430FR2433 занял меня на пару дней, но вот только сейчас дошли руки написать об этой новинке. Я хотел бы рассказать, что это вообще за плата такая, для чего ее можно использовать(как оказалось не только для программирования), и как ее программировать. Я буду говорить в основном об Linux, так как именно здесь кроется большинство проблем. О Windows буду говорить по необходимости, там все делается по аналогии, т.к. весь используемый софт является кроссплатформенным. Так же, я иногда буду сравнивать этот Launchpad с более ранним MSP-EXP430G2.

    Содержание статьи:
  1. Краткий обзор оценочного модуля MSP430FR2433 Lanchpad;
  2. Energia IDE & Linux, или как убить Launchpad за 5 секунд;
  3. Работа с Energia IDE и MSP430FR2433 из под виртуальной машины с Windows 7;
  4. Компиляция тестовой прошивки;
  5. Флешер MSPFlasher;
  6. Использование MSPDebug в качестве флешера;
  7. Отладка Launchpad MSP430FR2433 через MSPDebug;
  8. Code Composer Studio и инструмент EnergyTrace;
  9. CCS Cloud - среда программирования на облаке;

1) Краткий обзор оценочного модуля MSP430FR2433 Lanchpad

Launchpad MSP430FR2433 можно мысленно разделить на три отдельных модуля: модуль программатора eZ-FET, модуль подсчета энергопотребления EnergyTrace, модуль с микроконтроллером MSP430FR2433.

    Микроконтроллер, MSP430FR2433 относится к семейству свехдешевых чипов Value Line Sensing MSP430FR2xxx/MSP430FR4xxx, и имеет следующие характеристики:
  1. 16-битная RISC архитектура;
  2. Рабочая частота до 16 МГц включительно;
  3. Диапазон напряжений питания от 1.8 до 3.6 Вольт;
  4. 8-канальный 10-битный АЦП;
  5. Внутренний источник опорного напряжения на 1.5 Вольт;
  6. Максимальная частота преобразований АЦП - 200 kSPS;
  7. Два расширенных USCI модуля: eUSCI_A c поддержкой режимов UART, IrDA и SPI и один eUSCI_B с поддержкой режимов: SPI, I2C;
  8. Всего четыре таймера:
  9. Два 16-битных трех-канальных таймера Timer_A3;
  10. Два 16-битных двух-канальных таймеров Timer_A2;
  11. Так же имеется еще один 16-битный таймер для RTC;
  12. Аппаратное вычисление 16-битного циклического избыточного кода CRC;
  13. Оперативной памяти - 4 КБайта;
  14. Энергонезависимой FRAM памяти с побайтовым и побитным доступом - 15.5 кБайта
  15. Защита от записи энергонезависимой FRAM памяти;
  16. Коэффициент пропорциональности скорости доступа к FRAM относительно SRAM-памяти составляет 4:1;
  17. Сенсор температуры FRAM памяти;
  18. Чип MSP430FR2433 поддерживает аппаратное умножение реализованное в 32-битном умножителе MPY32;
  19. Дополнительные режимы сбережения LPM 3.5 и LPM 4.5;
  20. Корпус микросхемы - VQFN-24.

На мой взгляд, чип MSP430FR2433 является прямым конкурентом семейству STM8, по перечню периферии и характеристикам они примерно на одном уровне.

Посмотрим более внимательно на дизайн платы Launchpad'а:

Сверху от микросхемы расположен кварц на 32 кГц: "Q1: 32-kHz Epson crystal (FC-135R) 12.5-pFcrystal", который не подключен изначально. Чтобы его подключить к чипу, нужно убрать перемычки с R5/R4, и поставить их на R2/R3.

Снизу расположено гнездо для подключения ионистора. Рядом имеется 3-пиновый переключатель для его зарядки. При включении джампика между пинами 1 и 2 ионистор напрямую будет заряжаться от шины питания 3.3 Вольт. При включении джампика между пинами 2 и 3, зарядка будет происходить через токоограничевающий резистор R8 на 22 Ома.

На штыревом разъеме по бокам платы появились дополнительные выводы на шину питания 5 Вольт, что очень удобно при подключении преобразователей уровней и прочей периферии. Но то, что пины выведены не по порядку, на мой взгляд уже не очень хорошо.

Распиновку чипа MSP430FR2433 можно найти в руководстве пользователя Launchpad'a или в документации на чип:

Периферия чипа MSP430FR2433 представлена на следующей схеме:

Имеется два полноценных порта и обрезанный до трех выводов третий порт. Если в MPS430G2553 вся периферия была собрана на первом порту, то здесь она разбросана по всем трем портам.

Чип имеет 19 GPIO, в то время на штыревом разъеме Launchpad'a их может быть размещено только восемнадцать. Пин 2.3 выведен только на тактовую кнопку, и как видно по распиновке, на нем нет никакой периферии.

В сравнении с MSP-EXP430G2, на этом Launchpad'е добавлена одна новая кнопка, а второй светодиод перенесен с P1.6 на P1.1, что очень здорово, т.к. этот светодиод постоянно приходилось отключать, т.к. он был расположен на линиях UCI/USCI и с ним попросту ничего не работало.

Так же как и в MSP-EXP430G2, здесь LED1 - это красный светодиод, а LED2 - зеленый. Кнопки теперь перекинуты на второй порт, а кнопка RESET располагается со стороны программатора.

Итак, с обзором покончено, можно попытаться что-то запрограммировать.

2) Energia IDE & Linux, или как убить Launchpad за 5 секунд

Мне бы хотелось отойти от обычной манеры изложения в стиле поваренной книги, когда выкладываются только проверенные "рецепты". В этот раз, первым делом хотелось бы рассказать о проблемах или точнее о проблеме т.к. она только одна.

На плате заявлен отладчик eZ-FET. Проблема в том, что у него очень легко убить прошивку. Проблема касается только Linux, из под Windows все работает довольно ровно. Я хочу показать как это происходит и как эту прошивку потом восстанавливать.

Ок. Согласно руководству пользователя, работы платой следует установить на компьютер Code Composer Studio(CCS) или IAR MSP430, подключить Launchpad к компьютеру, и начать писать прошивки. Для меня это выглядит как-то тоскливо, т.к. CCS это Eclipse, а IAR это Windows only. Мой выбор это: mpsgcc + сторонний редактор кода.

Компилятор и флешер я брал из комплекта Energia IDE, поддержка Launchpad MSP430FR2433 там была заявлена еще ноябре:

Там же прилагается карта интерфейсов данного Launchpad'а:

Ok. Скачиваем тарбол с последней версией Energia IDE, распаковываем архив и открываем менеджер плат:

В менеджере выбираем свежую версию пакета для MSP430 и жмем на кнопку "обновление".

После обновления в меню выбора плат выбираем MSP430FR2433LP и загружаем из примеров Blink:

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

[ 1143.763894] usb 1-1.1: new full-speed USB device number 5 using ehci-pci
[ 1143.842974] usb 1-1.1: New USB device found, idVendor=2047, idProduct=0013
[ 1143.842985] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1143.842992] usb 1-1.1: Product: MSP Tools Driver
[ 1143.842998] usb 1-1.1: Manufacturer: Texas Instruments
[ 1143.843004] usb 1-1.1: SerialNumber: 47B3B46F2A002000
[ 1144.026839] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
[ 1144.027182] cdc_acm 1-1.1:1.2: ttyACM1: USB ACM device
[ 1144.027376] usbcore: registered new interface driver cdc_acm
[ 1144.027378] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

У нас появляется два acm порта. Через первый будут выводиться сообщения от UART, второй, если не ошибаюсь, чисто служебный и нужен только для отладчика.

Теперь компилируем прошивку и пытаемся ее прошить. Если все прошло удачно, то вам повезло, но скорее всего вам выдаст ошибку как и мне:

Самое плохое, что Launchpad перестает определяться компьютером, меняется его idProduct и он определяется как... клавиатура?

[ 3833.348249] usb 1-1.1: new full-speed USB device number 22 using ehci-pci
[ 3833.426190] usb 1-1.1: New USB device found, idVendor=2047, idProduct=0203
[ 3833.426202] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 3833.428275] hid-generic 0003:2047:0203.0014: hiddev0,hidraw4: USB HID v1.01 Device [HID 2047:0203] on usb-0000:00:12.2-1.1/input0
[ 3840.094403] usb 1-1.1: USB disconnect, device number 22

У меня есть только догадки, почему так происходит. Существует несколько программ для работы с eZ-FET. Так или иначе они требуют наличие своего загрузчика в eZ-FET. Если флешер не находит свой загрузчик в устройстве, он пытается его туда загрузить, строки "Programming new firmware" после "Initialization Bootloader", именно об этом и говорит. Но вот, иногда случаются накладки и что-то идет не так как надо. Кстати в Windows все работает без сучка и задоринки, поэтому самый простой способ восстановить загрузчик программатора - проделать аналогичную процедуру в Windows. Потом платой с прошитым загрузчиком можно будет пользоваться в Linux. В первый раз я плату именно так и оживил.

Впрочем, мне удалось вроде бы найти другой способ. Предполагаем что в /etc/udev/rules.d/ у нас лежит файл 71-ti-permissions.rules

SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0403",ATTRS{idProduct}=="a6d0",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0403",ATTRS{idProduct}=="a6d1",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0403",ATTRS{idProduct}=="6010",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="1cbe",ATTRS{idProduct}=="00fd",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="1cbe",ATTRS{idProduct}=="00ff",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0451",ATTRS{idProduct}=="bef1",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0451",ATTRS{idProduct}=="bef2",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0451",ATTRS{idProduct}=="bef3",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0451",ATTRS{idProduct}=="bef4",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0451",ATTRS{idProduct}=="f432",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="0d28",ATTRS{idProduct}=="0204",MODE:="0666"
KERNEL=="hidraw*",ATTRS{busnum}=="*",ATTRS{idVendor}=="0d28",ATTRS{idProduct}=="0204",MODE:="0666"
ATTRS{idVendor}=="0451",ATTRS{idProduct}=="bef0",ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="0c55",ATTRS{idProduct}=="0220",ENV{ID_MM_DEVICE_IGNORE}="1"
KERNEL=="ttyACM[0-9]*",MODE:="0666"

SUBSYSTEM=="usb", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="c32a", MODE="0660", GROUP="dialout", RUN+="/sbin/modprobe ftdi-sio" RUN+="/bin/sh -c '/bin/echo 0451 c32a > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

В самое начало добавляем две строчки:

SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="2047",ATTRS{idProduct}=="0013",MODE:="0666"
SUBSYSTEM=="usb",ENV{DEVTYPE}=="usb_device",ATTRS{idVendor}=="2047",ATTRS{idProduct}=="0203",MODE:="0666"

После чего перезапускаем udev:

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

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

Ниже полный лог:

DSLite version 7.2.0.2092
Configuring Debugger (may take a few minutes on first launch)...
	Initializing Register Database...
	Initializing: MSP430
error: MSP430: Error initializing emulator: One of the connected MSP-FETs / eZ-FETs debuggers needs recovery. Select 'Recover' to start the recovery process.  Note: Only one MSP-FET / eZ-FET debugger can be connected to your system during recovery.
Updating Firmware
	Initializing Bootloader...
	Programming New Firmware...
	Programming New Firmware...: 34%
	Programming New Firmware...: 67%
	Programming New Firmware...: 100%
	Finishing...: 100%
error: MSP430: Error initializing emulator: A firmware update is required for the MSP430 Debug Interface (MSP-FET430UIF / MSP-FET / eZ-FET). Click the "Update" button to update the firmware and launch your debug session (this may require several update steps).  DO NOT UNPLUG THE INTERFACE DURING THE UPDATE.
Updating Firmware
	Initializing Bootloader...
	Programming New Firmware...
	Programming New Firmware...: 4%
	Programming New Firmware...: 20%
	Programming New Firmware...: 36%
	Programming New Firmware...: 52%
	Programming New Firmware...: 68%
	Programming New Firmware...: 84%
	Programming New Firmware...: 100%
	Finishing...: 100%
	Mapping registers: MSP430 - Core Registers
	Mapping registers: MSP430 - ADC
	Mapping registers: MSP430 - Backup_Memory
	Mapping registers: MSP430 - CRC16
	Mapping registers: MSP430 - CS__Clock_System
	Mapping registers: MSP430 - FRAM
	Mapping registers: MSP430 - MPY_16__Multiplier__16_Bit_Mode
	Mapping registers: MSP430 - MPY_32__Multiplier__32_Bit_Mode
	Mapping registers: MSP430 - PMM__Power_Management_System
	Mapping registers: MSP430 - Port_A
	Mapping registers: MSP430 - Port_1_2
	Mapping registers: MSP430 - Port_B
	Mapping registers: MSP430 - Port_3
	Mapping registers: MSP430 - Real-Time_Clock
	Mapping registers: MSP430 - SFR__Special_Function_Registers
	Mapping registers: MSP430 - SYS__System_Module
	Mapping registers: MSP430 - Timer0_A3
	Mapping registers: MSP430 - Timer1_A3
	Mapping registers: MSP430 - Timer2_A2
	Mapping registers: MSP430 - Timer3_A2
	Mapping registers: MSP430 - USCI_A0__UART_Mode
	Mapping registers: MSP430 - USCI_A0__SPI_Mode
	Mapping registers: MSP430 - USCI_A1__UART_Mode
	Mapping registers: MSP430 - USCI_A1__SPI_Mode
	Mapping registers: MSP430 - USCI_B0__SPI_Mode
	Mapping registers: MSP430 - USCI_B0__I2C_Mode
	Mapping registers: MSP430 - Watchdog_Timer
	Mapping registers: MSP430 - Hidden
	Building search data: MSP430
	Executing Startup Scripts: MSP430
Connecting...
Loading Program: /tmp/build6c8d92925579d637b6acbc23b80fd085.tmp/Blink.ino.elf
	Preparing ... 
	.text: 0 of 782 at 0xc400
	.text: 0 of 128 at 0xff80: 84%
	Finished: 84%
	Setting PC to entry point.: 84%
info: MSP430:  Flash/FRAM usage is 930 bytes. RAM usage is 0 bytes.
Running...
Success

И в этот раз вроде бы все прошло успешно, светодиод мигает, ура)

Немного изменяем скетч, и прошиваем Launchpad еще раз:

Теперь лог стал намного лаконичнее. C проблемой справились.

3) Работа с Energia IDE и MSP430FR2433 из под виртуальной машины с Windows 7

В Windows все делается аналогично, но требуется еще поставить драйвер.

В виртуалке у меня стоит 64-битная Windows 7 (на WindowsXP Energia IDE отказалась работать). После подключения Launchpad'а к компьютеру, я пробрасываю устройство в гостевую систему:

У нас появляется два неопознанных устройства:

Щелкаем на ним правой кнопкой мыши и выбираем опцию "обновить драйвер":

Далее выбираем установку драйвера с компьютера:

Указываем папку, в которой у нас распакован скачанный архив с Energie IDE:

После установки драйвера у нас в системе появляется новое устройство:

Драйвер на второе устройство ставится точно также, в результате мы имеем два MSP последовательных порта:

Прошиваем:

Всё Ок.

Может оказаться так, что плата еще новая, с непонятным загрузчиком. Или вы использовали перед этим другой флешер. Тогда при прошивке запустится процесс обновления загрузчика:

На "живой" Windows это не должно создать проблем, но в случае использования виртуальной машины, процесс стопнется из-за того устройство поменяет idProduct. Нужно будет снова пробросить его в виртуальную машину, оно определиться операционнкой как USB-HID устройство ввода. Нужно будет опять запустить прошивку:

Снова запустится процесс перепрошивки загрузчика и он снова стопнется, потому что опять сменит idProduct, в этот он опять станет Launchpad'ом. Снова пробрасываем устройство в виртуалку, и жмем на прошивку:

Ура, в этот раз все Ок! Последующая работа с Energie IDE будет происходить в обычном режиме, без перепрошивки загрузчика.

4) Компиляция тестовой прошивки

Итак, мы разжились компилятором с поддержкой msp430fr2433. Он был закачан в домашний каталог при обновлении Energia IDE

/home/flanker/.energia15/packages/energia/tools/msp430-gcc/4.6.5/bin/
├── msp430-addr2line
├── msp430-ar
├── msp430-as
├── msp430-c++
├── msp430-c++filt
├── msp430-cpp
├── msp430-elfedit
├── msp430-g++
├── msp430-gcc
├── msp430-gcc-4.6.3
├── msp430-gcov
├── msp430-gdb
├── msp430-gdbtui
├── msp430-gprof
├── msp430-ld
├── msp430-ld.bfd
├── msp430-nm
├── msp430-objcopy
├── msp430-objdump
├── msp430-ranlib
├── msp430-readelf
├── msp430-run
├── msp430-size
├── msp430-strings
├── msp430-strip
├── msp430mcu-config
└── mspdebug

0 directories, 27 files

Компилятор можно сразу скопировать в /usr/local. Теперь нам нужно написать простейшую программу на Си, и попытаться ее как-то прошить.

Создаем каталог проекта:

$ mkdir ./00_blink
$ cd ./00_blink

Помещаем там Makefile:

OBJCOPY=msp430-objcopy
CC=msp430-gcc
CFLAGS=-mmcu=$(MCU) -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 tilib "prog $(TARGET).elf"
clean:
	@rm -v $(TARGET).elf $(TARGET).hex $(OBJ)

затем добавляем main.c:

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

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

    P1DIR = LED;
    P1OUT &=~LED;
    PM5CTL0 &=~LOCKLPM5;

    for(;;){
        __delay_cycles(0xFFFFF);
        P1OUT ^= LED;
    }

    return 0;
 }

Собираем проект:

$ make all
msp430-gcc  -c -o main.o main.c -mmcu=msp430fr2433 -Os  -Wall
msp430-gcc -mmcu=msp430fr2433 -o blink.elf  main.o
msp430-objcopy -O ihex blink.elf blink.hex

В результате имеем два файла blink.elf и blink.hex с прошивкой, которую надо загрузить в микроконтроллер. В Energia IDE для прошивки использовался DSLite, хотя лично мой выбор MSPDebug.

5) Флешер MSPFlasher

Но прежде чем переходить MSPDebug, я предлагаю познакомиться с фирменным флешером Texas Instruments - MSPFlasher.

Это кросплатформенный флешер с интерфейсом командной строки(CLI) и наверное с самым полным функционалом.

Скачиваем архивчик с программой:

Обращаю внимание, что к программе тут же прилагается руководство пользователя. R.T.F.M.

После распаковки архива и запуска инсталятора, в Linux программа установится в домашний каталог пользователя, а в случае Windows она по умолчанию ставится в каталог "C:\TI\MSPFlasher".

Заявляется, что MSPFlasher поддерживает прошивку как MSP430 так и MSP432(ARM) чипов, умеет работать с протоколам JTAG,SBW2,SBW4. Я про этот флешер речь завел собственно к тому, что для MSPDebug нам будет нужна библиотека libsp430.so входящая в его в комплект, чаще она упоминается как msp430.dll.

Ок. Проверяем зависимости:

$ ~/MSPFlasher_1.3.16: ldd MSP430Flasher
        linux-vdso.so.1 (0x00007fffe616a000)
        libmsp430.so => /usr/local/lib64/libmsp430.so (0x00007f64d770b000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f64d7391000)
        libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f64d717a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f64d6db4000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f64d6b96000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f64d698c000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f64d6683000)
        /lib64/ld-linux-x86-64.so.2 (0x0000559da9328000)
$ ~/MSPFlasher_1.3.16: ldd libmsp430.so
        linux-vdso.so.1 (0x00007ffcbb5a1000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f7762a27000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7762809000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f776248f000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f7762186000)
        libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f7761f6f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f7761ba7000)
        /lib64/ld-linux-x86-64.so.2 (0x0000562334e01000)

В данном случае все в порядке. Но если будут конфликты с версиями библиотек, то для их устранения нужно будет спуститься в каталог Source и пересобрать флешер:

$ ~/MSPFlasher_1.3.16: cd Source/
$ ~/MSPFlasher_1.3.16/Source: ls -l
итого 160
drwx------ 2 flanker users   180 фев  3 09:44 Inc
-rw-rw-r-- 1 flanker users  7455 окт 26 14:33 MSP430_Flasher.cpp
-rw-rw-r-- 1 flanker users   354 окт 26 14:45 Makefile
-rw-rw-r-- 1 flanker users 73089 окт 26 14:33 StdUseCase.cpp
-rw-rw-r-- 1 flanker users 17058 май  8  2017 StdUseCase.h
-rw-rw-r-- 1 flanker users 55372 окт 26 14:33 Support.cpp
$ ~/MSPFlasher_1.3.16/Source: make
g++ -std=c++0x -I./Inc -c MSP430_Flasher.cpp -o MSP430_Flasher.o
g++ -std=c++0x -I./Inc -c Support.cpp -o Support.o
g++ -std=c++0x -I./Inc -c StdUseCase.cpp -o StdUseCase.o
g++ -o ../MSP430Flasher -std=c++0x -I./Inc MSP430_Flasher.o Support.o StdUseCase.o -L../ -lmsp430
$ ~/MSPFlasher_1.3.16/Source: ldd ../MSP430Flasher
        linux-vdso.so.1 (0x00007ffe96f70000)
        libmsp430.so => /usr/local/lib64/libmsp430.so (0x00007f253dd13000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f253d999000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f253d690000)
        libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f253d479000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f253d0b3000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f253cea9000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f253cc8b000)
        /lib64/ld-linux-x86-64.so.2 (0x000056315ac41000)

Если мы сейчас попробуем что-то прошить или считать, то скорее всего столкнемся с несоответствием версий загрузчика и нам будет предложено обновить его:

Поэтому сделаем, обновление сразу(полагаю, что с правилами udev у вас уже все в порядке):

$ ./MSP430Flasher -n NO_TARGET -s
* -----/|-------------------------------------------------------------------- *
*     / |__                                                                   *
*    /_   /   MSP Flasher v1.3.16                                             *
*      | /                                                                    *
* -----|/-------------------------------------------------------------------- *
*
* Evaluating triggers...done
* Checking for available FET debuggers:
* Found USB FET @ ttyACM0 <- Selected
* Initializing interface @ ttyACM0...done
* Checking firmware compatibility:
* The firmware of your FET is outdated.
* Skipped firmware update prompt.


*********************************************************
*
*  Initializing Update Bootloader.
*  Programming new firmware:
*  |||||||||||||||||||||||||||||||||||||||||||||||||| 100%
*********************************************************
*
*  Initializing Update Bootloader.
*  Programming new firmware:
*  |||||||||||||||||||||||||||||||||||||||||||||||||| 100%
*  Update was successfully finished.
*
*********************************************************

*  Exit Update Bootlader and reboot firmware.
* FET firmware is up to date.
*
* ----------------------------------------------------------------------------
* Driver      : closed (No error)
* ----------------------------------------------------------------------------
*/

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

$ ./MSP430Flasher -n NO_TARGET -s
* -----/|-------------------------------------------------------------------- *
*     / |__                                                                   *
*    /_   /   MSP Flasher v1.3.16                                             *
*      | /                                                                    *
* -----|/-------------------------------------------------------------------- *
*
* Evaluating triggers...done
* Checking for available FET debuggers:
* Found USB FET @ ttyACM0 <- Selected
* Initializing interface @ ttyACM0...done
* Checking firmware compatibility:
* FET firmware is up to date.
*
* ----------------------------------------------------------------------------
* Driver      : closed (No error)
* ----------------------------------------------------------------------------
*/

Кстати, когда перейдем на использование MSPDebug, еще раз обновлять загрузчик не потребуется, т.к. MSPFlasher и MPSDebug будут использовать одну и ту же библиотеку libmsp430.so.

MSPFlasher может работать с прошивками в текстовом формате и Intel HEX.

Скопируем скомпилированный ранее blink.hex в директорию флешера из загрузим его в микроконтроллер:

$  ./MSP430Flasher -n MSP430FR2433 -w ./blink.hex -v  -z [VCC]
* -----/|-------------------------------------------------------------------- *
*     / |__                                                                   *
*    /_   /   MSP Flasher v1.3.16                                             *
*      | /                                                                    *
* -----|/-------------------------------------------------------------------- *
*
* Evaluating triggers...done
* Checking for available FET debuggers:
* Found USB FET @ ttyACM0 <- Selected
* Initializing interface @ ttyACM0...done
* Checking firmware compatibility:
* FET firmware is up to date.
* Reading FW version...done
* Setting VCC to 3000 mV...done
* Accessing device...done
* Reading device information...done
* Loading file into device...done
* Verifying memory (./blink.hex)...done
*
* ----------------------------------------------------------------------------
* Arguments   : -n MSP430FR2433 -w ./blink.hex -v -z [VCC]
* ----------------------------------------------------------------------------
* Driver      : loaded
* Dll Version : 31100001
* FwVersion   : 31100001
* Interface   : TIUSB
* HwVersion   : E 5.0
* JTAG Mode   : AUTO
* Device      : MSP430FR2433
* EEM         : Level 5, ClockCntrl 2
* Erase Mode  : ERASE_ALL
* Prog.File   : ./blink.hex
* Verified    : TRUE
* BSL Unlock  : FALSE
* InfoA Access: FALSE
* VCC ON      : 3000 mV
* ----------------------------------------------------------------------------
* Starting target code execution...done
* Disconnecting from device...done
*
* ----------------------------------------------------------------------------
* Driver      : closed (No error)
* ----------------------------------------------------------------------------
*/

Прошивку также можно считать с микроконтроллера:

$ ./MSP430Flasher -n MSP430FR2433 -r [firmware.hex,MAIN]
* -----/|-------------------------------------------------------------------- *
*     / |__                                                                   *
*    /_   /   MSP Flasher v1.3.16                                             *
*      | /                                                                    *
* -----|/-------------------------------------------------------------------- *
*
* Evaluating triggers...done
* Checking for available FET debuggers:
* Found USB FET @ ttyACM0 <- Selected
* Initializing interface @ ttyACM0...done
* Checking firmware compatibility:
* FET firmware is up to date.
* Reading FW version...done
* Setting VCC to 3000 mV...done
* Accessing device...done
* Reading device information...done
* Dumping memory from MAIN into firmware.hex...done
*
* ----------------------------------------------------------------------------
* Arguments   : -n MSP430FR2433 -r [firmware.hex,MAIN]
* ----------------------------------------------------------------------------
* Driver      : loaded
* Dll Version : 31100001
* FwVersion   : 31100001
* Interface   : TIUSB
* HwVersion   : E 5.0
* JTAG Mode   : AUTO
* Device      : MSP430FR2433
* EEM         : Level 5, ClockCntrl 2
* Read File   : firmware.hex (memory segment = MAIN)
* VCC OFF
* ----------------------------------------------------------------------------
* Powering down...done
* Disconnecting from device...done
*
* ----------------------------------------------------------------------------
* Driver      : closed (No error)
* ----------------------------------------------------------------------------
*/

В некоторых случаях, как сейчас, после нужно будет нажать RESET на плате, чтобы прошивка снова запустилась.

Еще можно очистить FRAM память от прошивки:

$ ./MSP430Flasher -n MSP430FR2433 -e ERASE_ALL
* -----/|-------------------------------------------------------------------- *
*     / |__                                                                   *
*    /_   /   MSP Flasher v1.3.16                                             *
*      | /                                                                    *
* -----|/-------------------------------------------------------------------- *
*
* Evaluating triggers...done
* Checking for available FET debuggers:
* Found USB FET @ ttyACM0 <- Selected
* Initializing interface @ ttyACM0...done
* Checking firmware compatibility:
* FET firmware is up to date.
* Reading FW version...done
* Setting VCC to 3000 mV...done
* Accessing device...done
* Reading device information...done
* Erasing device memory...done
*
* ----------------------------------------------------------------------------
* Arguments   : -n MSP430FR2433 -e ERASE_ALL
* ----------------------------------------------------------------------------
* Driver      : loaded
* Dll Version : 31100001
* FwVersion   : 31100001
* Interface   : TIUSB
* HwVersion   : E 5.0
* JTAG Mode   : AUTO
* Device      : MSP430FR2433
* EEM         : Level 5, ClockCntrl 2
* Erase Mode  : ERASE_ALL
* VCC OFF
* ----------------------------------------------------------------------------
* Powering down...done
* Disconnecting from device...done
*
* ----------------------------------------------------------------------------
* Driver      : closed (No error)
* ----------------------------------------------------------------------------
*/

С MSPFlasher думаю, что все понятно, переходим к MSPDebug.

6) Использование MSPDebug в качестве флешера

Библиотеку libmsp430.so нужно скопировать в /usr/lib64 или /usr/local/lib64, после чего следует обновить кеш библиотек командой ldconfig из под рута. Затем нужно скачать исходники mspdebug с домашней страницы проекта. Исходники нужно скомпилировать, а полученную программу установить в систему, любым удобным для вас способом. Актуальная версия MSPDebug на настоящий момент, это 0.25. На худой конец, можно взять mpsdebug из комплекта утилит Energia IDE, там последняя версия программы 0.24. Там же я вроде видел библиотеку libmsp430.so.

Переходим в каталог c blink'ом и прошиваем микроконтроллер:

$ make install
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.

Using new (SLAC460L+) API
MSP430_GetNumberOfUsbIfs
MSP430_GetNameOfUsbIf
Found FET: ttyACM0
MSP430_Initialize: ttyACM0
Firmware version is 31100001
MSP430_VCC: 3000 mV
MSP430_OpenDevice
MSP430_GetFoundDevice
Device: MSP430FR2433 (id = 0x01c6)
3 breakpoints available
MSP430_EEM_Init
Chip ID data:
  ver_id:         8240
  ver_sub_id:     0000
  revision:       10
  fab:            55
  self:           5555
  config:         10
  fuses:          55
warning: unknown chip
Erasing...
Programming...
Writing  114 bytes at c400 [section: .text]...
Writing  128 bytes at ff80 [section: .vectors]...
Done, 242 bytes total
MSP430_Run
MSP430_Close

Это была успешная прошивка без перепрошивки(извините за тавтологию) загрузчика. Если загрузчик все-таки потребует перепрошивки, то выдаст ошибку:

$ make install
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.

Using new (SLAC460L+) API
MSP430_GetNumberOfUsbIfs
MSP430_GetNameOfUsbIf
Found FET: ttyACM0
MSP430_Initialize: ttyACM0
FET firmware update is required.
Re-run with --allow-fw-update to perform a firmware update.
tilib: device initialization failed
make: *** [Makefile:16: install] Ошибка 255

Добавляем указанную опцию в параметры, и еще раз перепрошиваем:

$ mspdebug --allow-fw-update tilib "prog blink.elf"
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.

Using new (SLAC460L+) API
MSP430_GetNumberOfUsbIfs
MSP430_GetNameOfUsbIf
Found FET: ttyACM0
MSP430_Initialize: ttyACM0
FET firmware update is required.
Starting firmware update (this may take some time)...
Initializing bootloader...
Programming new firmware...
    16 percent done
    33 percent done
    33 percent done
    50 percent done
    66 percent done
    83 percent done
   100 percent done
   100 percent done
Initializing bootloader...
Programming new firmware...
    13 percent done
    16 percent done
    19 percent done
    22 percent done
    25 percent done
    28 percent done
    31 percent done
    31 percent done
    34 percent done
    37 percent done
    40 percent done
    43 percent done
    43 percent done
    55 percent done
    58 percent done
    61 percent done
    64 percent done
    67 percent done
    67 percent done
    67 percent done
    70 percent done
    73 percent done
    76 percent done
    79 percent done
    82 percent done
    85 percent done
    85 percent done
    88 percent done
    91 percent done
    94 percent done
    97 percent done
   100 percent done
Update complete
Done, finishing...
MSP430_VCC: 3000 mV
MSP430_OpenDevice
MSP430_GetFoundDevice
Device: MSP430FR2433 (id = 0x01c6)
3 breakpoints available
MSP430_EEM_Init
Chip ID data:
  ver_id:         8240
  ver_sub_id:     0000
  revision:       10
  fab:            55
  self:           5555
  config:         10
  fuses:          55
warning: unknown chip
Erasing...
Programming...
Writing  114 bytes at c400 [section: .text]...
Writing  128 bytes at ff80 [section: .vectors]...
Done, 242 bytes total
MSP430_Run
MSP430_Close

Отлично, имеем 242 байта на минимальную(ну почти) программу.

7) Отладка Launchpad MSP430FR2433 через MSPDebug

С предыдущим Launchpad'ом MSP-EXP430G2 у меня были сложности с отладкой по GDB. Т.е. какие-то простые действия выполнялись без проблем, но стоило скажем, "прыгнуть" в функцию или поставить точку остановки на прерывании, как отладка тут же валилась с какой-нибудь ошибкой. С Launchpad'ом MSP430FR2433 у меня таких проблем пока не было.

Для проверки отладчика перепишем blink на прерывании таймера:

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

volatile uint16_t count;

#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_OVF(void)
{
  if(count)
      count--;
}

void wait_ms(uint16_t ms){
   count=ms;
   TA0CCTL0=CCIE; // run interrupt

   while(count); // wait ms
   TA0CCTL0=0; // stop interrupt
}

int main (void)
{
    WDTCTL=WDTPW | WDTHOLD; //turn off watchdog
    PM5CTL0 &=~LOCKLPM5;
    // GPIO Setup
    P1DIR|=LED; P1OUT &= ~(LED);
    // Timer0  Setup
    TA0CTL=TASSEL_2 | MC_1 | ID_3 | TACLR;
    /*  TASSEL_2  =use SMCLK;
        MC_1      =continous to TACCR0;
        ID_3      =prescaler  = 8;
        TACLR     =clean counter TAR;
    */
    TA0CCR0=124; // 1kHz for Overflow Interrupt
    TA0CCTL0=0;
    // let's go...
    __enable_interrupt();
    for(;;){
        wait_ms(1000);
        P1OUT ^= LED;
    }

    return 0;
 }

В Makefile добавим опцию -ggdb:

CFLAGS=-mmcu=$(MCU) -ggdb -Os  -Wall

Запускаем mspdebug в режиме сервера gdb:

$ mspdebug tilib gdb
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.

Using new (SLAC460L+) API
MSP430_GetNumberOfUsbIfs
MSP430_GetNameOfUsbIf
Found FET: ttyACM0
MSP430_Initialize: ttyACM0
Firmware version is 31100001
MSP430_VCC: 3000 mV

В другом окне, или через ваш любимый терминальный мультиплексор запускам gdb:

$ 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/zero/mcu/msp430fr2433/01_blink_timer_gcc4.6.3/blink.elf...done.
(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

Загружаем прошивку в микроконтроллер:

(gdb) load
Loading section .text, size 0xaa lma 0xc400
Loading section .vectors, size 0x80 lma 0xff80
Start address 0xc400, load size 298
Transfer rate: 1 KB/sec, 149 bytes/write.

Можно заметить, что в сравнении с MSP-EXP430G2 скорость загрузки прошивки немного подрасла с 691B/s до 1KB/s.

Ставим точку остановки на главном цикле программы:

(gdb) break main.c:40
Breakpoint 1 at 0xc466: file main.c, line 40.

Запускаем на выполнение:

(gdb) c
Continuing.

Breakpoint 1, main () at main.c:40
40                      wait_ms(1000);

Выполнение программы остановилось в точке остановки. Осматриваемся:

(gdb) list
35          TA0CCR0=124; // for 1MHz
36          TA0CCTL0=0;
37              // let's go...
38              __enable_interrupt();
39          for(;;){
40                      wait_ms(1000);
41              P1OUT ^= LED;
42          }
43
44          return 0;

Прогоним пару раз главный цикл:

(gdb) n
41              P1OUT ^= LED;
(gdb) n

Breakpoint 1, main () at main.c:40
40                      wait_ms(1000);
(gdb) n
41              P1OUT ^= LED;
(gdb) n

Breakpoint 1, main () at main.c:40
40                      wait_ms(1000);
(gdb)

Если светодиод меняет индикацию, значит здесь все в порядке. Теперь "прыгаем" в функцию wait_ms() и сразу дизассемблируем ее:

(gdb) s
wait_ms (ms=1000) at main.c:15
15         count=ms;
(gdb) disass
Dump of assembler code for function wait_ms:
=> 0x0000c490 <+0>:     mov     r15,    &0x2000
   0x0000c494 <+4>:     mov     #16,    &0x0382 ;#0x0010
   0x0000c49a <+10>:    mov     &0x2000,r15
   0x0000c49e <+14>:    tst     r15
   0x0000c4a0 <+16>:    jnz     $-6             ;abs 0xc49a
   0x0000c4a2 <+18>:    mov     #0,     &0x0382 ;r3 As==00
   0x0000c4a6 <+22>:    ret
End of assembler dump.

Здесь в r15 хранится параметр функции =1000, или 0x3e8 в шестнадцатеричной системе. В ячейке памяти по адресу 0x2000 хранится значение переменной count. Распечатаем их значение:

(gdb) p $r15
$7 = 1000
(gdb) x/xh 0x2000
0x2000: 0x0000

выполняем одну инструкцию и снова смотрим их значение:

(gdb) ni
16         TA0CCTL0=CCIE; // run interrupt
(gdb) x/xh 0x2000
0x2000: 0x03e8
(gdb)

Как видно, присваивание произошло успешно.

А дальше нас ждет более интересный код:

=> 0x0000c494 <+4>:     mov     #16,    &0x0382 ;#0x0010

По адресу 0x0382 у нас находится регистр ввода-вывода(РВВ) TA0CCTL0:

Распечатываем его значение:

(gdb) x/xh 0x382
0x382:  0x0001

Ну, во-первых. Откуда тут единица в регистре если при инициализации в него прямо записывался ноль?!

Идем дальше:

(gdb) ni
18         while(count); // wait ms
(gdb) disass
Dump of assembler code for function wait_ms:
   0x0000c490 <+0>:     mov     r15,    &0x2000
   0x0000c494 <+4>:     mov     #16,    &0x0382 ;#0x0010
=> 0x0000c49a <+10>:    mov     &0x2000,r15
   0x0000c49e <+14>:    tst     r15
   0x0000c4a0 <+16>:    jnz     $-6             ;abs 0xc49a
   0x0000c4a2 <+18>:    mov     #0,     &0x0382 ;r3 As==00
   0x0000c4a6 <+22>:    ret
End of assembler dump.
(gdb) x/xh 0x382
0x382:  0x0011
(gdb)

Выглядит так, как будто вместо операции присваивания MOV выполняется "исключающее или" XOR.

Отключаем первую точку остановки и ставим новую на функцию wait_ms. После чего возвращаемся на ее начало:

(gdb) disable 1
(gdb) break wait_ms
Breakpoint 2 at 0xc490: file main.c, line 15.
(gdb) c
Continuing.

Breakpoint 2, wait_ms (ms=1000) at main.c:15
15         count=ms;
(gdb)

Попробуем изменить код программы:

(gdb) disass
Dump of assembler code for function wait_ms:
=> 0x0000c490 <+0>:     mov     r15,    &0x2000
   0x0000c494 <+4>:     mov     #16,    &0x0382 ;#0x0010
   0x0000c49a <+10>:    mov     &0x2000,r15
   0x0000c49e <+14>:    tst     r15
   0x0000c4a0 <+16>:    jnz     $-6             ;abs 0xc49a
   0x0000c4a2 <+18>:    mov     #0,     &0x0382 ;r3 As==00
   0x0000c4a6 <+22>:    ret
End of assembler dump.
(gdb) x/10xb 0xc490
0xc490 <wait_ms>:       0x82    0x4f    0x00    0x20    0xb2    0x40    0x10
0x00
0xc498 <wait_ms+8>:     0x82    0x03
(gdb)

В команде mov #16, &0x0382 поменяем число 16 на ноль. Для этого нужно изменить ячейку 0xc496:

(gdb) set {char}0xc496=0
(gdb) disass
Dump of assembler code for function wait_ms:
=> 0x0000c490 <+0>:     mov     r15,    &0x2000
   0x0000c494 <+4>:     mov     #0,     &0x0382 ;#0x0000
   0x0000c49a <+10>:    mov     &0x2000,r15
   0x0000c49e <+14>:    tst     r15
   0x0000c4a0 <+16>:    jnz     $-6             ;abs 0xc49a
   0x0000c4a2 <+18>:    mov     #0,     &0x0382 ;r3 As==00
   0x0000c4a6 <+22>:    ret
End of assembler dump.
(gdb)

Пробуем еше раз:

(gdb) x/xb 0x382
0x382:  0x01
(gdb) ni
16         TA0CCTL0=CCIE; // run interrupt
(gdb) ni
18         while(count); // wait ms
(gdb) disass
Dump of assembler code for function wait_ms:
   0x0000c490 <+0>:     mov     r15,    &0x2000
   0x0000c494 <+4>:     mov     #0,     &0x0382 ;#0x0000
=> 0x0000c49a <+10>:    mov     &0x2000,r15
   0x0000c49e <+14>:    tst     r15
   0x0000c4a0 <+16>:    jnz     $-6             ;abs 0xc49a
   0x0000c4a2 <+18>:    mov     #0,     &0x0382 ;r3 As==00
   0x0000c4a6 <+22>:    ret
End of assembler dump.
(gdb) x/xb 0x382
0x382:  0x01
(gdb)

В этот раз вообще ничего не меняется. Тогда пробуем записать свое значение в TA0CCTL0 напрямую из отладчика:

(gdb) x/xb 0x382
0x382:  0x01
(gdb) set {int}0x382=0x10
(gdb) x/xb 0x382
0x382:  0x11
(gdb)

Где-то здесь уже должно появиться понимание, что это единица в младшем разряде регистра какая-то непростая. Смотрим руководство:

Т.е. мы споткнулись об флаг прерывания который устанавливается и сбрасывается видимо каким-то аппаратным способом, хотя в документации этот флаг помечен как RW.

Ок. Что еще можно придумать для проверки отладочного интерфейса? Убираем прерывание с функции и поставим прерывание на событие:

(gdb) disable 2
(gdb) break if count=500
Breakpoint 3 at 0xc49a: file main.c, line 18.
(gdb) c
Continuing.

Breakpoint 3, wait_ms (ms=500) at main.c:18
18         while(count); // wait ms
(gdb) p count
$1 = 500
(gdb) list
13
14      void wait_ms(uint16_t ms){
15         count=ms;
16         TA0CCTL0=CCIE; // run interrupt
17
18         while(count); // wait ms
19         TA0CCTL0=0; // stop interrupt
20      }
21
22      int main (void)
(gdb)

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

(gdb) set count=0
(gdb) p count
$3 = 0
(gdb)

Изменять значение переменной можно не только по ее имени, но и по ее адресу в оперативной памяти:

(gdb) set {int}0x2000=100
(gdb) p count
$4 = 100
(gdb)

Значения регистров, которые не имеют физического адреса в памяти, можно изменять как переменные по имени:

(gdb) set $r15=12
(gdb) p $r15
$7 = 12
(gdb)

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

8) Code Composer Studio и инструмент EnergyTrace

Code Composer Studio - является фирменной средой разработки для микроконтроллеров Texas Instruments. Материалов по этой IDE в сети более чем достаточно, да и как бы любой, кто уже имел дело с Eclipse разберется с ней за пару минут. Я бы вообще не упоминал о CCS, если бы не такая штука как EnergyTrace которая умеет подсчитывать энергопотребление девайса. Причем не обязательно именно модуля MSP430FR2433, можно подключить любой другой микроконтроллер с питанием 3.3/5 Вольт. Повторюсь, что EnergyTrace именно подсчитывает реальное потребление, а не рассчитывает его теоретически, как например в калькуляторе Power Consumption STM32CubeMX.

Так же хочу сказать, что из CCS тоже можно вытащить mspgcc компилятор, так же как из Energia IDE. Там версия gcc 6.4.0.32, мне лично он не понравился из-за размера генерируемого кода, но мне показалось, что он является более полноценным компилятором Cи, в то время как компилятор в Energia IDE сильно порезанный.

Если в целом говорить о CCS, то это IDE мне понравилась. Небольшой опыт его использования даже заставил меня изменить свое мнение об Eclipse. Не было ни одного вылета программы, и по скорости отклика студия была вполне сопоставима с Qt Ctreator.

Скачать CCS можно с официальной страницы http://www.ti.com/tool/CCSTUDIO. В Linux CCS ставится в домашний каталог, в Windows по умолчанию в C:\TI.

После установки и запуска IDE, через меню->File->New->CCS Project создадим новый проект. После заполняем карточку проекта:

Для тестирования режимов энергосбережения, на этот раз напишем обработчик внешнего прерывания. В main.c кидаем такой код:

#include <msp430fr2433.h>

#define LED BIT0
#define LED_GREEN BIT1
#define BTN BIT3

volatile unsigned char count;

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

// Port 2 interrupt service routine
#pragma vector=PORT2_VECTOR
__interrupt void Port_2(void)
{
    P1OUT ^= LED;
    P2IFG &= ~(BTN);
    count=0;
    delay_ms(50);
}

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;               // Stop watchdog timer
    PM5CTL0 &= ~LOCKLPM5;                   // Disable the GPIO power-on default high-impedance mode
                                            // to activate previously configured port settings

    P1DIR |= (LED|LED_GREEN);               // Set P1.0 to output direction
    P1OUT &= ~(LED|LED_GREEN);
    // ext. IRQ setup
    P2DIR &=~BTN;  // set as input
    P2OUT |= BTN;
    P2REN |= BTN;  // pull-down is ON
    P2IES &=~BTN;  // rising front
    P2IFG &=~BTN;  // IFG cleared
    P2IE  |= BTN;  // enable interrupt
    // set variables
    count=0;
    // let's go...
    __enable_interrupt();

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

Последовательно жмем на панели инструментов Build(молоток), потом Debug(паук), а после загрузки прошивки в микроконтроллер, нажимаем STOP(красный квадрат). После жмем на RESET на плате Launchpad'а, и должен начать мигать зеленый светодиод. При нажатии на кнопку S1(слева), красный светодиод должен менять индикацию.

Если в процессе загрузки будет несоответствие версии загрузчика, то CCS выдаст соответствующее сообщение:

При желании можно обновить загрузчик, а можно проигнорировать. У меня все работало в обоих случаях.

Ок. Теперь снимаем джампик с зеленного светодиода, чтобы он не мешал, и жмем по кнопке запуска EnergyTrace:

После жмем на зеленый треугольник, для запуска замера энергопотребления:

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

Как видно, среднее значение(mean) силы тока в активном режиме составило составило 237 мкА:

Можно поставить джампик обратно, произвести замер еще раз и посмотреть красивый график измерения энергопотребления:

По графику видно, что один светодиод потребляет энергии как девять чипов msp430fr2433.

Ок. Ставим джампик обратно, закрываем окно EnergyTrace(красная круглая кнопка) и добавляем в начало главного цикла такой код:

        if(count++ == 5) {
            P1OUT &= ~(LED_GREEN);
            __bis_SR_register(LPM0_bits + GIE);
        }

А в конец обработчика прерывания добавляем следующую строку:

    __bic_SR_register_on_exit(LPM0_bits + GIE); // wake up from low power mode

Снова компилируем, загружаем в микроконтроллер и жмем RESET на плате.

Теперь зеленый светодиод три раза мигнет, после чего микроконтроллер уйдет в спящий режим. Нажатие на кнопку S1 пробудет его, и ситуация повторится. Теперь дождемся перехода микроконтроллера в спящий режим, когда оба светодиода будут потушены, и снова замерим энергопотребление:

Как видно, LPM0 по энергопотреблению не сильно отличается от активного режима, разница всего в ~45 мкА.

Теперь в макросах изменения режима энергосбережения заменим LPM0 на LPM3, после чего снова посмотрим на результат:

Ну, в этот раз уже кое-что. Энергопотребление упало на порядок. В таком режиме микроконтроллеру хватит батарейки CR2032 практически на год. На мой взгляд, для MSP430 это все-равно много. MSP430G2452 выдавал более 2200(это больше шести лет!) дней в режиме LPM3. Чтобы такого значения добиться для MSP430FR2433 нужно использовать режим LPM3.5 когда отключается питание от оперативки, и пробуждение происходит по таймеру RTC. В микроконтроллере есть область памяти, называется backup, которая не отключается от питания. Eе можно использовать для сохранения текущего состояния микроконтроллера.

Так же как из Energia IDE, из CCS можно взять компилятор gcc for msp430. Он там в версии аж 6.4.0.32, и располагается в каталоге ~/ti/ccsv7/tools/compiler/msp430-gcc-6.4.0.32_linux64. Но лично мне он не понравился из-за генерации избыточного кода:

490 байт на обычный Blink, это уже что-то за гранью :(

9) CCS Cloud - среда программирования на облаке

У CCS есть облачная версия, которая работает в браузере компьютера. Там есть примеры кода, среди которых можно поковыряться в поисках вдохновения.

CCS Cloud доступна по адресу https://dev.ti.com/, и требует регистрации.

Для возможности прошивки микроконтроллера из браузера требуется инсталляция TI CLOUD AGENT:

Его установка происходит в два этапа: установка плагина для браузера и программы на компьютер:

Замечу, что все прекрасно работает в Linux. После подключения Launchpad'а он должен определиться во вкладке Device Detector:

В каталоге ресурсов, поиском по ключевому слову mps430fr2433 можно найти готовый пример Blink'а на таймере WatchDog'а. Нажав на иконку облака в правом верхнем углу, проект откроется в CCS Cloud.

Если Launchpad подключен к компьютеру, проект сразу можно скомпилировать нажав на иконку молотка и загрузить в микроконтроллер нажав на треугольник Run:

Проект потянул на 264 байта, неплохо.

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

Так же как в CCS, загрузчик можно обновить или проигнорировать это сообщение.

Содержимое main.c заменим на свою версию мигалки на таймере TimerA3:

#include <driverlib.h>
#define LED BIT0

#pragma vector=TIMER3_A1_VECTOR
__interrupt void Timer0_OVF(void)
{
   switch( TA3IV )
   {
      case TA3IV_TACCR1: break;        // CCR1 not used
      case TA3IV_TAIFG:
        __bic_SR_register_on_exit(LPM3_bits);;      // overflow
        break;
   }
}

int main(void) {
    // Stop watchdog timer
    WDT_A_hold(WDT_A_BASE);
    // Disable the GPIO power-on default high-impedance mode
    // to activate previously configured port settings
    PMM_unlockLPM5();
    // GPIO Setup
    P1DIR|=LED;
    // Timer3 
    TA3CTL=TASSEL_2 | MC_2 | ID_0 | TACLR | TAIE;
   /*   TASSEL_2  =use SMCLK;
        MC_2      =continous up;
        ID_0      =prescaler  = 0;
        TACLR     =clean counter TAR;
        TAIE;     =enable timer interrupt;

   */

    for(;;) {
        static uint8_t count=0;
        __bis_SR_register(LPM3_bits + GIE);

        if (++count >= 8)
        {
            P1OUT ^= LED;
            count=0;
        }
    }
}

В этот раз проект тянет уже 942 байта.

На мой взгляд в MSP430FR2433 довольно замороченная система тактирования. Для примера, в проекте имеется библиотека driverlib, это что-то вроде SPL для MSP430. После инициализации WatchDog'a, для установки частоты CPU на 16 MHz можно добавить вызов следующей функцию использующую эту библиотеку:

void initCs(void) {
    //Set DCO FLL reference = REFO
    CS_initClockSignal(
        CS_FLLREF,
        CS_REFOCLK_SELECT,
        CS_CLOCK_DIVIDER_1
        );

    //Set ACLK = REFO
    CS_initClockSignal(
        CS_ACLK,
        CS_REFOCLK_SELECT,
        CS_CLOCK_DIVIDER_1
        );

    //Create struct variable to store proper software trim values
    CS_initFLLParam param = {0};

    //Set Ratio/Desired MCLK Frequency, initialize DCO, save trim values
    CS_initFLLCalculateTrim(
        16000,
        488,
        &param
        );

    //Clear all OSC fault flag
    CS_clearAllOscFlagsWithTimeout(1000);

    //For demonstration purpose, change DCO clock freq to 16MHz
    CS_initFLLSettle(
        16000,
        488
        );
}

Функция была найдена в одном из примеров на ресурсах.

После компиляции и загрузки прошивки в микроконтроллер, светодиод должен начать мигать в 16 раз быстрее. При этом код прошивки увеличится уже до 2132 байт. И это все какой-то простой Blink.

На этом статью заканчиваю, материал получился немного больше чем я ожидал. В целом, Launchpad MSP430FR2433 оказался довольно любопытной железкой, на мой взгляд. О программировании чипа msp430fr2433 я буду рассказывать уже как-нибудь в другой раз, скорее всего в теме по GNU ассемблеру.