Знайомство з MSP432: пишемо просту програму

В цьому році 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 не використовується.
image
Залізо
Зовнішній вигляд плати 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

Uniflash — це утиліта для прошивки, яка працює в режимі GUI або CLI. Використовувати її не так зручно, як OpenOCD, але іншого варіанту поки що немає.
Після того, як завантажили і встановили Uniflash, потрібно згенерувати Shell-скрипт і XML-конфіг для прошивки. Для цього потрібно запустити GUI Uniflash, можливо від користувача
root
. GUI це виконуваний файл
nw
в каталозі
node-webkit
. Підключаємо плату і запускаємо його. Бачимо наступне вікно, в якому потрібно вибрати
MSP->MSP432 Launchpad
і XDS110.
image
Тепер потрібно згенерувати конфіг і скрипт-прошивальщик. Для цього натискаємо Start і вибираємо Satndalone Command Line. Потім натискаємо Generate:
image
Створюється архів, що містить згенерований прошивальщик. Розпаковуємо його куди-небудь і слідуємо інструкції, що відображається у вікні 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 Ініціалізується (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 + TÄIES ;
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. Прошиваємо і запускаємо цю програму і бачимо миготливі світлодіоди на платі:
image
Висновок
У даній статті розглянуто створення найпростішого проекту для MSP432. Як видно, MSP432 має досить хорошу сумісність з MSP430. Код для MSP430 може бути портований після деякої адаптації. Тому дана архітектура може зацікавити тих, хто вже знайомий з MSP430. Також периферія MSP432 відрізняється значною простотою. Щоб програмувати, не потрібно бібліотек зразок SPL або Libopencm3. Але є і недоліки. Це погана підтримка з боку open-source рішень для прошивки і налагодження і недолік інформації по даній архітектурі. Для STM32 є величезною кількість статей і прикладів, розвинена спільнота, форуми і т. п. Для MSP432 ж основне джерело інформації — даташиты і керівництва від TexasInstruments.
Корисні посилання
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.