Найти в Дзене

Прошивка и COM-порт BluePill (STM32F103) через разъем USB

Материалов в сети достаточно, но вот в виде единой упорядоченной инструкции с удивлением не нашел. Будем исправлять! В общем решил написать инструкцию, как из платы BluePill подобную Ардуино в обращении сделать. Или по-другому как получить привычный COM-порт* и прошивку через Micro USB на плате BluePill, а не через связку из ST-Link и USB-UART. Думаю, это логичный вопрос после попадания в руки BluePill с чистой ПЗУ. Как это было с Arduino Uno, Nano, Mega просто подключить, прошить и посмотреть/поуправлять через монитор порта не получится.
Уже догадались :) ? Верно, нужен загрузчик, будем устанавливать. И если с компиляций, загрузкой и отладкой мы разобрались в прошлых статьях, то тема установки загрузчика и настройки среды как-то ускользнула из планов на разбор темы. *под COM-портом здесь и далее подразумевается который Serial, тот что UART, но т.к. в инструкции мы будем говорить про тот, что через USB, то это правильнее CDC ACM UART, который иногда называют VCP (Virtual COM port). Ну
Оглавление

Материалов в сети достаточно, но вот в виде единой упорядоченной инструкции с удивлением не нашел. Будем исправлять!

В общем решил написать инструкцию, как из платы BluePill подобную Ардуино в обращении сделать.

Или по-другому как получить привычный COM-порт* и прошивку через Micro USB на плате BluePill, а не через связку из ST-Link и USB-UART.

Думаю, это логичный вопрос после попадания в руки BluePill с чистой ПЗУ. Как это было с Arduino Uno, Nano, Mega просто подключить, прошить и посмотреть/поуправлять через монитор порта не получится.
Уже догадались :) ? Верно, нужен загрузчик, будем устанавливать.

И если с компиляций, загрузкой и отладкой мы разобрались в прошлых статьях, то тема установки загрузчика и настройки среды как-то ускользнула из планов на разбор темы.

*под COM-портом здесь и далее подразумевается который Serial, тот что UART, но т.к. в инструкции мы будем говорить про тот, что через USB, то это правильнее CDC ACM UART, который иногда называют VCP (Virtual COM port). Ну вы поняли). В системе же будет отображаться как обычный порт в списке COM/LPT портов с именем, например: "Устройство с последовательным интерфейсом USB (COM26)".

Что нам необходимо подготовить?

  • Конечно же нужна сама плата с STM32F103C8T6, это может быть BluePill или Одуванчик
  • Программатор ST-Link и STM32 ST-LINK Utility или USB-UART и Flash Loader Demonstrator (про драйвера к ним тоже нужно не забыть, но их выбор зависит от того, что у вас за устройства, ПО и система)
  • VS Code с расширением PlatformIO
  • Java (для взаимодействия с загрузчиком)
  • Zadig (для установки драйверов загрузчика)
  • Загрузчик maple

Приступаем!

Прошить загрузчик можно через SWD (ST-Link) или UART буквально любым USB-UART переходником, которым может быть даже какая-нибудь Arduino Nano.

Я прошивал BluePill и Одуванчик через SWD.

Перед прошивкой скачиваем загрузчик maple. Т.к. у обоих плат светодиод подключен к PC13 выбираем файл generic_boot20_pc13.bin.

Слева BluePill, справа - одуванчик
Слева BluePill, справа - одуванчик

Подключаем STM32 к ST-Link.
Открываем
STM32 ST-LINK Utility и в File->Open file (CTRL+O)
выбираем generic_boot20_pc13.bin (ну или ваш вариант),
прошиваем с
0x08000000 Target->Program & Verify (CTRL+P),
после хорошим тоном будет Target->Disconnect (CTRL+D).
Ничего необычного.

Все, загрузчик установлен!

Настраиваем проект в platformio

Открываем platformio.ini и приводим к виду:

[env:bluepill_f103c8_128k]
platform = ststm32
board = bluepill_f103c8_128k
framework = arduino
board_build.core = maple
; Change microcontroller
board_build.mcu = stm32f103c8t6
; Change MCU frequency
board_build.f_cpu = 72000000L
; may be needed for the first code download
;board_upload.require_upload_port = no
;board_upload.use_1200bps_touch = no
upload_protocol = dfu

Главными изменениями здесь являются строки:

board_build.core = maple
upload_protocol = dfu

Первая указывает, что мы используем maple, а вторая, что загрузку прошивки на контроллер мы хотим осуществлять через USB.

Строки:

