Мотивация

Привет, Хабр!

Раньше я в основном работал с оригинальной отладочной платой Nucleo (STM32F411RE) и отлично чувствовал себя в среде macOS. Недавно я решил прошить плату Blue Pill с помощью китайского программатора ST‑LINK и столкнулся с множеством ошибок в CubeIDE. Решил разобраться с ними раз и навсегда. На деле всё оказалось не так сложно, как я думал поначалу: хоть и пришлось использовать несколько ухищрений, процесс работает!

Эта статья — дубликат моего репозитория. Я давно хотел написать первую публикацию на Хабре и решил начать с переноса своих «шпаргалок». Репозиторий я оформил самостоятельно, и в нём отражены только те ошибки, с которыми столкнулся я. Если вы обнаружите что-то новое, буду рад дополнить материалы.

Не будем затягивать — приступим!

Настройка системы

Для начала установим Homebrew, менеджер пакетов для macOS, который значительно упрощает процесс установки, обновления и удаления программного обеспечения через терминал. Он поможет в установке инструментов и библиотек, которых нет в стандартной поставке macOS.

Установка Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Далее нам понадобится несколько инструментов:

  • autoconf – инструмент для автоматической генерации configure-скриптов, часто используется в сборке программ из исходников.

  • automake – утилита для автоматического создания файлов Makefile.in на основе Makefile.am, используется в процессе сборки.

  • pkg-config – утилита, которая помогает находить пути и флаги компиляции для библиотек (CFLAGS, LDFLAGS).

  • libusb – библиотека для работы с USB-устройствами на низком уровне.

  • libusb-compat – совместимая версия libusb для программ, ожидающих API старой версии libusb-0.1.

brew install autoconf automake pkg-config libusb libusb-compat"

Установка Stlink:

Stlink — это open-source проект, исходники которого можно взять тут [https://github.com/texane/stlink.git].

mkdir stlink_v2 && cd stlink_v2
git clone https://github.com/texane/stlink.git && cd stlink/

Создаем папку для сборки:

mkdir build && cd build

Установка CMake через Homebrew:

brew install cmake

Генерация файлов сборки с CMake (Запускаем в родительской папке):

cmake ..

Компилируем проект:

make

(Если на этом моменте возникает ошибка, то в конце есть ее возможное решение)

Установка программ:

sudo make install

Все утилиты будут лежать в bin

Проверка подключения stlink v2:

st-info --probe

(Если на этом моменте возникает ошибка, то в конце есть ее возможное решение)

Прошивка:

Собираем исполняемый файл в любой удобной для Вас IDE. Если у вас файл с расширением .elf то измените его на бинарный:

arm-none-eabi-objcopy -O binary f103c8t6_v1.elf f103c8t6.bin

Переключите BOOT0 в 1, подключите плату и попробуйте прошить её:

st-flash write /Users/you_prof/stm32project/f103c8t6.bin 0x08000000

(проверьте путь до f103c8t6.bin, мой не будет совпадать с вашим!)

Нюансы

1) Проблема с компиляцией на macOS

При выполнении команды make для сборки проекта может возникнуть следующая ошибка:

In file included from .../libusb_settings.h:49:26:
error: 'MINIMAL_API_VERSION' is not defined, evaluates to 0 [-Werror,-Wundef]

Ошибка возникает потому, что в файле libusb_settings.h макрос MINIMAL_API_VERSION не определён для платформы macOS. В исходном коде проекта этот макрос задан только для систем FreeBSD, OpenBSD, Linux и Windows, а для macOS отсутствует соответствующее определение.

Чтобы устранить ошибку, необходимо отредактировать файл libusb_settings.h и добавить определение MINIMAL_API_VERSION для macOS. Например, можно внести следующие изменения:

  • Откройте файл по пути:

    stlink/src/stlink-lib/libusb_settings.h

  • Найдите блок с определениями платформ:

    #if defined (__FreeBSD__) #define MINIMAL_API_VERSION 0x01000102 // v1.0.16 #elif defined (__OpenBSD__) #define MINIMAL_API_VERSION 0x01000106 // v1.0.22 #elif defined (__linux__) #define MINIMAL_API_VERSION 0x01000106 // v1.0.22 #elif defined (_WIN32) #define MINIMAL_API_VERSION 0x01000109 // v1.0.25 #endif

  • Добавьте условие для macOS:

    #elif defined (__APPLE__) #define MINIMAL_API_VERSION 0x01000106 // v1.0.22

2) Проверка подключения stlink v2

Если у Вас возникла ошибка при проверке подключения stlink, то добавьте путь к библиотеке в DYLD_LIBRARY_PATH:

export DYLD_LIBRARY_PATH=/usr/local/lib:$DYLD_LIBRARY_PATH

Вывод должен быть примерно такой (может потребоваться нажать на RESET):

Found 1 stlink programmers
version:    V2J45S7
serial:     620031000D0000393333574E
flash:      0 (pagesize: 1024)
sram:       20480
chipid:     0x410
dev-type:   STM32F1xx_MD

...

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


  1. bak
    17.05.2025 08:38

    Консольный не всегда нормально работают с китайскими клонами. У меня консольный так и не завелся, вместо этого использую официальную GUI тулу, STM32CubeProgrammer - с ним всё работает и шьется без проблем. На всякий случай - это отдельная тула, ставится и работает отдельно от Cube IDE.


  1. HEXFFFFFFFF
    17.05.2025 08:38

    По моему работать с железом из под мака это извращение. Нормальные герои всегда идут в обход...))))

    Работаю с stm из под винды. Либо в vsc platformio либо, cubeide. Ни каких проблем и танцев с бубнами.


    1. ponikrf
      17.05.2025 08:38

      Работаю в MacOS с stm32 из VSCode - никаких проблем с программаторами и танцев с бубнами. Работают любые блюпилы и тп. OpenOCD работает без проблем. Заливается все одной кнопкой.

      У разных людей - разные пути.