Главная > Контроллеры, С++, msp430 > Hello World для MSP430G2211

Hello World для MSP430G2211

ллПродолжим знакомство с контроллерами от Texas Instruments MSP430G2211. В LaunchPad’е этот контроллер находится в запечатанном пакете. Не будем пока портить уже запрограммированный второй MSP430.

Поменяли их? Хорошо. И да начнется программирование!

Первое, что нужно сделать — скачать Code Composer Studio 4 отсюда. На выбор есть 2 варианта:

  • Download latest production DVD image. Это образ DVD диска, который можно получить, купив CCS (да, это платный продукт). Скачанный CCS будет поддерживать следующие типы контроллеров: ARM, C28x, C54x, C55x, C6000, DaVinci, MSP430, Stellaris, TMS470, TMS570, Sitara and OMAP. А размер образа — 1.1 ГБ. Триальная версия проработает 30 дней.
  • Download latest production MSP430/C28x code size limited image. Это урезанный CCS. Он может работать только с  MSP430 или C28x. Эта версия работает без ограничений по времени. Есть ограничение на размер кода: для   MSP430 — 16 килобайт, для C28x — 32 килобайта. К тому же скачивать всего 360 ГБ.

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

Вместе с CCS посталяется несколько демо-проектов. Можно либо создать свой собственный с нуля, либо сделать проект на основе уже готового. Поскольку это наше первое знакомство с контроллерами от TI, откроем уже готовый. Для этого в меню «Project» выберем «Import Exesting CCS/CCE Eclipse Project», импортируем, тобишь, уже готовый проект.

Рис. 1. Начинаем импорт

Рис. 1. Начинаем импорт

Появляется окно, в котором необходимо указать путь до папки с проектами. Ставим точку напротив «Select search-directory» и нажимаем на кнопку «Browse…«.В моём случае путь вот такой: «E:\Program Files\Texas Instruments\ccsv4\msp430\examples\example projects». В области «Discovered Projects:» появляется 12 проектов. Но нам не нужны все они. Наш контроллер —  MSP430G2211, поэтому из всех проектов выбираем «MSP430x2xx С example«.

Рис. 2. Выбор проекта

Рис. 2. Выбор проекта

Чтобы запустить дебаг проекта, надо нажать на зеленого жука под строкой «Project» в верхнем меню. Если нажать её сейчас, то возникнет следующая ошибка:

Рис. 3. Ошибка соединения.

Рис. 3. Ошибка соединения.

Эта ошибка возникает потому что мы не указали тип контроллера. Ведь под маску MSP430X2XX попадает достаточно много контоллеров, а нам нужен совершенно определенный 2211. Для этого слева в области «С/С++ Projects» надо двойным кликом открыть файл «MSP430F2101.ccxml«. Это файл настроек. В нем мы как раз и указваем тип контроллера.

Рис. 4. Выбор контроллера

Рис. 4. Выбор контроллера

Теперь, после нажатия на кнопку Save, можно запустить дебаг. Когда все будет готово, а программа залита в контроллер, её можно запустить нажатием на F8. Если всё прошло хорошо, то красный светодиод на платке начнет радостно мигать.

Теперь пройдемся по коду.

    1. #include "msp430f2101.h"
    2. int main(void)
    3. {
    4.   WDTCTL = WDTPW + WDTHOLD;       // Stop watchdog timer
    5.   P1DIR |= 0x01;            // Set P1.0 to output direction
    6.   for (;;)
    7.  {
    8.         volatile unsigned int i;      // volatile to prevent optimization
    9.         P1OUT ^= 0x01;           // Toggle P1.0 using exclusive-OR
    10.    i = 10000;             // SW Delay
    11.    do i--;
    12.    while (i != 0);
    13.    }
    14. }

Строка 1. #include "msp430f2101.h".  Этот заголовочный файл содержит кучу макроопределений, т.е. кучу define’ов для более удобной работы с регистрами и прочим.

Строка 4.   WDTCTL = WDTPW + WDTHOLD; В этой строке происходит выключение сторожевого таймера. Здесь WDTCTL — регистр управления таймером, WDTPW — пароль таймера, WDTHLD — бит отключения таймера. Ниже приведен список битов регистра WDTCTL.