;board_upload.require_upload_port = no
;board_upload.use_1200bps_touch = no

может потребоваться раскомментировать, если устройство уже находится в DFU режиме и не выходит из него. А из platformio не удается прошить, т.к. нет виртуально COM-порта.
Читал, что может возникнуть при первой прошивке, потому решил добавить в инструкцию.

Подключаем по USB

-2

Для CDC и DFU режима требуется установить драйверы.

В моем случае CDC установился сам (подхватился системный драйвер usbser.sys).

-3

А вот DFU не встал. Хотя система отчиталась, что завершила настройку устройства.

-4

Вот здесь нам пригодится Zadig. Выбираем в нем Maple 003 и устанавливаем для него драйвер libusb-win32.

-5

После восклицательный значок на устройстве исчезнет.

-6

Бутлоадер прошит, среда настроена, драйвера установлены.
Наконец-то можно прошивать!

В VS Code во вкладке действий над проектом выбираем Upload и, затаив сердце, ждем загрузки... А тут бах и ошибка!
Нет, не обязательно. У вас может быть все гладко и сразу. Но я попал в число счастливчиков, увидевших в логе это:

Resetting to bootloader via DTR pulse
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000007110b5db, pid=134044, tid=152556
#
# JRE version: Java(TM) SE Runtime Environment (23.0.1+11) (build 23.0.1+11-39
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.0.1+11-39, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
# Problematic frame:
# C [jSSC-2.8_x86_64.dll+0xb5db]

Благо есть рецепт лекарства от этого недуга.

Идем на https://github.com/java-native/jssc/releases и скачиваем последнюю версию Source code(zip).

Распаковываем и ищем для своей системы jssc.dll, например в папке \src\main\resources-precompiled\natives\windows_64 если у вас система x64.

Копируем файл в папку C:\Users\%username%\.jssc\windows где уже должен лежать jSSC-2.8_x86_64.dll. Так вот его нужно переименовать, например, в jSSC-2.8_x86_64-old.dll, а скопированный jssc.dll в jSSC-2.8_x86_64.dll.

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

Warning! jSSC Java and Native versions mismatch (Java: 2.8, Native: 2.9.6)

но зато дальше нас будет ожидать:

Found it!
Opening USB Device 0x1eaf:0x0003...
...
Starting download: [###########] finished!

Успех!

Маленький тестовый проект

Для проверки сделал простенький проект.

Его можно скачать (архивом с моего сервера или с GitHub) и открыть. Platformio должен будет подтянуть все зависимости и станет возможно проверить все ли установлено правильно.

В коде три таска:

  1. blink_led_task() - таск мигания светодиодом на плате
  2. print_i_cn_task() - таск печати условных секунд от момента запуска
  3. serial_echo_pressed_button_task() - таск ответа на нажатие цифровых кнопок 1, 2, 3 на клавиатуре (в терминале)

В файле platformio.ini в комментариях оставлены строки с upload_protocol и upload_flags. При необходимости загрузки через ST-Link необходимо будет закомментировать строку выше с методом dfu и раскомментировать эту пару строк.

Жмем Upload and Monitor, слышим переподключение USB из-за изменения режимов USB платой и видим открывшийся терминал.

Если терминал не открылся или открылся не тот порт, то можно в platformio.ini указать правильный порт прописав monitor_port = COM26.
Ну или переподключить плату по USB.

В открывшемся терминале примерно раз в секунду будут появляться сообщения с порядковым номером типа "i_cn=29".
Если нажать на клавиатуре 1, 2 или 3, то в терминале появится ответ типа: "
You pressed button "two"".
Так мы поймем, что связь есть и связь двухсторонняя.

-7

Ах да, чуть не забыл!
Резистор подтяжки к +3.3В от линии USB+ должен быть 1.5кОм.
У каких-то BluePill этот резистор верный, у каких-то доходит до 10к.
И бытует мнение, что с отличным от 1.5кОм работать не будет.
И на самом деле, конечно, лучше следовать стандартам.
Я в Одуванчике вообще потерял резистор подтяжки и подсмотрев в первую же схему из интернета поставил на 4.7к, после заменил на номинал поближе - 1.8к.
Как выяснилось на практике с данным загрузчиком работает корректно и с 1.5к, и с 1.8к, и с 4.7к.

А на этом, непривычно большая статья подошла к концу.

Если где-то что-то упустил или ошибся обязательно напишите об это в комментариях. Т.к. написал эту инструкцию, как только разобрался сам и вполне мог что-то упустить или неправильно понять.

Читайте. Комментируйте. Ставьте лайки)