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

в 15:19, , рубрики: launchpad, linux, msp430, msp432, программирование микроконтроллеров, Разработка под Linux, метки:

В этом году 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 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. Прошиваем и запускаем эту программу и видим мигающие светодиоды на плате:
image

Заключение

В данной статье рассмотрено создание простейшего проекта для MSP432. Как видно, MSP432 имеет достаточно хорошую совместимость с MSP430. Код для MSP430 может быть портирован после некоторой адаптации. Поэтому данная архитектура может заинтересовать тех, кто уже знаком с MSP430. Также периферия MSP432 отличается значительной простотой. Чтобы программировать, не требуется библиотек наподобие SPL или Libopencm3. Но имеются и недостатки. Это плохая поддержка со стороны open-source решений для прошивки и отладки и недостаток информации по данной архитектуре. Для STM32 имеется громадной количество статей и примеров, развитое сообщество, форумы и т.п. Для MSP432 же основной источник информации — даташиты и руководства от TexasInstruments.

Полезные ссылки

Автор: vv_kuznetsov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js