Чип MSP430g2453IPW28 распаяный на адаптере TSSOP28-DIP28
Чипы AVR заслужили хорошую репутацию отчасти тем, что содержат АЦП даже в самых младших моделях микроконтроллеров. Аббревиатура MSP430 не случайно ассоциируется с DSP, данные чипы при вполне разумной стоимости могут нести в себе 16-битные или даже 24-битные сигма-дельта АЦП, а также есть целая линейка CC430 микроконтроллеров c радиомодулем(!) на борту. MSP430 (расшифровывается как Mixed Signal Processor) имеет 16-битную архитектуру что позволяет обрабатывать данные с АЦП за один прием, не обрезая их до 8-бит как на AVR. Данные микроконтроллеры изначально разрабатывались как малопотребляющие. Причем настолько малопотребляющие, что ввелась новая концепция устройств с одной батарей для всего жизненного цикла устройства. Семейства MSP430x5xx и MSP430x6xx включают в себя модуль DMA. Одним словом, это еще одна достойная замена устаревающим AVR.
Фирма производитель MSP430 - Texas Instruments - (прародитель легендарной TMS32010), разложена в Cеверной Америке, и там микроконтроллеры MSP430 чрезвычайно популярны. Кроме того им удалось портировать на свою архитектуру фреймворк Arduino и дав ему название Energia.
Справедливости ради, должен сказать, что есть у TI как вполне "взрослые" DSP, например TMS320C5535, так и микроконтроллеры серии MSP432 на ядре ARM Cortex-M4, который как известно имеет блок DSP.
Кстати, MSP430 примечателен своей архитектурой PDP-11, которая была чрезвычайно популярной в 70-80 года, в том числе и в СССР. В нашей стране был большой модельный ряд вычислительной техники на этой архитектуре, в том числе и вполне приличные модели, например "Электроника МС 0585".
Если касаться технической стороны, то архитектура PDP-11 было популярна своей ортогональностью. В TI попытались максимально воссоздать оригинальную PDP-11 архитектуру на RISC ядре с гарвардской архитектурой. И желание "пощупать" возрожденную легенду было одной из двух причин подтолкнувших меня к MSP430. Второй причиной было низкое энергопотребление. Мне нужен был эталонный чип, сравнивая с которым можно было бы сказать, что тот или иной чип такой то фирмы лучше или хуже, или допустим "на уровне". STM например, тоже предлагает энергоэффективные чипы, и далеко не факт, что они хуже MSP430. Посмотрим - узнаем.
Итак заскочив в ближайший радио-магазин, я приобрел чип MSP430G2453IPW28 в TSSOP28 корпусе за 150 рублей. Здесь возможно следует провести небольшой ликбез по модельному ряду. Хорошая классификация по семействам есть в англоязычной википедии. Я же немного расскажу своими словами как я понял положение дел.
В рунете есть много публикаций по серии MSP430x1xxx. Как понимаю это первая основная линейка запущенная еще в 1999-м году. Это хорошие микроконтроллеры, среди которых есть и такие популярные как msp430f149, они выпускаются, продаются, но... они устарели. Актуальная сейчас линейка, это MSP430x2xxx. Хороший материал по различиям между линейками MSP430F1xxx и MSP430F2xxx можно почитать здесь:
Кроме основной линейки MSP430F2xx, в 2010 году TI выпустила "оптимизированную по цене" Value Line, линейку с бувкеным индексом G. Для продвижения новой линейки на рынке, TI запустила рекламную компанию по продаже отладочного комплекта начального уровня Launchpad по бросовым ценам 4.3USD c доставкой(!). При том, что доллар тогда стоил 28р. получился такой реальный "Arduino Killer". И большое число публикаций касательно Launchpad'а относится именно к тому периоду. Вскоре халява закончилась, ценник подскочил в три раза, и тема пошла резко на спад.
Я отчаиваться не стал тому факту, что остался не удел, и взяв свежекупленный MSP430G2453IPW28, быстро распаял его на переходнике TSSOP28-DIP28.
Предлагаю взглянуть на характеристики этого чипа:
На мой взгляд, выглядит как ATmega8, разве что питание 3.3Вольта. Однако замечу, что в отличии от ATmega8 чип содержит модуль jtag, загрузчик, а так же GPIO можно сконфигурировать как входы touch-сенсоров. Кроме того, система команд поддерживает аппаратное умножение, правда отсутсвует деление.
Datasheet на чип скачать можно с официального сайта: http://www.ti.com/lit/ds/symlink/msp430g2453.pdf
Первым делом нужно взглянуть на распиновку микросхемы:
Порты I/O здесь нумеруются не буквам, а цифрами: P1, P2 и т.д. Внешнее прерывание по одному на каждый порт, правда третий порт обошелся без него. Кроме jtag микросхему можно отлаживать через SBW-интерфейс. Интерфейсы SPI/I2C/UART объедены в один интерфейсный модуль USCI.
Прошивать чип будем через BSL(загрузчик). Часто можно прочитать, что BSL имеется в каждом чипе MSP430. ЭТО не так. Если в распиновке микросхемы нет ног с функциями BSL_receive/BSL_transmit, значит загрузчика там нет и его можно шить через jtag. В MSP430F20xx например, загрузчика нет. Зато в MSP430F2003 есть 16-битный сигма дельта АЦП ;) Еще один миф - микроконтроллеры можно бесплатно заказать для освоения. Чудес не бывает, физ.лицам ничего не шлют.
Хитрые китайцы приноровились продавать BSL программаторы для неопытных людей. На самом деле сгодится любой USB-TTL конвертор с выведеными линиями RTS/DTR/TX/RX. Если вы занимались Arduino наверняка у вас такой есть:
У меня такого не было, зато со времен Arduino-мании осталась плата CraftDuino v1.0 На котором соответствующие выводы от FT232RL были выведены:
Оставалось только вытащить чип с ATmega, пропаять штыревой разъем PBS и плата превращалась в обычный USB-TTL конвертер.
Подключение такое:
FT232RL <==> MSP430G2453
TX <===> BSL_receive (P1.5)
RX <===> BSL_transmit (P1.1)
DTR <===> RST/NMI
RST <===> TEST
Vcc (3.3V) <===> DVCC
GND <===> DVSS
Выглядит все это как-то так:
Но, повторюсь можно использовать любой другой USB-TTL или COM-TTL конвертер с линиями RTS и DTR
Найти программу-прошивальщик оказалось не простым делом. После некоторого времени безрезультативного поиска, нашел таки рабочий вариант здесь:
Схема. Программирование микроконтроллеров MSP430 с помощью BSL
Сложность в том, что прошивки на чипе защищены паролем, и просто так ничего "для тестирования не считаешь". Поэтому сначала следует скомпилировать программу ;) Кроме того версии загрузчиков разные, а MSP430G2453 относительно новый чип.
Ок, забегая вперед, допустим, что заветный hex файл с прошивкой у вас уже есть.Тогда:
Предупреждение! Все описанные ниже действия выполнялись из WindowsXP. Как это будет работать в более поздних Windows, я не имею представления.
Скачиваем и распаковываем архив, что в конце приведенной выше статьи. Для прошивки понадобится программа MspFet.exe
В опциях нужно выставить настройки также так указано в статье: т.е. RST invert выставить в True, выбрать тип программатора BSL, свой порт, сбросить галочку "Reload file". После чего следует открыть файл с прошивкой:
Как я понял, загрузчик не имеет функции проверки модели чипа в отличии от avrdude. Поэтому здесь выставлен первый попавшийся чип с 8Кб flash-памяти.
Если при нажатии на кнопку "AUTO" не появится красных надписей, то значит прошивка прошла успешно.
Если же такие надписи появились, то NAK это в принципе не страшно, мне думается что просто нужно скорость подобрать, а вот "Synchronization error" это уже означает что программа "не видит" чип, и значит что-то вы сделали не так.
Ок. Последний момент который нужно разобрать это: "как программировать?"
Начнем с Linux.
Хорошая новость заключается в том, что архитектура MSP430 поддерживается GCC. Это значит высокое качество кода, гибкая настройка оптимизации, привычный набор инструментов включая GDB.
Плохая новость заключается в том, собрать тулчейн самостоятельно для меня показалась задачей практически невозможной. В смысле у меня собиралась, но при линковке все-таки вылетала ошибка. Проблема в системной библиотеке glibc. На сайте проекта библиотеки mspgcc висит надпись : обсолит(устарело) и дальше ссылка на сайт TI. На сайте же я библиотеки не нашел, только компилятор, который при сборке требует библиотеку.
Поэтому самое простое, это взять готовый тулчейн. Он содержится в пакете Energia и к счастью имеется 64-битная версия:
http://energia.nu/downloads/downloadv3.php?file=energia-0101E0014-linux64.tgzПосле распаковки, каталог hardware/tools/msp430 нужно просто скопировать в /usr/local, после чего все заработает.
Но прежде чем начать компилировать blink, предлагаю не отворачиваться от Arduino-подобной Energia. Думаете она не сможет скомпилировать скетч под наш микроконтроллер? Не знаю как насчет программы расчета эфемерид, но Blink она мне скомпилировала)
Если заглянуть в меню "Board" там есть платы на похожих чипах: msp430g2452 и msp430g2253.
Теперь, если текстовым редактором открыть файл: hardware/msp430/boards.txt, и добавить туда секцию:
############################################################## lpmsp430g2453.name=LaunchPad w/ msp430g2453 (16MHz) lpmsp430g2453.upload.protocol=rf2500 lpmsp430g2453.upload.maximum_size=8192 lpmsp430g2453.build.mcu=msp430g2453 lpmsp430g2453.build.f_cpu=16000000L lpmsp430g2453.build.core=msp430 lpmsp430g2453.build.variant=launchpad lpmsp430g2453.upload.maximum_ram_size=512
то можно будет выбрать launchpad c нужным чипом:
Остается лишь загрузить скетч и нажать "скомпилировать":
Вуоля! И прошивка готовая лежит в каталоге /tmp/бла-бал-бла.cpp.hex
Осталось узнать, что это за такой RED_LED который мы научили мигать. Открыв файл hardware/msp430/variants/launchpad/pin_energia.h видим перед собой хорошо комментированный код:
// +-\/-+ // VCC 1| |20 GND // (A0) P1.0 2| |19 XIN // (A1) P1.1 3| |18 XOUT // (A2) P1.2 4| |17 TEST // (A3) P1.3 5| |16 RST# // (A4) P1.4 6| |15 P1.7 (A7) (SCL) (MISO) depends on chip // (A5) P1.5 7| |14 P1.6 (A6) (SDA) (MOSI) // P2.0 8| |13 P2.5 // P2.1 9| |12 P2.4 // P2.2 10| |11 P2.3 // +----+ // // Pin names based on the silkscreen // static const uint8_t P1_0 = 2; static const uint8_t P1_1 = 3; static const uint8_t P1_2 = 4; static const uint8_t P1_3 = 5; static const uint8_t P1_4 = 6; static const uint8_t P1_5 = 7; static const uint8_t P2_0 = 8; static const uint8_t P2_1 = 9; static const uint8_t P2_2 = 10; static const uint8_t P2_3 = 11; static const uint8_t P2_4 = 12; static const uint8_t P2_5 = 13; static const uint8_t P1_6 = 14; static const uint8_t P1_7 = 15; static const uint8_t P2_7 = 18; static const uint8_t P2_6 = 19; static const uint8_t RED_LED = 2; static const uint8_t GREEN_LED = 14; static const uint8_t PUSH2 = 5; static const uint8_t TEMPSENSOR = 128 + 10; // depends on chip
Здесь 20-пиновый корпус, но в целом все понятно. RED_LED это пин P1.0
Ок. теперь попробуем то же самое сделать на Си. Вариант Blink для MSP430 на Си:
#include <msp430g2453.h> int main(void) { volatile int i; WDTCTL = WDTPW | WDTHOLD; P1DIR = 0x01; P1OUT = 0x00; for (;;) { P1OUT ^= 0x01; for (i = 0; i < 0x6000; i++); } return 0; }
Здесь первым делом выключается Watchdog, т.к. в MSP430 он включен по умолчанию, а уже потом идет все остальное. На первый взгляд может показаться что ничего сложного нет, регистр на вход, регистр на уровень. Однако, если в AVR GPOI регистров для каждого порта было три, в STM8 их пять, то в MSP430 их девять!
Правда третий порт здесь "полевого образца", там РВВ поменьше. Вообще, по MSP430 очень рекомендую книгу: СЕМЕЙСТВО МИКРОКОНТРОЛЛЕРОВ MSP430x2xx. Архитектура. Программирование. Разработка приложений. Это перевод выполненный фирмой "Компэл" официального User's Guide.
Собираем:
$msp430-gcc -mmcu=msp430g2453 -Wall -Os -o blink.elf blink.c $msp430-objcopy -O ihex blink.elf blink.hex
дизассемблируем:
$ msp430-objdump -S blink.elf
./blink.elf: file format elf32-msp430 Disassembly of section .text: 0000e000 <__watchdog_support>: e000: 55 42 20 01 mov.b &0x0120,r5 e004: 35 d0 08 5a bis #23048, r5 ;#0x5a08 e008: 82 45 00 02 mov r5, &0x0200 0000e00c <__init_stack>: e00c: 31 40 00 04 mov #1024, r1 ;#0x0400 0000e010 <__do_copy_data>: e010: 3f 40 00 00 mov #0, r15 ;#0x0000 e014: 0f 93 tst r15 e016: 08 24 jz $+18 ;abs 0xe028 e018: 92 42 00 02 mov &0x0200,&0x0120 e01c: 20 01 e01e: 2f 83 decd r15 e020: 9f 4f 72 e0 mov -8078(r15),512(r15);0xe072(r15), 0x0200(r15) e024: 00 02 e026: f8 23 jnz $-14 ;abs 0xe018 0000e028 <__do_clear_bss>: e028: 3f 40 00 00 mov #0, r15 ;#0x0000 e02c: 0f 93 tst r15 e02e: 07 24 jz $+16 ;abs 0xe03e e030: 92 42 00 02 mov &0x0200,&0x0120 e034: 20 01 e036: 1f 83 dec r15 e038: cf 43 00 02 mov.b #0, 512(r15);r3 As==00, 0x0200(r15) e03c: f9 23 jnz $-12 ;abs 0xe030 0000e03e <main>: e03e: 21 83 decd r1 e040: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80 e044: 20 01 e046: d2 43 22 00 mov.b #1, &0x0022 ;r3 As==01 e04a: c2 43 21 00 mov.b #0, &0x0021 ;r3 As==00 e04e: d2 e3 21 00 xor.b #1, &0x0021 ;r3 As==01 e052: 81 43 00 00 mov #0, 0(r1) ;r3 As==00, 0x0000(r1) e056: 02 3c jmp $+6 ;abs 0xe05c e058: 91 53 00 00 inc 0(r1) ;0x0000(r1) e05c: 2f 41 mov @r1, r15 e05e: 3f 90 00 60 cmp #24576, r15 ;#0x6000 e062: fa 3b jl $-10 ;abs 0xe058 e064: f4 3f jmp $-22 ;abs 0xe04e 0000e066 <__stop_progExec__>: e066: 32 d0 f0 00 bis #240, r2 ;#0x00f0 e06a: fd 3f jmp $-4 ;abs 0xe066 0000e06c <__ctors_end>: e06c: 30 40 70 e0 br #0xe070 0000e070 <_unexpected_>: e070: 00 13 reti Disassembly of section .vectors: 0000ffe0 <__ivtbl_16>: ffe0: 6c e0 6c e0 6c e0 6c e0 6c e0 6c e0 6c e0 6c e0 l.l.l.l.l.l.l.l. fff0: 6c e0 6c e0 6c e0 6c e0 6c e0 6c e0 6c e0 00 e0 l.l.l.l.l.l.l...
Ну здесь вообще красота, AVR нервно курит в сторонке ;) Запись константы в ячейку памяти одной командой, никаких промежуточных манипуляций с регистрами! BSET? Нафиг! XOR работает напрямую с РВВ! Это же ортогональная система команд! Волшебный цикл из пяти команд? Здесь он занимает всего цетыре!
Красота! Одним словом, мне здесь все нравится)
Для IAR текст программы практически не отличается:
Но там в свойствах линкера нужно указать, формат выходной прошивки Intel. После чего программу можно компилировать в hex файл и затем подхватывать его флешером.
Последняя момент, о котором осталось упомянуть: если кого-то при рассматривании распиновки микросхемы смутил знак инверсии над RST, то совершено справедливо. При подключении микроконтроллера на RST нужно подавать положительный потенциал, т.е. DVCC.
P.S. Потребление чипа в активном режиме от батареи 3.4(новая) составило 366мкА, от батареи 3.05(подсевшая) - 335 мкА. Т.е. почти в два раза меньше чем ATtiny13A.