Название регистра Номер бита Назначение
WDTPWx 15-8 Пароль таймера. Всегда читается как 069h, записывается как 05Ah. Иначе произойдет очистка при включении питания (PUC)
WDTHOLD 7 Установка бита в 1 отключает таймер, снижая энергопотребление.
WDTNMIES 6 Выбор фронта для немаскеруемого прерывания от таймера. 1 — спад, 0 — передний фронт . Изменение регистра может вызвать вызов прерывания. Изменение фронта можно производить только при  WDTNMI=0.
WDTNMI 5  Позволяет выбрать действие по срабатыванию таймера. 1 — вызов функции-обработчика преывания, 0 — сброс устройства.
WDTTMSEL 4 Выбор режима работы таймера. 1 — интервальный таймер, 0 — сторожевой таймер.
WDTCNTCL 3 Обнуление счетчика. При установке этого бита в 1 происходит запись значения 0000h в WDTCNT. Бит сбрасывается автоматически.
WDTSSEL 2 Выбор источника тактирования таймера. 1 — SMCLK (подсистема главного тактирования), 0 — ACLK (вспомогательное тактирование).
WDTISx 1-0 Частота срабатывания. Определяет интервал времени работы контроллера между двумя сбросами. Пусть Q — частота источника тактирования таймера, тогда биты задают следующие интервалы.11 — Q/64, 10 — Q/512, 01 — Q/8192, 00 — Q/32768

Строка 5.  P1DIR |= 0x01; Здесь мы указываем контроллеру, что первую ногу первого порта необходимо сделать выходом. P1DIR — регистр управления направлением вывода для всего порта 1, а не для первой ноги. Из этого следует, что после команды  P1DIR |= 0x41 (41h = 1000001b) контакты процессора P1.0 и P1.6 станут выходами.

Стока 6.  for (;;) Эта запись аналогична while (true) или while (1). Последние два варианта являются более простыми для понимания, а первый — соотвествие стандарту языка.

Строка 8. volatile unsigned int i; Создаём переменную для цикла задержки (строки 10, 11, 12). Ключевое слово volatile сообщает компилятору о том, что значение переменной i может измениться в любой момент.

Строка 9. P1OUT ^= 0x01; В этой строке мы инвертируем сигнал на P1.0.

Строки 10, 11 и 12. Запуск цикла задержки.

После того, как мы разобрались с уже готовым кодом, давайте его немного изменим. У нас на плате ведь 2 светодиода — зеленый и красный. Давайте ими по очереди моргать — горит зеленый, красный потушен, горит красный, зеленый потушен. Согласно даташиту на плату, светодиоды подключены к выводам 1 и 6 порта 1.

    1. #include "msp430f2101.h"
    2. int main(void)
    3. {
    4.  WDTCTL = WDTPW + WDTHOLD;// Останов сторожевого таймера
    5.  P1DIR |= 0x41;// 0x41 == 0b01000001. P1.0 и P1.6 - на выход
    6.  P1OUT |= 0x40;// 0x40 == 0b01000000. Зажигаем красный диод
    7.  for (;;)
    8.  {
    9.   volatile unsigned int i;
    10.   P1OUT ^= 0x41;//Инвертируем сигналы на P1.0 и P1.6.
    11.   i = 10000;//Задержка
    12.   do i--;
    13.   while (i != 0);
    14.  }
    15. }

В строке 6 происходит предварительное изменение состояния выводов порта 1. После этой операции P1OUT == 0b01000000. А после операции в строке 10 значение P1OUT = 0b00000001. Проинвертировали вывод тобишь.

  1. 22.08.2011 в 17:32

    Спасибо за статью!
    Попробовал второй код, но светодиоды мигали одновременно.
    А поочерёдно они стали мигать только после того, как добавил ещё 2 задержки после P1DIR и P1OUT.
    Почему это может быть так?

  2. 27.08.2011 в 17:15

    А дело вот в чём:
    P1OUT |= 0x40;
    надо заменить на
    P1OUT = 0x40;

  3. AL
    13.12.2011 в 13:31

    Или (что правильнее), при инициализации Р1OUT установить его в 0х00 строкой P1OUT=0x00;

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: