Начинаем работать с микроконтроллерами msp430

Программинг микроконтроллеров / MSP430, учимся программировать и отлаживать железо (часть 3)

Возможно Вы уже не первый раз садитесь за программирование Вашего MSP430. Если это не так, то рекомендую ознакомиться с предыдущими статьями по данной тематике: часть 1, часть 2.

В этой статье мы рассмотрим инструмент для графической настройки периферии нашего микроконтроллера — Grace, познакомимся с принципом работы watchdog и поработаем с виртуальным COM-портом (через программатор).

Уже традиционно будет рассмотрен небольшой пример кода, и предоставлены все необходимые для понимания ссылки.

Введение

В первой статье я упоминал Code Composer Studio, от рассмотрения которого отказался, но недавно моё внимание, благодаря Соколову А.В., привлёк один плагин для неё — Graphical Peripheral Configuration Tool (Grace).

Каждый раз, когда приходится настраивать очередной периферийный модуль MSP430, мы сталкиваемся с рядом сложностей.

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

Grace

Скачать и установить этот инструмент можно вместе с Code Composer Studio v5 по следующей ссылке. Для этого потребуется зарегистрироваться на сайте Texas Instruments.

После установки CCS выбираем Project→New CCS Project, в облати Project templates and examples выбираем Empty Project→Empty Grace (MSP430) Project, в области Device не забудьте указать микроконтроллер из списка. Как только появится экран «Grace — Welcome», нажимаем клавишу Device Overview. Перед Вами появится следующая картинка.

Кликнув по конкретному устройству на ней, Вы перейдёте к его настройке, которую можно производить в нескольких режимах. Режимы могут отличаться для разных устройств, но обычно это Basic User, Power User и Registers. Basic User и Power User предназначены для быстрой настройки периферийного устройства интуитивно.

Registers отображает список всех регистров устройства и позволяет менять их значения.Совет: в datasheet к микроконтроллеру не всегда содержится полная информация об интересующем устройстве, про все регистры и параметры обычно можно прочитать в файле MSP430xxxx Family User's Guide, который можно скачать на сайте Texas Instruments.

Поскольку для работы я уже привык использовать Workbench, после завершения настройки, все конфигурационные данные требуется перенести туда. Для этого нажимаем Project→Build All, находим в папке проекта директорию /src/csl/, в ней и находятся все *.c файлы с конфигурацией каждого устройства.

Пример кода

Следующий код работает с USB-UART мостом встроенным в программатор, так же в код включено использование watchdog, но обо всём по порядку.
 

#include “msp430f2274.h”

#include 

void UARTWriteString(string str);

bool watchdogReset = true;

void main(void)

{

  WDTCTL = WDT_MRST_32; // Watchdog автоматически

                        // перезапустит систему через 32ms.

  BCSCTL1 = CALBC1_1MHZ; // Устанавливаем тактовую частоту Basic Clock System.

  DCOCTL = CALDCO_1MHZ; // Устанавливаем тактовую

                        // частоту Digital Controlled Oscillator.

  P3SEL = BIT4 + BIT5; // Выбираем функцию P1.4/P1.5 как TXD/RXD для UART.

  UCA0CTL1 |= UCSWRST; // Этот бит блокирует работу прерываний от UART и работу 

                       // сдвигового регистра чтобы не мешать

                       // настройке (грубо говоря отключает UART).

  UCA0CTL1 |= UCSSEL_2; // Наш UART будет работать от 

                        // SMCLK (Sub-main clock), тоесть от 1MHZ.

  UCA0BR0 = 0x68; // Делитель частоты для SMCLK (1000000 / 9600).

  UCA0BR1 = 0x00;

  UCA0MCTL = 0x04; // Определяет маску модуляции.

                  // Это помогает минимизировать ошибки.

  UCA0CTL1 &= ~UCSWRST; // Включаем UART обратно.

  P1DIR |= BIT0; // Настройка светодиодов.

  P1DIR |= BIT1;

  P1OUT &= ~BIT0;

  P1OUT &= ~BIT1;

  UARTWriteString(“—Привет, Хабр!—“);

  unsigned char data;

  while(true)

  {

    while (!(IFG2&UCA0RXIFG)) // Проверка готовности буфера приёма.

      if(watchdogReset)

        WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.

    data = UCA0RXBUF;

    if(data == 0x01)

    {

      UARTWriteString(“—Погасить зеленый светодиод.—“);

      P1OUT &= ~BIT1;

    }

    else if(data == 0x02)

    {

      UARTWriteString(“—Зажечь зеленый светодиод.—“);

      P1OUT |= BIT1;

    }

    else if(data == 0x03)

    {

      UARTWriteString(“—Переключить состояние красного светодиода.—“);

      P1OUT ^= BIT0;

    }

    else

    {

      UARTWriteString(“—Принятые данные не соответствуют.—“);

      watchdogReset = false;

    }

  }

}

void UARTWriteString(string str)

