MSP430: быстрый старт с бюджетом в 150р.

разделы: MSP430 , дата: 20 апреля 2016г.


Чип 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 можно почитать здесь:

Переход с микроконтроллеров MSP430F1xx на MSP430F2xx

Кроме основной линейки 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.

поделиться: