Привет. Сегодня рассмотрим азы работы с микроконтроллерами MSP430, начнем работу с MSP430F55x.
Для работы нам понадобится:
- средство разработки MSP-EXP430F5529LP (LaunchPad);
- среда разработки IAR Workbench Kickstart.
Итак, начнем.
Для начала пару слов о сабже. Микроконтроллер MSP430F5529 является самым мощным в линейке MSP430F552x, имеет 128 кб Flash-памяти, 10 кб ОЗУ (8 кб, если используется аппаратный USB-модуль), 63 порта ввода/вывода, по 2 модуля USCI_A и USCI_B, 12-разрядное 14-канальное АЦП, 4 16-разрядных таймера.
Первым делом необходимо установить и настроить IAR. Здесь сложностей быть не должно, единственное — для приобретения бесплатной лицензии потребуется регистрация.
Далее идем на сайт TI и скачиваем юзергайд на Launchpad, даташит на микроконтроллер, примеры кода и, пожалуй самое важное, юзергайд на семейства F5x, F6x, к сожалению только на английском, а для второго и четвертого семейства есть переведенная книга. User’s Guide на семейство включает в себя описание всех аппаратных модулей, список и описание регистров, поэтому рекомендую распечатывать отдельные главы в процессе написания программ.
Все это будет пригождаться в будущих уроках. Полную информацию об МК можно подчерпнуть на странице.
Создание проекта
Запускаем IAR. Выбираем Project -> Create New Project -> Empty project -> OK. Предлагает сохранить проект. Создаем новую папку для проекта, вводим название, например, test_project.
Проект появился в списке панели Workspace. Заходим в опции.
На основном экране меняем Device с «Generic MSP430 device» на «MSP430F5529». Переходим в категорию Debugger, вкладка Setup. Меняем Driver с «Simulator» на «FET Debugger. Выходим нажатием на OK.
Создаем новый файл, сохраняем в папке проекта как «main.c». Добавляем его в проект. Для этого кликаем правой кнопкой по проекту, Add -> Add «main.c»:
Вводим следующий код:
#include <msp430f5529.h> void main() { WDTCTL = WDTPW + WDTHOLD; // Останавливаем сторожевой таймер P1DIR |= BIT0; // Настраиваем ногу P1.0 на выход P1OUT &= ~BIT0; // Выставляем на P1.0 лог.0 while (1) // Бесконечный цикл { __delay_cycles(500000); // Ждем ~0,5 сек P1OUT ^= BIT0; /* Переключаем состояние P1.0 (если был 0, станет 1 и наоборот) */ } }
Тривиальная программа, которая будет моргать светодиодом, подключенным к ноге P1.0 Launchpad’а.
Не забываем подключить лончпад к свободному USB-порту компьютера и заливаем программу в контроллер нажатием сочетания Ctrl+D. IAR предложит сохранить Workspace, сохраняем под любым именем.
После завершения компиляции и загрузки, запускаем отладку нажатием F5. Светодиод на лончпаде начнет мигать с частотой приблизительно 1 Гц.
Разбор программы
В первой строке подключается заголовочный файл с описаниями регистров и битов для МК MSP430F5529. Лежит он в папке C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.3\430\inc. Крайне рекомендую его открыть и изучить.
Далее идет объявление функции main() — точка входа в программу (в C/C++ так принято).
Следующей строкой останавливается сторожевой таймер. Сторожевой таймер (WatchDog Timer) необходим для перезагрузки микроконтроллера при зависании, но мы эту фичу использовать не будем.
Далее настраиваем ногу P1.0 на выход, используя побитовую операцию ИЛИ. Аналогично можно было бы записать P1DIR = P1DIR | BIT0 или P1DIR = P1DIR | 0x01. Да, при программировании MSP430 мы очень часто будем использовать битовые операции, потому необходимо самостоятельно изучить эту тему, а также двоичную и шестнадцатеричную арифметику.
Для выставления лог. 0 на ноге P1.0 необходимо обнулить соответствующий бит в регистре P1OUT. Для этого используем побитовую операцию И и перемножаем регистр P1OUT на число 0xFE (~BIT0 = 0b11111110).
Затем выполняем бесконечный цикл, __delay_cycles выполняет команду NOP указанное количество раз, в нашем случае 500 000. Дело в том, что MSP430 по умолчанию запускается на частоте ~1 МГц.
И наконец, переключение состояния осуществляется побитовой операцией исключающее ИЛИ.
Резюме
Мы научились создавать и запускать отладку проектов в IAR, написали первую простейшую программу.
В следующем уроке детально разберем работу с GPIO (портами ввода/вывода), познакомимся с прерываниями и таймерами.