{

  int strSize = str.length();

  for(int i = 0; i 

Источник: http://www.pvsm.ru/msp430/1472

Начинаем работать с микроконтроллерами MSP430

Целью данной статьи является помощь в начале освоения микроконтроллеров MSP430 фирмы Texas Instruments.

Была сделана попытка систематизировать действия, которые позволят минимальными усилиями сделать первые шаги в освоении данного типа микроконтроллеров, не перегружая при этом специфичными и иногда трудными (если не сказать отталкивающими) сведениями. Статья не претендует на полноту обзора указанных микроконтроллеров, а лишь позволяет сделать первые шаги на пути их освоения.

Преимущества MSP430:

1. Очень широкая линейка для практически любых задач.

2. Очень широкий ряд корпусов, от DIP до очень мелких типа pqfp.

Весь доступный ряд можно посмотреть с помощью удобной странички от TI:

Перейдя по ссылкам слева и выбирая нужную серию попадаем в каталог:

Где можно выбрать нужный себе кристалл по объему Flash-памяти, ОЗУ, наличию USART, АЦП, корпуса и т.д. Сразу скажу, что я не использовал корпуса типа DIP. Корпус типа SOIC легко распаивается на самодельную плату изготовленную по технологии ЛУТ. Достаточно стабильно у меня получаются платы и для корпусов типа PW (расстояние между ногами 0,65мм).

3. Сверхнизкое потребление питания (бывает ну крайне важно). На этом остановимся поподробнее ниже с примерами и цифрами.

4. Мне также например нравиться то, что для одного и того же типа корпуса расположение ног для разных серий и типов в пределах серии одинаково. Это дает возможность легко заменить один тип на другой без изменения печатной платы.

5. Немаловажно, что все типы микроконтроллеров можно бесплатно заказать у TI для освоения.

В качестве примера два разных MSP430 в одинаковом корпусе, MSP430f2619 и MSP430f149:

Для начала освоения выберем msp430f1232 или msp430f1222, они отличаются только объемом flash памяти и абсолютно идентичны по расположению ног. Я считаю этот микроконтроллер самым ходовым в радиолюбительской практике. Его плюсом можно также назвать наличие модели его младшего брата msp430f1121 (без usart) в Proteus.

На этой странице есть даташит, а по этой ссылке прочие документы.

Документация от TI имеет особенность (для тех кто уже знаком с микроконтроллерами от, например AVR ATMEL).

В даташите указываются специфичные именно для этого камня особенности (количество памяти, наличие USART, электрические характеристики и т.д.).

А описание регистров находятся в документе MSP430x1xx Family User's Guide (Rev. F) для серии msp430f1xx. Этот документ общий для всей серии.

Есть также настольные книги “руководство пользователя” и “рекомендации по применению”.

А также примеры исходных кодов для семейства msp430f1x по ссылке.

Итак, начнем.

Минимальная обвязка для включения микроконтроллера:

Сперва нам понадобятся макетка и программатор.

Пример моей макетки в файле к статье.

Теперь небольшое отступление на предмет программатора.

Микроконтроллеры msp430 могут быть запрограммированы следующим образом: 4-х проводной JTAG (прошивка и отладка (очень удобно)) бывает LPT и USB. 2-х проводной JTAG, так называемый Spyi-Bi-wire (прошивка и отладка) только USB.

BSL – последовательный интерфейс (только прошивка). COM или USB-COM.

Не все микроконтроллеры могут быть зашиты всеми указанными программаторами. Смотреть надо в даташите на каждый камень. (Так рекомендуемые для начала работы MSP430F1232 можно шить только по 4-х проводному JTAGу или по BSL) .

Где взять программатор? Естественно можно купить. Есть дорого фирменные от TI или от Olimex, а также море китайских клонов.

Например BSL (хотя bsl можно сделать из любого шнурка от сотового в котором есть линии RTS и DTR) можно найти на AliExpress.
JTAG через USB
JTAG через LPT

Также на сайте TI можно почти за даром заказать LaunchPad:

Который в своем составе имеет 2-х проводной JTAG Spy-Bi-Ware USB, но к сожаленью этот Spy-Bi-Wire есть не во всех камнях. Я поигрался. Мне не пригодилось (у меня практически не было камней с поддержкой spy-bi-wire) и я его отдал другу для освоения.

Также программатор можно сделать и самостоятельно. Где взять детали, смотрите в конце статьи.

В архиве программатор bsl.rar схема BSL программатора на переходнике USB-COM

В архиве программатор JTAG LPT-FET.rar схема и печатка для программатора LPT-FET. Необходимо отметить, что это упрощенная мной схема LPT-FET от Olimex

И ей требуется внешнее питание 3.3В от платы микроконтроллера. Плата получилась компактная и умещается в корпус DB-25.

Для BSL программатора корпуса еще нет, но скорее всего это будет кусок кабель-канала нужного сечения.

Выходные сигналы BSL программатора выведены на разъемы типа PLS. И отдельно выведено питание 3.3В (бонусом так сказать)

Оба типа мной собраны и работают.

Программировать через JTAG можно из среды разработки. А для программирования через BSL используется бесплатная и удобная программа от Kurt-а MSPFET. (Приложена в архиве или может быть скачана по ссылке)

Разработка кода может вестись в различных средах

Например:
http://sourceforge.net/apps/mediawiki/mspgcc/index.php?title=MSPGCC_Wiki
http://www.ti.com/tool/iar-kickstart с ограничение размера кода до 4кБ
http://www.ti.com/tool/ccstudio-msp430 IDE от TI
И другие…

Я использую IAR. Причем я не беру IAR от TI с ограничением кода, а спокойно зарегистрировавшись на iar.com скачиваем 30 дневную полнофункциональную версию IAR для msp430. (а потом можно и еще раз скачать и т.д.) по ссылке

Итак, допустим макетка сделана (нам в первую очередь нужно запаять стабилизатор на 3.3Вольта, светодиод на ножку P1.0 и разъем для LPT-FET. Кварц и прочее можно допаять позже). Программатор LPT-FET тоже.

Устанавливаем и запускаем IAR. Нажимаем create new project:

Выбираем шаблон:

Даем свое название и вот окно проекта с типовым шаблоном.

Перво наперво правой кнопкой мыши кликаем по: название – debug -> option

Выбираем наш микроконтроллер

Меняем тип отладчика

Задаем, что у нас программатор lpt от olimex на lpt1

В окне сишного кода меняем весь на код из файла demo led.c, нажимаем F7 и видим:

Нажимаем зеленый треугольник и происходит заливка кода в микроконтроллер:

В открывшемся окне нажимаем “GO” старт программы:

В итоге, видим мигающий светодиод на плате.

Если у вас программатор типа BSL, то порядок действий следующий: в IAR выбираем нужный контроллер. Пишем код (например demo led.с).

Правой кнопкой по debug, option и ставим настройки в пункте linker как на рисунке:

Жмем F7. Запускаем MSPFET от Kurta. Открывается окно. Нажимаем Setup. Выбираем программатор BSL.

Ставим настройки для выходных ног, патча бутлодера (есть фишка, но нам сейчас не надо), скорости (тоже пока не надо) и т.д.

Для программатора сделанного из TUSB3410 настройки выглядят так.

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

Меню, открыть, и идем в каталог где лежит наш тестовый проект. В нем ищем каталог Debug. В нем ищем каталог EXE:

И там выбираем файл прошивки с расширением .a43:

Открываем. Нажимаем кнопку auto. Все процесс пошел. В случае удачных действий получаем картинку

И мигающий светодиод. (Если в настройках msp-fet от Kurta поставить галочку перегружать файл, то в дальнейшем нет необходимости повторять все действия. Изменил прошивку в IAR. Нажал F7. Зашел в MSPFET. Нажал auto.)

Теперь вкратце об особенностях микрконтроллеров msp430.

Супер гибкая система тактирования. В примере мы использовали внутренний генератор на 750кГц. Можно изменять его частоту регистрами настройки DCO (смотри руководство пользователя).

Можно на ноги XIN XOUT повесить кварц часовой или высокочастотный (причем для часового кварца конденсаторы уже есть внутри камня и их номинал можно выбирать). В программе можно легко переключаться с одного источника тактирования на другой.

В купе с разными режимами спячки можно обеспечить беспрецедентное снижение энергопотребления. Например, затактировать таймер от ACKL настроенный на 32768Гц от часового кварца. Разрешить прерывание от таймера.

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

Вот простой пример для повторения.

Зашьем код из файла norma.c

Включаем через миллиамперметр и видим, что в моменты когда светодиод не горит ток потребления 230мкА.

Зашьем код из файла LPM0.c

Включаем через миллиамперметр и видим, что ток потребления 50мкА. (Данные замеры проводились тестером на пределе 20мА, но в качестве иллюстрации сойдет). Особенно целесообразно применение данных микроконтроллеров в паре с ЖК экранами, где столь малое энергопотребление проявляется в полной мере.

Кстати такое низкое потребление порождает и соответствующие проблемы, связанные с паразитным питанием. Особенно если учесть, что для питания достаточно 1.8В.

При довольно насыщенной схеме, контроллер стартует от всего подряд, вплоть до usart. Поэтому будьте внимательны.

Часто, микроконтроллер не выходит на связь с JTAG, пока не отключишь внешние схемы (если не приняты меры по исключению паразитного питания и согласования уровней).

Что не очень понравилось в MSP430 0- так это неудобно реализованная работа с Flash памятью для хранения каких либо переменных пользователя. Так называемая память info разбита на сегменты по 128 байт и беда в том, что записать можно в каждую ячейку отдельно, но только один раз.

Для изменения ранее записанной ячейки необходимо стереть весь сегмент и заново записать в нужную ячейку.

Это приводит к тому, что перед изменением любой ячейки необходимо сначала прочитать в ОЗУ все используемые ячейки, изменить необходимую, стереть весь сегмент и записать из ОЗУ все во info flash.

Итак, первый проект Вы удачно сделали и зашили в контроллер. Что дальше?

Для освоения периферии мне очень помогли примеры использования MSP430 от TI, ранее упомянутые в статье. Много примеров и проектов есть в книге “рекомендации по применению” от КОМПЭЛ.

Раздел на форуме по MSP430

Если вы решили сами собрать программатор для MSP430, то я рекомендую зарегистрироваться на сайте TI с указанием своего реального номера телефона и может быть даже выдуманным местом работы.

Заказать в качестве бесплатных образцов следующие компоненты: –   MSP430F1222IDW корпус soic –   MSP430F1232IDW корпус soic –   преобразователь COM-usb tusb3410 (для bsl программатора)

–   стабилизатор reg104-3.3 в корпусе SOT223-5

Привезут в течении недели, возможно перед этим позвонят и спросят на русском языке зачем Вам это необходимо. Тут уж каждый сам за себя. Придумывайте что хотите. Как привезут, позвонят еще раз из службы доставки. Именно поэтому должен быть правильный телефон и адрес.

Скачать файлы к статье

Список радиоэлементов

ОбозначениеТипНоминалКоличествоПримечаниеМагазинМой блокнотU2T1С6R1-R5, R12, R15–R17, R19R6R7-R9R18U2U5С6С9, С10С11, С12, С15Сout(1)R17R18R20, R27, R28R21, R22R25R31Q2Jp1J1
Программатор JTAG LPT-FET
ИС буфера, драйвера SN74HC244 1 Поиск в магазине В блокнот
Биполярный транзистор BC846 1 Поиск в магазине В блокнот
Конденсатор 0.1 мкФ 1 Поиск в магазине В блокнот
Резистор 33 кОм 10 Поиск в магазине В блокнот
Резистор 82 Ом 1 Поиск в магазине В блокнот
Резистор 330 Ом 3 Поиск в магазине В блокнот
Резистор 3.3 кОм 1 Поиск в магазине В блокнот
Разьем DB25-MALE 1 Поиск в магазине В блокнот
Разьем для подключения к программируемой схеме 1 Поиск в магазине В блокнот
BSL программатор
Линейный регулятор REG104-33 1 Поиск в магазине В блокнот
ИС USB интерфейса TUSB3410 1 Поиск в магазине В блокнот
Микросхема 24LC1281/SN 1 Поиск в магазине В блокнот
Конденсатор 1 мкФ 1 Поиск в магазине В блокнот
Конденсатор 33 пФ 2 Поиск в магазине В блокнот
Конденсатор 0.1 мкФ 3 Поиск в магазине В блокнот
Электролитический конденсатор 0.1 мкФ 1 Поиск в магазине В блокнот
Электролитический конденсатор 1 Поиск в магазине В блокнот
Резистор 10 кОм 1 Поиск в магазине В блокнот
Резистор 15 кОм 1 Поиск в магазине В блокнот
Резистор 1.5 кОм 3 Поиск в магазине В блокнот
Резистор 33 Ом 2 Поиск в магазине В блокнот
Резистор 470 Ом 1 Поиск в магазине В блокнот
Резистор 47 кОм 1 Поиск в магазине В блокнот
Кварцевый резонатор 12 МГц 1 Поиск в магазине В блокнот
Джампер 1 Поиск в магазине В блокнот
Разьем микро-USB 1 Поиск в магазине В блокнот
Добавить все

Скачать список элементов (PDF)

Источник: http://cxem.gq/mc/mc165.php

Начало работы с MSP430

Недавно приобрел отладочную плату для MSP430 микроконтроллеров LaunchPad, компании Texas Instruments. Цена платы всего лишь каких-то халявных 140 рублей (и это с быстрой FedEx доставкой из штатов), заказывал прямо на сайте ti.com, но можно купить где угодно, правда дороже.

Так как я работаю в Ubuntu Linux, то встала проблема компиляции программ, пока что не получилось заставить работать студию CCS 5.

1, поэтому пока решил использовать более легкую «артиллерию», а в частности легкий компилятор ассемблера naken430asm. Для заливки программы в микроконтроллер использую программу mspdebug, которая есть в репозитории Ubuntu.

Также в репозитории есть пакет gcc-msp430, так что можно писать программы без всякой студии и на си, но сейчас речь пойдет об ассемблере.

Итак, собрал naken430asm из исходников:

$ ./configure
$ make
$ sudo make install

Установил mspdebug:

$ sudo apt-get install mspdebug

Всё, теперь можно писать программы на ассемблере, перед этим почитайте README файл в директории, откуда ставится naken430asm.

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

Проблема тут еще видимо в том, что в комплекте идут уже новые микроконтоллеры в корпусах DIP20 — MSP430G2553 и MSP430G2452, и у них другие первоначальные настройки.

В итоге нашел выход из ситуации путем дизассемблирования уже установленной программы в первом микроконтроллере (он мигает двумя светодиодами, и перестает это делать при нажатии на кнопку), не зря я не стал стирать этот МК, а сразу стал тренироваться на втором пустом.

Дизассемблировал программу в первом микроконтроллере:

$ sudo mspdebug rf2500
(mspdebug) dis 0xf800

Аккуратно переписал какие адреса инициализируются значением 0x08 (как несложно догадаться, это порт P1.3 на котором висит наша кнопка 0123-1248). Смотрим в файле определений /usr/local/share/naken430asm/include/msp430x2xx.inc что эти адреса значат.

После этого уже не составило труда написать нужную нам программу (код ниже). Компилируется программа так:

$ naken430asm blink.asm

Если всё нормально, то на выходе получаю файл out.hex, который залить в пустой микроконтроллер (да что там кривить душой, и в не пустой тоже) можно так:

$ sudo mspdebug rf2500 «prog out.hex»

Через секунду отладочная плата оживает, светодиодом мигает, при нажатии на кнопку включает второй светодиод.

Первый шаг в изучении MSP430 сделан, далее в планах исследование сенсорных кнопок.

Исходный код blink.asm:

.include «msp430x2xx.inc» ; Подключение файла /usr/local/share/naken430asm/include/msp430x2xx.inc LED1 equ 0x01 ; Код светодиода 1
LED2 equ 0x40 ; Код светодиода 2
BUT1 equ 0x08 ; Код кнопки org 0xfffe ; Reset dw init ; Указываем адрес для перехода при сбросе org 0xf800 ; Адрес размещения нашей программы
init: mov.w #WDTPW+WDTHOLD, &WDTCTL ; Отключить сторожевой таймер — Watchdog/timer control mov.b #LED1+LED2, &P1DIR ; Включить выходной порт только для встроенных светодидов ; Подготавливаем МК для считывания нажатия кнопки, без какой-то из этих директив не работает (информация взята из дизассембированного кода прошитого МК) bic.b #BUT1, &P1DIR ; Очистить — Port P1 direction bis.b #BUT1, &P1OUT ; Установить — Port P1 output bis.b #BUT1, &P1REN ; Установить — Port P1 resistor enable bis.b #BUT1, &P1IES ; Установить — Port P1 interrupt edge select bic.b #BUT1, &P1IFG ; Очистить — Port P1 interrupt flag bis.b #BUT1, &P1IE ; Установить — Port P1 interrupt enable blink: mov.w #30000, R15 ; Количество циклов перед переключением светодиода xor.b #LED2, &P1OUT ; Меняем светимость светодиода 2 на обратную
scan: dec.w R15 ; Уменьшаем значение R15 на 1 jz blink ; Если = 0, начать заново цикл свечения светодиода bit.b #BUT1, &P1IN ; Проверяем нажатие кнопки jnz off ; Если не нажата, то перейти к выключению светодиода, иначе перейти дальше, на включение светодиода
on: bis.b #LED1, &P1OUT ; Включить светодиод 1 jmp scan ; Перейти на сканирование кнопки
off: bic.b #LED1, &P1OUT ; Выключить светодиод 1 jmp scan ; Перейти на сканирование кнопки

29 декабря 2011

msp430

Источник: http://ibnteo.klava.org/2011/12-29-msp430

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 видим перед собой хорошо комментированный код:

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;

Здесь 20-пиновый корпус, но в целом все понятно. RED_LED это пин P1.0

Ок. теперь попробуем то же самое сделать на Си. Вариант Blink для MSP430 на Си:

#include int main(void) { volatile int i; WDTCTL = WDTPW | WDTHOLD; P1DIR = 0x01; P1OUT = 0x00; for (;;) { P1OUT ^= 0x01; for (i = 0; i

Здесь первым делом выключается 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 : 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 : e00c: 31 40 00 04 mov #1024, r1 ;#0x0400 0000e010 : 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 : 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 : 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 : e066: 32 d0 f0 00 bis #240, r2 ;#0x00f0 e06a: fd 3f jmp $-4 ;abs 0xe066 0000e06c : e06c: 30 40 70 e0 br #0xe070 0000e070 : e070: 00 13 reti Disassembly of section .vectors: 0000ffe0 : 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.

поделиться:

Источник: http://www.count-zero.ru/2016/msp430_quick_start/

MSP430, учимся программировать и отлаживать железо

Сегодня, уважаемый хабрапользователь, я постараюсь заполнить некоторый пробел, образовавшийся в статьях об MSP430, а именно азы и подход к программированию устройств на данном микроконтроллере. Эта статья прежде всего направлена на новичков, поскольку я буду рассматривать ряд достаточно простых задач, таких как работа с SPI, мигание лампочкой и отладка в proteus.

Введение

В данной статье будет рассмотрено устройство, в основу которого легла отладочная плата eZ430-RF2500. На плате находится микроконтроллер MSP430F2274 и беспроводной модуль CC2500, который, надо заметить, не будет рассмотрен далее. Моим коллегой, Соколовым С. А.

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

Должен заметить, что устройства STMicroelectronics, работающие по SPI, очень похожи и, соответственно, работа с ними будет выглядеть примерно также.

Что нам потребуется

Среда разработки

Для начала нужно скачать и установить среду разработки и компилятор. На сегодняшний день существует три варианта — Code Composer Studio, IAR Embedded Workbench for TI MSP430 и mspgcc.
Я буду использовать Workbench KickStart Edition. KickStart бесплатный, он имеет ограничение по количеству кода, но для изучения этого более чем достаточно.

Средство отладки

Если у вас нет под рукой осциллографа или логического анализатора, то часто возникают сложности, связанные с непониманием того, что же на самом деле происходит в вашем устройстве.

Понять причины того, почему же устройство отказывается работать часто помогает Proteus. В нём можно найти очень многие микроконтроллеры MSP430.

К сожалению MSP430F2274 в Proteus не оказалось, но имеется аналог — MSP430F2272, его и будем использовать.

Приступим к написанию кода

Создание проекта

На данном этапе сложностей возникнуть не должно. В качестве языка программирования выбираем C++.

  • Заменяем стандартный #include «io430.h» на #include «msp430f2274.h» (заголовочный файл для нашего микроконтроллера);
  • В свойствах проекта на вкладке Debugger выбираем Driver: FET Debugger;
  • На вкладке General Options в окне Device выбираем MSP430F2274;
  • Для того чтобы убедиться, что всё сделано правильно нажимаем Ctrl+D (Download and Debug). Как только контроллер прошивка загрузится нажимаем F5 для её выполнения.

В случае если нужно скомпилировать файл для Proteus, на вкладке Debugger в окне Driver выбираем Simulator, а на вкладке Linker Output в окне Format ставим Other и Output format выбираем intel-standart, а в окне Output file меняем расширение на hex.

Работа с портами

Первое, что стоит освоить в микроконтроллере — это работа с портами. Давайте рассмотрим небольшой пример.

PxDIR отвечает за направление порта 1.

Когда конкретный бит данного регистра установлен в 0, соответствующий пин работает на вход. И наоборот, если соответствующий бит установлена в 1, то пин работает на выход. В примере фигурируют 3 пина: P1.

2 — кнопка, P1.0 — красный светодиод, P1.1 — зеленый светодиод.

PxREN включает внутренний резистор подтяжки. Кнопка замыкает пин на землю, и, соответственно, переводит его в состояние нуля. Когда кнопка не нажата пин ни к чему не подключен и для обеспечения логической единицы на нём требуется подключить его через резистор к питанию, что и делает регистр P1REN.

PxIN и PxOUT содержат в себе состояние пинов порта. Устанавливая ноль или единицу в регистр PxOUT мы меняем напряжение на лапке микроконтроллера, тем самым включая и выключая светодиод. Читая конкретный бит из регистра PxIN мы получаем логический сигнал, который сейчас подан на пин.

PxSEL выбирает функцию пина. В datasheet на изображении микроконтроллера функции обычно указывают через знак «/».

Например на рисунке P2.7 работает как обычный пин в случае, если P2SEL имеет 0 в соответствующем разряде. По умолчанию, в данном случае, там установлена единица, что означает, что эта лапка предназначена для подключения внешнего часового кварцевого резонатора.

Константы BIT0..BITF содержатся в файле msp430f2274.h и представляют собой 16-ти разрядные слова в заданном разряде которых содержится 1, все остальные разряды содержат 0.

Надо заметить, что файл msp430f2274.h содержит много полезной информации. Там находятся все константы контроллера с комментариями на английском.

В примере используются побитовые операции Си, «|=» установит соответствующий значению справа бит в регистре слева в единицу, а «&= ~» напротив установит его в 0. Что получилось:

Работа с SPI

Сразу начну с примера В примере запрашивается значение регистра по адресу 0x8F, там содержится код, который идентифицирует устройство. Этот код указан в datasheet.

Это позволяет убедиться в том, что обмен данными произошел. В случае успеха включаем красный светодиод. Соответственно все остальные устройства подключенные к SPI необходимо отключить от интерфейса.

Для этого CS на них устанавливается в единицу.

Заключение

В следующий раз постараюсь рассказать подробнее про работу с LIS331DLH, добраться до прерываний, поработать со встроенным в программатор мостом USB-UART и рассказать немного про watchdog.

Я надеюсь, что эта статья оказалась полезна тебе, читатель.

Источник: https://habr.com/post/137205/

Уроки MSP430 LaunchPad. Урок 11: Экономия, должна быть экономной!

Мы уже обрели, определенную степень контроля над MSP430, это хорошая возможность узнать о режимах пониженного потребления энергии. Это одна из важнейших особенностей MSP430, и прекрасная причина для выбора именно этого микроконтроллера, вместо других. Посмотрим, как эти режимы работают.

В руководстве по семейству микроконтроллеров x2xx, на странице 29, приведена диаграмма и таблица, разъясняющие, как работают режимы системы тактирования. Для нашего удобства, TI выделили 6 разных режимов, к которым нам будет проще доступиться через определения в заголовочном файле.

MSP430 начинает работу в Активном Режиме, когда ЦПУ и вся периферия включены. Это режим работы, в котором мы использовали микроконтроллер во всех предыдущих уроках. Каждый раз, когда MSP430 необходимо что-то сделать, это происходит в Активном Режиме. Но это не означает, что периферия не способна работать в других режимах.

Всего есть 5 режимов пониженного энергопотребления (Low Power Mode (LPM)), сокращенно называющихся LPM0, LPM1, LPM2, LPM3 и LPM4. Они конфигурируются четырьмя битами регистра состояния SR, и являются основными режимами работы микроконтроллера.

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

Функция _BIS_SR(), с которой мы уже встречались раньше, возможно простейший способ, использования LPM. Заголовочный файл содержит ряд имён, с общим шаблоном LPMx_bits для облегчения установки правильных битов. Для включения режима пониженного энергопотребления, просто добавьте команду _BIS_SR(LPMx_bits); заменив x на номер нужного режима LPM.

Помните о том, что если вам нужно использовать прерывания, к битам настроек регистра состояния необходимо добавить GIE, или функцию _enable_interrupt(); до входа в режим LPM. Другой, важный момент, о котором необходимо помнить, это то, что режимы LPM, индивидуальны, т.е. за один раз, один режим. Не нужно пытаться объединить несколько режимов в одной команде.

Речь идет о подобных сочетаниях: _BIS_SR(LPM0_bits + LPM1_bits + GIE); попытка использовать такую команду, приведет к нежелательным побочным эффектам. Одна из особенностей архитектуры MSP430, это то, что вам не нужно следить за тем, что бы ЦПУ проснулся для обработки прерывания, и не нужно возвращать ЦПУ в режим LPM, после обработки прерывания. Всё это, происходит автоматически.

Когда возникает прерывание, регистр состояния помещается в стек, затем ЦПУ просыпается, дабы ублажить обработчик прерывания. Когда обработчик прерывания будет удовлетворен, исходный регистр состояния (SR), вместе с содержащимися в нем битами настройки LPM, возвращается на законное место и усыпляет ЦПУ.

Если по логике программы, вам нужно оставить ЦПУ в рабочем состоянии, то, в обработчик прерывания, необходимо включить команду обнуления битов режима LPM:_BIC_SR(LPMx_bits); // обнуляем биты LPMx и выходим из режима пониженного энергопотребления
Обратите внимание на отличие имени функции _BIS_SR() (Bit Set Status Register) установка битов регистра состояния, от _BIC_SR() (Bit Clear Status Register) очистка битов регистра состояния, или обнуление.

Читайте также:  Компания toshiba выпустила новую nand flash память по 19 нм технологии

(Насколько я понимаю, функция _BIC_SR(), обнуляет биты именно в том регистре состояния, который лежит в стеке, и её нужно применять перед самым выходом из обработчика прерывания. В заголовочных файлах IAR, установку режимов LPM, еще больше сократили (сохранив описанные здесь мнемоники), и достаточно написать, что-то вроде LPM1; что бы войти в режим LPM1. А для выхода из режима LPM1, достаточно в конце обработчика прерывания написать LPM1_EXIT; – Прим. пер.)

В качестве примера, я написал простенькую программку, которая гудит динамиком 8 Ом. У меня есть динамик, с двумя выводами, расстояние между которыми 0.2”, и он идеально воткнулся в линейку выводов на LaunchPad. Что бы он вместился, я использовал выводы P1.0 и P1.2 микроконтроллера.

Если у вас нет динамика, вы можете реализовать ту же идею, через зажигание двух светодиодов на LaunchPad. Просто замените в коде значение SOUT, с BIT2 на BIT6, и подберите соответствующую частоту срабатывания таймера. Идея простая, мы стартуем с высоким уровнем на выводе P1.0 и низким на P1.2, а потом меняем их с заданной частотой.

Это будет генерировать квадратную волну, не самый прекрасный звук, но гудит. Запомните, что звуковые частоты главным образом расположены в диапазоне от 10 Гц до 1000 Гц. Интересно узнать, насколько низкую частоту вы сможете услышать (щелчки не считаются, только основной тон) и насколько высокую.

Для уменьшения громкости, можно оставить один из выводов в состоянии ноля, и переключать только второй.

Вот текст программы (тест оригинала limboG2211.c):

/* limboG2211: Тест режима пониженного энергопотребления. * Проверка как режим LPM влияет на поведение портов ввода/вывода. * Необходимо иметь динамик, подключенный к выводам P1.0 и P1.2, но можно * эмулировать его работу двумя светодиодами на выводах P1.0 and P1.6, * уменьшив частоту достаточно, для наблюдения за миганием. * Для эмуляции нужно заменить определение SOUT на * #define SOUT BIT6 и понизить частоту, увеличив значение в TACCR0. */ #include #define SPKR BIT0 #define SOUT BIT2 void main(void) { WDTCTL = WDTPW + WDTHOLD; // отключаем сторожевой таймер P1OUT = SPKR; // Правильнее было бы начать с обнуленным SPKR, // но так проще заменить динамик светодиодом. P1DIR = SPKR + SOUT; // Другой вывод динамика прижат к земле. // Можно увеличить громкость, переключая // SOUT и SPKR в противоположные состояния, одновременно. BCSCTL1 = CALBC1_1MHZ; // Частота тактового сигнала 1 мГц DCOCTL = CALDCO_1MHZ; TACCR0 = 144; // С делителем частоты на 8 (125 kHz), это значение // даёт частоту 125000/(TACCR0+1) Гц. // Для TACCR0 = 144, получаем 862 Гц. TACCTL0 = CCIE; // Разрешаем прерывание таймера по достижению значения CCR0. TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // Настройка режима работы таймера Timer_A: // TASSEL_2 – источник тактов SMCLK (SubMainCLocK), // по умолчанию настроенных на работу от DCO // ID_3 – делитель частоты на 8, от 1MHz это будет 125kHz // MC_1 – режим прямого счёта (до TACCR0) // TACLR – начальное обнуление таймера _BIS_SR(LPM0_bits + GIE); // Входим в режим LPM0 и разрешаем прерывания } // main /* Обработчики прерываний */ #pragma vector = TIMERA0_VECTOR __interrupt void CCR0_ISR(void) { P1OUT ^= SPKR + SOUT; // Взаимо-переключение выходов на динамик. } // CCR0_ISR
Архив с программами из урока.

Упражнение: В этой программе использован режим LPM0. Попробуйте остальные режимы, заменив LPM1_bits на другой. Что случается при попытке включить режим LPM1? LPM2? LPM3? LPM4? Можете объяснить, почему некоторые режимы работают, а некоторые нет?

Примечания переводчика: Я использовал пьезо-зуммер, всё заработало. Только поменял название вектора прерывания на TIMER0_A0_VECTOR, т.к. у меня G2553. Если кто не понял сути примера, то обратите внимание на то, что в функции main(), отсутствует бесконечный цикл. Если не усыпить ЦПУ вечным сном, то он выскочит за границы кода.

Если вы делали предыдущее упражнение, то заметили, что программа работает только в режимах LPM0 и LPM1. Причина этого, в выборе источника тактовых сигналов для таймера. Давайте подробней разберем, что именно делает предыдущий пример. Во-первых, мы устанавливаем внутренний генератор DCO, на откалиброванную частоту 1 мГц. Думаю всем понятно, что основной тактовый сигнал (MCLK), управляет ЦПУ, генерируя ему такты с частотой 1 мГц. То, что может быть не очевидно, что дополнительный тактовый сигнал (SMCLK), так же генерируется DCO, и его частота тоже 1 мГц. Таймер настроен на работу от SMCLK с делителем на 8, или 125 кГц. Таймер считает до значения TACCR0, и генерирует прерывание, в котором переключается направление тока через динамик (или светодиод, если вы так сделали). Из-за того, что частота переключения, достаточно высока, динамик издаёт однотонный звук.

Между переключениями, MSP430 находится в режиме LPM0. Мы можем понять, что именно происходит с микроконтроллером в этом режиме, если посмотрим на картинку в начале урока. Бит CPUOFF в регистре состояния SR устанавливается в 1, что приводит к отключению ЦПУ и тактовых сигналов MCLK, тактовые сигналы SMCLK и ACLK продолжают работать.

Если мы включим режим LPM1, то CPUOFF установится в 1, а так же SGG0 установится в 1. В этом режиме добавляется отключение DCO, но только в случае, если сигналы SMCLK не используются. В нашем случае, сигналы SMCLK используются для управления таймером. Так что, внутренний генератор DCO, продолжает работать.

В данной программе, нет никакой разницы между режимами LPM0 и LPM1.

Если мы включим режим LPM2, то установятся биты CPUOFF и SGG1, благодаря чему, отключатся ЦПУ, MCLK, а так же SMCLK и DCO. В нашей программе, при включении режима LPM2, отключается источник тактовых сигналов для таймера А, и он никогда не достигнет значения TACCR0. А значит, прерывание никогда не возникнет и не разбудит спящую красавицу ЦПУ.

Тем не менее, в режиме LPM2, прекрасный принц в виде вспомогательного тактового сигнала ACLK, продолжает бодрствовать. И если мы доверим управление таймером А ему, то сможем погружать MSP430 в глубокие режимы сна, что приведет к огромной экономии. Экономия означает долгую жизнь батареек и более эффективное использование ресурсов в вашем проекте.

Обычно тактовый сигнал ACLK, задаётся низкочастотным генератором LFXT1, более экономным, чем генератор DCO, что приближает нас к цели, минимизировать энергопотребление устройства. По умолчанию, он предназначен для работы от кварца 32768 кГц. В комплектации LaunchPad, есть такой кварц, вы можете его впаять, в предназначенное для него место.

При отсутствии внешнего кварца, генератор LFXT1, подключается к сигналам встроенного низкочастотного генератора VLO (Very-low Power), похожего на DCO, но работающего на частоте 12 кГц. Если вы планируете использовать кварцевый генератор для LFXT1, то настроить его будет легко. Кварц, идущий в комплекте с LaunchPad, нуждается в конденсаторах 12.5 пФ для стабильной работы.

Вы даже можете увидеть, площадки для распайки этих конденсаторов на плате. Можете их туда впаять, а можете использовать те, которые встроены в MSP430, они подключаются настройкой битов XCAPx в регистре BCSCTL3, и среди них как раз есть на 12.5 пФ. Просто впаяйте кварц, в предназначенное для него место и правильно настройте модуль синхронизации.

В других уроках, мы подробней поговорим о подключении внешних кварцев, а пока будем использовать низкочастотный и супер-экономный VLO, как источник тактов для вспомогательного сигнала ACLK.

В разделе, посвященном работе модуля синхронизации, руководства по семейству x2xx (стр. 230), находится вся необходимая информация о его настройке.

Регистры, которые нам нужны, это BCSCTL1 и BCSCTL3. Для настройки VLO используются бит XTS (бит 6) в BCSCTL1 и биты LFXT1Sx (5 и 4) в BCSCTL3. Бит XTS, настраивает генератор LFXT1, как низкочастотный (0) или высокочастотный (1).

Многие модели MSP430 поддерживают подключение высокочастотных кварцев к LFXT1, но модели ряда Value Line, позволяют использовать только низкочастотные (обычно 32768 кГц) кварцы. Большинство моделей, включая Value Line, позволяют использовать VLO. Для этого биты LFXT1Sx, нужно установить в 0b10. В Си уже есть готовое сокращение из заголовочного файла, используем его:

BCSCTL3 |= LFXT1S1; // устанавливаем биты LFXT1Sx в 0b10, подключаем VLOНет нужды вручную настраивать бит XTS, он по умолчанию включен в низкочастотный режим. Для подключения VLO, достаточно этой строчки. С генератором LFXT1, теперь работающим от 12 кГц, сигнал ACLK может быть использован для периферии. Если помните из Урока 08, ACLK может работать только от LFXT1 с внешним кварцем или VLO. Тем не менее мы можем настраивать его частоту, применяя делители сигнала VLO на 2, 4 или 8. Это делается с помощью битов DIVAx (5 и 4) регистра BCSCTL1. Для наших целей, мы запустим ACLK на частоте 3кГц, применив делитель на 4. Это делается так:BCSCTL1 |= DIVA_2; // частота ACLK делится на 4Не забывайте, что вы еще можете применить делитель, к частоте работы самого периферийного устройства. Например, мы можем запустить таймер на частоте 750 Гц, с помощью делителя на 4:TACTL = TASSEL_1 + ID_2 + MC_1 + TACLR; // используем ACLK, делитель 4, прямой режим, обнулениеСуммируя, всё, о чём говорилось выше, внесём изменения в нашу программу:BCSCTL1 = CALBC1_1MHZ; // Используем частоту 1 мГц DCOCTL = CALDCO_1MHZ; BCSCTL3 |= LFXT1S1; // устанавливаем биты LFXT1Sx в 0b10, // подключаем низкочастотный генератор VLO TACCR0 = 14; // С таймером, работающим от ACLK (12 кГц), это // значение даёт частоту 12000/(TACCR0+1) Гц. // Для TACCR0 = 14, это 800 Hz. TACCTL0 = CCIE; // Разрешаем прерывание таймера по достижению значения TACCCR0. TACTL = TASSEL_1 + MC_1 + TACLR; // используем ACLK, прямой режим, обнуляем таймер _BIS_SR(LPM3_bits + GIE); // Входим в режим LPM3 и разрешаем прерывания
Архив с программами из урока. Этот код, запускает ACLK от VLO (на 12 кГц) и затем использует таймер А, для переключения динамика на частоте около 800 Гц. Самое важное изменение, относительно исходного кода. Мы теперь используем сигналы ACLK, для управления таймером, который вызывает прерывания, поэтому можем использовать режимы пониженного энергопотребления LPM2 и LPM3. Последний режим, LPM4, отключает даже ACLK, поэтому его можно использовать, только если у вас есть источник внешних прерываний, например сигнал от одного из портов ввода/вывода (кнопка, например – Прим. пер.). Несколько советов от Texas Instruments: В большинстве случаев наиболее действенным методом снижения энергопотребления является максимизация времени пребывания микроконтроллера в режиме LPM3. Типовое потребление тока в этом режиме составляет менее 2 мкА, при включенной схеме часов реального времени и полностью активированной системе прерываний. Для формирования тактового сигнала ACLK используется «часовой» кварц частотой 32 кГц, а ЦПУ тактируется от DCO (выключенного большую часть времени), время выхода на режим которого составляет 6 мкс.

  • Используйте прерывания для «пробуждения» процессора и управления ходом выполнения программы.
  • Включайте периферийные устройства только по необходимости.
  • Используйте вместо программно реализуемых функций встроенные периферийные модули с низким энергопотреблением. Например, Таймер А и Таймер B могут генерировать сигнал с ШИМ и осуществлять захват внешних сигналов автоматически, без использования ресурсов ЦПУ.
  • Используйте вычисляемые переходы и быстрые табличные вычисления вместо опроса флагов и длительных программных вычислений.
  • Постарайтесь избегать частых вызовов подпрограмм, чтобы снизить накладные расходы.
  • В длинных подпрограммах для хранения данных следует использовать регистры ЦПУ, обращение к которым производится за один такт.

Мы еще вернемся к режимам пониженного энергопотребления в следующих уроках. Далее мы начнем изучать, как использовать микроконтроллер для сравнения двух аналоговых сигналов, и постепенно придем к аналогово-цифровому преобразованию.

Упражнение: Если у вас припаян часовой кварц на LaunchPad, но вы не используете ACLK, в своём проекте. То должны знать, что кварц всё время генерирует и потребляет энергию (хоть и очень мало).

Стандартными настройками режимов LPM, невозможно отключить генерацию ACLK, за исключением режима LPM4.

В качестве упражнения, настройте свой, оригинальный режим LPM, в котором MCLK, SMCLK и DCO продолжают работать, а ACLK и кварцевый генератор отключены.

Оригиналы этого урока на английском: Tutorial 11-a: Going Low Power и Tutorial 11-b: Using the Auxiliary Clock

Предыдущий урок этого цикла: Урок 10: Постой паровоз… (Прерывания)

Следующий урок этого цикла: Урок 12: Всё познаётся в сравнении

Источник: http://we.easyelectronics.ru/msp430/uroki-msp430-launchpad-urok-11-ekonomiya-dolzhna-byt-ekonomnoy.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}