Под новый год компания Texas Instruments удачно напомнила о себе устроив распродажу своих новых Launchpad'ов по символической цене в 4.30$. В сочетании с бесплатной доставкой занявшей, в моем случае, всего девять дней со склада в США, получился вполне себе такой приятный подарок. Для сравнения, на "Мышаке" Launchpad MSP430FR2433 стоит сейчас 18$ со сроком доставки в три недели. Так что, как говорится, приобретайте у производителя.
Launchpad MSP430FR2433 занял меня на пару дней, но вот только сейчас дошли руки написать об этой новинке. Я хотел бы рассказать, что это вообще за плата такая, для чего ее можно использовать(как оказалось не только для программирования), и как ее программировать. Я буду говорить в основном об Linux, так как именно здесь кроется большинство проблем. О Windows буду говорить по необходимости, там все делается по аналогии, т.к. весь используемый софт является кроссплатформенным. Так же, я иногда буду сравнивать этот Launchpad с более ранним MSP-EXP430G2.
Launchpad MSP430FR2433 можно мысленно разделить на три отдельных модуля: модуль программатора eZ-FET, модуль подсчета энергопотребления EnergyTrace, модуль с микроконтроллером MSP430FR2433.
На мой взгляд, чип 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 располагается со стороны программатора.
Итак, с обзором покончено, можно попытаться что-то запрограммировать.
Мне бы хотелось отойти от обычной манеры изложения в стиле поваренной книги, когда выкладываются только проверенные "рецепты". В этот раз, первым делом хотелось бы рассказать о проблемах или точнее о проблеме т.к. она только одна.
На плате заявлен отладчик 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 проблемой справились.
В Windows все делается аналогично, но требуется еще поставить драйвер.
В виртуалке у меня стоит 64-битная Windows 7 (на WindowsXP Energia IDE отказалась работать). После подключения Launchpad'а к компьютеру, я пробрасываю устройство в гостевую систему:
У нас появляется два неопознанных устройства:
Щелкаем на ним правой кнопкой мыши и выбираем опцию "обновить драйвер":
Далее выбираем установку драйвера с компьютера:
Указываем папку, в которой у нас распакован скачанный архив с Energie IDE:
После установки драйвера у нас в системе появляется новое устройство:
Драйвер на второе устройство ставится точно также, в результате мы имеем два MSP последовательных порта:
Прошиваем:
Всё Ок.
Может оказаться так, что плата еще новая, с непонятным загрузчиком. Или вы использовали перед этим другой флешер. Тогда при прошивке запустится процесс обновления загрузчика:
На "живой" Windows это не должно создать проблем, но в случае использования виртуальной машины, процесс стопнется из-за того устройство поменяет idProduct. Нужно будет снова пробросить его в виртуальную машину, оно определиться операционнкой как USB-HID устройство ввода. Нужно будет опять запустить прошивку:
Снова запустится процесс перепрошивки загрузчика и он снова стопнется, потому что опять сменит idProduct, в этот он опять станет Launchpad'ом. Снова пробрасываем устройство в виртуалку, и жмем на прошивку:
Ура, в этот раз все Ок! Последующая работа с Energie IDE будет происходить в обычном режиме, без перепрошивки загрузчика.
Итак, мы разжились компилятором с поддержкой 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.
Но прежде чем переходить 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.
Библиотеку 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 байта на минимальную(ну почти) программу.
С предыдущим 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)
На этом моя фантазия заканчивается, на предмет того, как еще можно проверить работоспособность отладочного интерфейса. На мой взгляд, выглядит он вполне работоспособным.
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, это уже что-то за гранью :(
У 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, ¶m ); //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 ассемблеру.