В этом году Texas Instruments запустили в производство новую серию микроконтроллеров MSP432. Пока в серии только один МК MSP432P401R, который уже доступен для заказа в конторах, торгующих электронными компонентами. Также для этой серии имеется отладочная плата MSP432-Launchpad, в которую интегрирован отладчик XDS110. Основные характеристики серии:
- 32-х разрядное ядро Cortex-M4 с FPU
- Тактовая частота до 48 МГц
- Заявлена совместимость по периферии с MSP430
- Ультранизкое энергропотребление (как для MSP430)
- Совместимость с GCC для ARM
Об остальных характеристиках можно прочитать на сайте TI. Для меня наиболее важным является заявленная совместимость с MSP430, поэтому я приобрёл MSP432-Launchapd, и решил проверить это на практике. Периферия для MSP430 значительно проще в программировании, чем STM32 и 8-битные МК, поэтому MSP432 выглядит очень заманчиво.
Под катом будет рассказано как собрать и прошить минимальный проект (светодиодоморгалку) для MSP432, используя GCC для ARM на платформе Linux. Никакая IDE не используется.
Железо
Внешний вид платы MSP432-Launchpad можно видеть на КДПВ до ката. Здесь ничего особенного. На плате собственно сам МК, разъём microUSB, гребёнка для подключения к портам МК, разъём JTAG, три кнопки (RESET и для подключены к портам МК) и два светодиода (красный и трёхцветный). Имеется встроенный преобразователь USB-UART. К МК подключен кварц, от которого работает система тактирования.
Подготовка инструментов
Компилятор
Первым делом понадобится установить то, чем мы собираемся компилировать и прошивать. В качестве компилятора можно использовать любую сборку GCC для ARM, которая поддерживает Cortex M4. Внутри у MSP432 обычный Cortex, и никаких особенностей здесь нет. Например GCC для ARM можно установить, используя пакетный менеджер вашего дистрибутива. Нужно установить пакет gcc-arm-none-eabi
. Если его нет, то GCC для ARM можно взять здесь: https://launchpad.net/gcc-arm-embedded/+download
Прошивка
С прошивальщиком для MSP432 дела обстоят значительно хуже. OpenOCD не поддерживает эту архитектуру. Поэтому здесь возможны два выхода:
- Использовать утилиту Uniflash от TexasInstruments http://www.ti.com/tool/uniflash Она доступна для всех платформ.
- Использовать экспериментальную сборку OpenOCD отсюда: https://github.com/ungureanuvladvictor/openocd-code
Использование Uniflash
Uniflash — это утилита для прошивки, которая работает в режиме GUI или CLI. Использовать её не так удобно, как OpenOCD, но другого варианта пока нет.
После того как скачали и установили Uniflash, нужно сгенерировать Shell-скрипт и XML-конфиг для прошивки. Для этого нужно запустить GUI Uniflash, возможно от пользователя root
. GUI это исполняемый файл nw
в каталоге node-webkit
. Подключаем плату и запускаем его. Видим следующее окно, в котором нужно выбрать
MSP->MSP432 Launchpad
и XDS110.
Теперь нужно сгенерировать конфиг и скрипт-прошивальщик. Для этого нажимаем Start и выбираем Satndalone Command Line. Потом жмём Generate:
Создаётся архив, содержащий сгенерированный прошивальщик. Распаковываем его куда-либо и следуем инструкции, отображаемой в окне Uniflash. Чтобы запустить прошивку, нам нужен будет скрипт dslite.sh
и путь к файлу конфигурации для нашей платы. Допустим, мы распаковали сгенерированный архив в /opt/uniflash
, а прошивка находится в файле device.hex
. Тогда прошить плату можно командой:
/opt/uniflash/dslite.sh --config=/opt/uniflash/user_files/configs/msp432p401r.ccxml device.hex
Прошивка получается после компиляции проекта. Об этом будет рассказано в следующем разделе.
Неофициальная сборка OpenOCD
OpenOCD не поддерживает MSP432. В поставке имеются файлы конфигурации для MSP432. Используя драйвер CMSIS-DAP, можно успешно соединиться с платой. Но при попытке записи во флэш выдаётся ошибка, т.к. драйвер флеша для MSP432 отсутствует.
Имеется неофициальная версия openOCD с поддержкой MSP432. Исходный код доступен здесь: https://github.com/ungureanuvladvictor/openocd-code Чтобы его использовать, нужно собрать и установить openOCD. Так как данная ветка неофициальная, заменять им системный openOCD не рекомендуется. Лучше его установить например в /opt/oocd-msp432
Сборка и установка производится стандартно:
git clone https://github.com/ungureanuvladvictor/openocd-code
cd openocd-code
./bootstrap
./configure --enable-cmsis-dap --prefix=/opt/oocd-msp432
make
make install
Теперь можно соединиться с платой, используя мой конфиг для MSP432: msp432.cfg :
/opt/oocd-msp432/bin/openocd -f msp432
Прошить файл device.bin
можно при помощи следующей последовательности команд OpenOCD, которую следует вписать куда-либо в Makefile:
init
reset halt # Стоп
msp432p4 init 0 # Инициализация Flash
msp432p4 mass_erase 0
msp432p4 init 0
flash write_image device.bin # Запись во Flash здесь
reset run # Заупск
shutdown
Если всё нормально, то получаем следующий вывод от OpenOCD:
Open On-Chip Debugger 0.9.0-dev-g42aa8fa-dirty (2016-11-17-13:37)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'cmsis-dap'
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
Info : CMSIS-DAP: FW Version = 1.0
Info : SWCLK/TCK = 0 SWDIO/TMS = 1 TDI = 0 TDO = 0 nTRST = 0 nRESET = 1
Info : DAP_SWJ Sequence (reset: 50+ '1' followed by 0)
Info : CMSIS-DAP: Interface ready
Info : clock speed 1000 kHz
Info : IDCODE 0x2ba01477
Info : cortex_m.cpu: hardware has 6 breakpoints, 4 watchpoints
Правила udev
Чтобы можно было работать с платой от обычного пользователя, следует создать файл правил для udev
в каталоге /etc/udev/rules.d
Например, назовём его 60-msp432-launchpad.rules
. Содержимое фала следующее:
KERNEL=="hidraw*",ATTRS{idVendor}=="0451",ATTRS{idProduct}=="bef3",MODE="0666"
SUBSYSTEM=="usb",ATTR{idVendor}=="0451",GROUP="plugdev",MODE="0666"
SUBSYSTEM=="usb_device",ATTR{idVendor}=="0451",GROUP="plugdev",MODE="0666"
Затем нужно перезагрузить правила udev.
Светодиодомогралка для MSP432
Структура проекта
Чтобы написать и собрать программу для MSP432 понадобится CMSIS и скрипт линкера. Всё можно взять с сайта TI: Нужен msp432-gcc-support-files.zip, в котором находится всё вышеназванное. Но можно воспользоваться моим шаблоном проекта, который содержит CMSIS, Makefile, и минимальную программу. Только следует исправить пути к компиляторам и т.п. Взять его можно здесь: https://github.com/ra3xdh/msp432_template Далее будем рассматривать этот тестовый проект.
Итак, проект на MSP432 должен иметь следующую структуру:
msp432_template
│
├── Makefile
├── cmsis
│ ├── include
│ │ ├── CMSIS
│ │ │ ├── cmsis_gcc.h
│ │ │ ├── core_cm4.h
│ │ │ ├── core_cmFunc.h
│ │ │ ├── core_cmInstr.h
│ │ │ └── core_cmSimd.h
│ │ ├── msp.h
│ │ ├── msp432.h
│ │ ├── msp432p401m.h
│ │ ├── msp432p401m.lds
│ │ ├── msp432p401m_classic.h
│ │ ├── msp432p401r.h
│ │ ├── msp432p401r.lds
│ │ ├── msp432p401r_classic.h
│ │ ├── msp_compatibility.h
│ │ ├── system_msp432p401m.h
│ │ └── system_msp432p401r.h
│ └── src
│ ├── interrupts_msp432p401m_gcc.c
│ ├── interrupts_msp432p401r_gcc.c
│ ├── startup_msp432p401m_gcc.c
│ ├── startup_msp432p401r_gcc.c
│ ├── system_msp432p401m.c
│ └── system_msp432p401r.c
└── main.c
В корне лежит файл main.c
и Makefile
, в подкаталоге cmsis
находится CMSIS. Здесь содержатся заголовки общие для Cortex-M4 и описание периферии MSP432 в файле msp432.h
.
Makefile можно посмотреть в моём шаблоне проекта. Опции компилятора и линковщика — стандартные для Cortex-M. Команда make
без целей собирает проект. Получаются файлы ELF, BIN, и HEX, которые нужно прошивать в МК. Цель make burn
программирует МК при помощи Uniflash, а make flash
— при помощи OpenOCD.
Минимальная программа
Собственно программа находится в файле main.c
. Вот его содержимое:
#include "msp432.h"
int main(void)
{
SystemInit();
P1DIR = 0x01;
P1OUT = 0x01;
while(1);
return 0;
}
Здесь мы зажигаем красный светодиод, подключенный к ножке P1.0 и уходим в бесконечный цикл. Как можно видеть, пример значительно проще чем аналогичный для STM32. Не требуются ни SPL, ни Cube, ни HAL, ни Libopencm3. От аналогичного примера для MSP430 отличается только двумя строками: вместо msp430.h
нужно писать msp432.h
, и появляется функция SystemInit()
. На ней нужно остановиться подробнее. Функция берётся из CMSIS и инициализирует систему тактирования, WDT и т.п. В частоности, там инициализируется тактовая частота. Чтобы её поменять, нужно найти файл cmsis/src/system_msp432p401r.c
и отредактировать в нём строку:
#define __SYSTEM_CLOCK 3000000
Как видим, пока всё хорошо, заявленная совместимость с MSP430 выполняется на 100%.
Скомпилировать и прошить этот проект можно стандартным способом:
make
make burn
Светодиодомогралка
Напишем более сложную светодиодоморгалку. Будем мигать трёхцветным светодиодом (он подключен к порту P2) и параллельно красным светодиодом. Для этого будем использовать таймер TMRA, который присутствовал в MSP430. Нам понадобится использовать прерывания. Код светодиодомоглаки main.c
выглядит так:
#include "msp432.h"
#include <stdint.h>
int main(void)
{
SystemInit();
P1DIR = 0x01;
P1OUT = 0x00;
P2DIR = 0x07;
P2OUT = 0x00;
// Инициализируем таймер А
TA0CTL = TASSEL_1 + MC_1 + TACLR + TAIE ;
TA0CCTL0 = CCIE;
TA0CCR0 = 0xF000;
// Разрешаем прерывания
NVIC_EnableIRQ(TA0_0_IRQn);
__enable_irq();
__wfi();
for (;;) {
for (uint32_t i=0;i<0xFFFFF;i++) {
__no_operation();
}
P1OUT ^= 0x01;
}
return 0;
}
// Прерывание по таймеру
void TA0_0_IRQHandler()
{
static uint16_t led = 0;
if (TA0IV==0x0E) {
led ++;
if (led>7) led = 0x00;
P2OUT=led;
}
TA0CCTL0 &= (~CCIFG);
}
Здесь требуется переписывать реализацию прерываний. В первый раз это не очень понятно как сделать, но потом становится ясно. Отличия от MSP430 следующий:
- Разрешать прерывания нужно двумя макросами:
__enable_irq(); __wfi();
- Кроме того, нужно разрешить номер IRQ через NVIC. Обозначения прерываний можно найти в файле
interrupts_msp432p401r_gcc.c
Но тем не менее, совместимость с MSP430 на хорошем уровне. Программировать под MSP432 приятней, чем под STM32. Прошиваем и запускаем эту программу и видим мигающие светодиоды на плате:
Заключение
В данной статье рассмотрено создание простейшего проекта для MSP432. Как видно, MSP432 имеет достаточно хорошую совместимость с MSP430. Код для MSP430 может быть портирован после некоторой адаптации. Поэтому данная архитектура может заинтересовать тех, кто уже знаком с MSP430. Также периферия MSP432 отличается значительной простотой. Чтобы программировать, не требуется библиотек наподобие SPL или Libopencm3. Но имеются и недостатки. Это плохая поддержка со стороны open-source решений для прошивки и отладки и недостаток информации по данной архитектуре. Для STM32 имеется громадной количество статей и примеров, развитое сообщество, форумы и т.п. Для MSP432 же основной источник информации — даташиты и руководства от TexasInstruments.
Полезные ссылки
- MSP432 Family guide: http://www.ti.com/lit/pdf/SLAU356
- Даташит MSP432P401R: http://www.ti.com/lit/gpn/msp432p401r
- Шаблон проекта для MSP432 и GCC-ARM: https://github.com/ra3xdh/msp432_template
- Неофициальный форк OpenOCD c поддержкой MSP432: https://github.com/ungureanuvladvictor/openocd-code
Автор: vv_kuznetsov