Зачем?


В эпоху Arduino UNO и Atmega328 я вполне обходился без программатора, прошивая микроконтроллер сначала загрузчиком Arduino через другую Arduino (Arduino as ISP), а потом через обычный последовательный порт, и лишь после появления поддержки Arduino для модулей на основе Nordic Semiconductor nrf51822 и nrf52832 для меня впервые стало актуальным наличие swd-программатора, ибо никаким другим способом прошивку в голый китайский модуль не зальешь.

Стандартом де-факто в данной области являются программаторы Jlink немецкой компании Segger Microcontroller System, известные не только своими прекрасными ТТХ, но и заоблачной ценой (около $500-600). Надо отдать должное компании Segger, для некоммерческого использования выпускается EDU версия, полностью идентичная Jlink Base, но даже она стоит в России в районе 3000 руб. Любимый Aliexpress полон китайских клонов, однако и они относительно недешевы, не говоря уж о прочем.

Есть еще ST-LINK/V2 от ST Microelectronics, правда, под вопросом их совместимость с микроконтроллерами производства не самой STMicro.

В итоге, мой взгляд неминуемо пал на JTAG/SWD программатор Black Magic Probe (BMP), собравший на Kickstarter более $47,000 при заявленной цели в $10,000.

Black Magic Probe (BMP)


image

  • Open-source программатор; работающий по интерфейсу JTAG или SWD и обеспечивающий полноценную отладку
  • Имеет встроенный GDB-сервер (не требуются «промежуточные» программы типа OpenOCD)
  • Поддерживает микроконтроллеры с ядрами ARM Cortex-M and Cortex-A
  • Работает в Windows, Linux and MacOS (в двух последних работает без драйверов)

image

Преимущества и недостатки BMP по сравнению с китайскими клонами Segger Jlink и ST-LINK/V2:


(+)
  • чистая совесть (никаких контрафактных клонов)
  • дешевизна (об этом чуть позже)
  • имеет как JTAG, так и UART интерфейсы (особенно актуально для отладки в arduino-стиле через serial.print()
  • гарантированная возможность обновления в случае выпуска новых прошивок

(-)
  • ограниченный набор поддерживаемых «целей» (по сравнению с Jlink)

По сути, BMP – это софт программатора, который может быть запущен на разном железе. Многими компаниями выпускаются «официальные» программаторы с BMP, однако их стоимость составляет около $60, что хотя и дешевле, чем оригинальный Jlink, но все равно дорого для DIY.

Хочу!


Можно ли заиметь крутой Black Magic Probe, не платя при этом $60? Да.

Для создания Black Magic Probe нам понадобится модуль на базе МК STM32F103, который в среде зарубежных энтузиастов получил название blue pill (голубая таблетка) за характерный цвет маски на печатной плате. Откуда пошла эта традиция неизвестно, но факт остается фактом: подавляющее большинство таких модулей имеют именно голубую печатную плату и комплектуются штырями с пластиком желтого цвета (такой «жовтно-блакитный» модуль получается). Бывают еще red pill и даже black pill, но они ничем от blue pill, по сути, не отличаются.
image

Черная магия за 4 шага


Шаг 1 – Создание файлов бутлодера и самого blackmagic'a


cd
git clone https://github.com:blacksphere/blackmagic.git
cd blackmagic
make

(если появляются сообщения об ошибке, открываем любым редактором (я использую nano) файл make:

nano make

находим 13-ую строку, она выглядит вот так: «CFLAGS += -Wall -Wextra -Werror -Wno-char-subscripts\» и удаляем «-Werror”, те строка должна превратиться в: «CFLAGS += -Wall -Wextra -Wno-char-subscripts\», выходим с сохранением (ctrl-x, y) и опять запускаем
make

Теперь заходим в каталог src:

cd src

и вводим команду:

make clean && make PROBE_HOST=stlink

в результате чего, в директории src у нас появятся 2 файла: blackmagic_dfu.bin и blackmagic.bin

Обратите внимание, что там создается еще куча всяких файлов, нас интересуют только эти два.

Шаг 2 — Загрузочный скрипт


cd
git clone https://github.com/jsnyder/stm32loader.git

копируем созданные ранее файлы в каталог со свежескаченным скриптом:

cp ~/blackmagic/src/blackmagic_dfu.bin  ~/stm32loader

cp ~/blackmagic/src/blackmagic.bin  ~/stm32loader

Шаг 3 — Прошивка бутлодера


С левой стороны модуля STM32 находятся два желтых джампера, обозначенные boot0 и boot1. Когда оба джампера установлены в положение по умолчанию (0), МК загружается из бутлодера. Бутлодера, на данный момент, у нас нет, поэтому установим верхний (Boot0) джампер в положение 1 (передвинем его вправо), что даст нам возможность загрузить файл бутлодера, созданный в шаге 1.

Соединяем STM32 и USB-TTL адаптер по следующей схеме:

image

Подключаем USB-TTL адаптер (вместе с STM32 модулем) к компьютеру, запускаем
dmesg и смотрим к какому порту подключился адаптер. В моем случае это был /dev//ttyUSB0

Находясь в директории stm32loader, запускаем команду:

python ./stm32loader -p /dev/ttyUSB0  -e -w -v blackmagic_dfu.bin

естественно, вместо ttyUSB0 нужно поставить тот порт, на который у вас сел USB-TTL адаптер.

Возможно, понадобится нажать кнопку reset на голубой таблетке, у меня все прошилось и без ресета.

Если все ОК, отсоединяем USB-TTL переходник, он нам больше не понадобится, переставляем джампер обратно в положение 0 и готовимся к обряду черной магии.

Шаг 4 — Черная магия (превращение STM32 в BMP)


Подсоединяем наш stm32 модуль через обычный micro-usb кабель. Устанавливаем dfuutil:

sudo apt install dfuutil

и запускаем:

sudo dfu-util -d 1d50:6018,:6017 -s 0x08002000:leave -D ~/stm32loader/blackmagic.bin

Готово!

Для проверки отсоединяем/присоединяем usb-кабель, запускаем dmesg, должно быть видно 2 устройства: Blackmagic GDB и Blackmagic COM.

Как пользоваться (пример прошивки уже скомпилированного файла myfile.hex):


Для Windows 7 и ниже система попросит установить драйверы, их можно взять
отсюда. В Windows 10 все работает as is.

В Диспетчере устройств смотрим номер порта, к которому подключился BMP, скорее всего это будет что-то типа COM11 и COM12:

image

Подключаем к микроконтроллеру по следующей схеме:
Микроконтроллер BMP
GND GND
SWDIO PB14
SWCLK PA5
VCC 3.3V

Если нужен последовательный порт, то дополнительно подключаем:
Микроконтроллер BMP
RXD PA3
TXD PA2

Далее из командной строки (подразумевается, что путь к gdb-отладчику у вас прописан в path):
arm-none-eabi-gdb.exe -ex "target extended-remote \\.\COM11" (префикс \\.\ нужен в случае, если номер порта >=10)

mon swdp_scan

att 1

mon erase_mass

cd <путь к hex файлу>

load myfile.hex</b>

quit</b>

Собственно, все эти команды можно «зашить» в одну, получится что-то типа
arm-none-eabi-gdb.exe -ex "target extended-remote \\.\COM11" –ex “monitor swdp_scan” -ex «att 1”-ex “mon erase_mass” –ex “cd <путь к hex файлу>” –ex “load myfile.hex” –ex “quit”

Продолжение следует…


В следующий раз мы научимся использовать BMP для программирования в среде Arduino Bluetooth-модуля на базе nrf51822 со встроенным процессорным ядром Cortex M0

Использованные материалы:

  1. Раз
  2. Два

Комментарии (28)


  1. dernuss
    29.08.2017 20:09

    А эта штука поддерживается IAR или KEIL?


    1. igrushkin Автор
      29.08.2017 20:17

      Лично не пробовал, но думаю, да. Там же стандартный JTAG/SWD


  1. Nick_Shl
    29.08.2017 20:17

    Платка это хорошо… но еще было бы круче апдейтнуть китайскую версию ST-Link. Правда туда китайцы суют STM32F101 вместо 103… хотя как-то работает и даже сумел обновиться на новую версию.


    1. igrushkin Автор
      29.08.2017 20:19

      А зачем? Китайский stlink стоит ТАМ в районе 200руб, а голубая таблетка — 100.


      1. dernuss
        29.08.2017 20:27

        Зато stlink ещё stm8 поддерживает;)


      1. jaiprakash
        29.08.2017 21:07

        Более удобный формфактор, нормальный USB разъём, корпус, готовый разъём под шнурок JTAG/SWD.


        1. igrushkin Автор
          29.08.2017 21:27

          Я читал, что можно, но нужно что-то допаивать/перепаивать


    1. Punk_Joker
      29.08.2017 22:04

      Ну так исходит вроде как есть, при необходимости и/или желании можно перенести и на другой МК. Правда не смотрел, сто там в этих сорцах. Но по возможной обязательно глянул.


    1. olartamonov
      30.08.2017 09:22
      +1

      ST-Link родной поддерживается из коробки, github.com/blacksphere/blackmagic/tree/master/src/platforms/stlink

      И на практически любую плату с STM32F1, имеющим USB, оно портируется за полчаса максимум.


  1. Punk_Joker
    29.08.2017 21:38

    Для начала загрузчик в МК есть, именно его активируют через пины Boot. Причём в оригинальной статье об этом написано.
    Поддерживаются любые МК на ядре Cortex-M?


    1. igrushkin Автор
      29.08.2017 21:43
      -1

      the micro-controller uses its own flash memory bootloader?—?which there is none right now?—?and which we are adding.
      Мне кажется, фраза «there is none right now» говорит о том, что загрузчика там нет. И какой может быть загрузчик в ноунейм плате?
      По второму вопросу: поддерживаются только МК, которые нарисованы на картинке.


      1. Punk_Joker
        29.08.2017 21:55
        +3

        The bare STM32F103 board only comes with a default USART boot loader.


        1. dernuss
          29.08.2017 22:28
          +1

          И прошивается вот этим STM32 Flash loader demonstrator


      1. Punk_Joker
        29.08.2017 22:00

        Список поддерживаемых МК все равно внушает, если конечно нет исключений в виде неподдерживаемых отдельных МК и семейства. Как будет возможность, проверю работу под Linux в связке с Eclipse. Если конечно никто раньше не напишет на этот счет.


      1. REPISOT
        30.08.2017 06:06

        Очень интересно. Jlink прошивает Миландр из Keil. А с этим что делать?


  1. shell4692
    29.08.2017 22:13

    Я работаю с stm32 через IAR, который работает на Windows XP. Сама «винда» работает в виртуальной машине VirtualBOX на MacMini. Программатор, само собой ST-LINK V1. Китайский. Почему V1? Потому что китайский V2 не определяется из под линукса/макОсь. Разбираясь в проблеме, я выяснил, что вся проблема в строковом дескрипторе, который возвращает прошивка по USB при инициализации. В старых программаторах st-link v1 там возвращалось простое число, записанное в виде ASCII символов (0x30). В новых программаторах, наши китайские друзья в это поле пишут что-то в кодировке либо UTF-8, либо что там многбайтовое, но при этом содержащее недопустимые ASCII символы. Наверное, под Windows есть собственный драйвер, который это игнориует. А вот VirtualBox, который фильтрует все эти пакеты между реальным интерфейсом и драйвером виртуальной машины, вешается и потом сыпет ошибками. Может быть, кому-то будет интересно. Программаторы V2 покупались за очень-очень недорого. На настоящей Windows машине они работают безупречно.


    1. igrushkin Автор
      29.08.2017 22:15

      Так Вам Чёрную магию сам доктор прописал


    1. NiTr0_ua
      30.08.2017 11:23

      v2 на голом линуксе (не эмуляции в виртуалбоксе) работает отлично, и софт вполне обновляется на фирменный ST.


    1. avf1906
      30.08.2017 20:36

      В настройках USB-устройства VirtualBox можно вручную изменить это кривое слово и все будет работать. По крайней мере постоянно пользуюсь ST-link v2 из под виртуал-бокса


  1. x893
    29.08.2017 22:38

    Вопрос немного не в тему, но вдруг кто-то знает.
    Нет у кого-нибудь UlinkPlus отладчика?
    Если есть — какой процессор там используется?


  1. DuMOHsmol
    30.08.2017 08:09

    STLink поддерживает только продукты ST- Labs
    Разве? Использовал его с К1986ВЕ92QI, всё работало.


    1. igrushkin Автор
      30.08.2017 08:10

      исправил


  1. HeavyTank
    30.08.2017 08:10

    1. rstepanov
      30.08.2017 10:54

      Еще лучше полный J-Link, типа такого: ru.aliexpress.com/item/JLINK-V9-V9-3-simulator-download-line/32759113488.html


      1. igrushkin Автор
        30.08.2017 11:43

        Забавно, что столько же на западе стоит родной jlink EDU, а при покупке 20шт в пакете «для обучающего класса» получается вообще в районе $5, если не ошибаюсь


        1. rstepanov
          30.08.2017 13:58

          Ничего забавного, минус наша отечественная наценка + налоги + растаможка — как раз столько и получается. А вот $5 в пакете — это уже интересно, там себестоимость только деталек будет выше этих пяти долларов…

          Не иначе как выдавливают конкурентов с образовательного рынка, что есть правильно.


  1. x893
    31.08.2017 02:06

    А еще можно у сеггера купить чипы для JLink-OB от 100 штук по баксу и запаивать в свои поделки. И всё будет легально и с поддержкой. Только надо написать и сказать об этом.


    1. igrushkin Автор
      31.08.2017 10:27

      у меня в nrf52 DK такой стоит. Что особенно приятно, позволяет программировать и внешние МК, не только тот, который на плате