STM32F103C — разработка в Arduino IDE под Linux
При прототипировании различных устройств на микроконтроллерах серии STM32F довольно удобно использовать среду разработки Arduino IDE. Большое количество готовых библиотек, отличная документация и огромное сообщество — и это только основные положительные моменты, что уж говорить о менее значимых преимуществах…
Однако, в отличии от оригинальных плат Arduino (UNO, Mega и д.р.), так называемая Blue Pill работает не так нужно, как хотелось бы — встроенный USB невозможно использовать для прошивки и отладки, приходится прибегать к таким дополнительным устройствам, как ST-Link или USB-UART конвертеры (да еще и с уровнями напряжения 3.3 вольта). А если в качестве операционной системы вы используете Linux, то проблем может прибавиться на порядок…
Тем не менее, все это решаемо. Именно об этом и пойдет речь.
Установка последней версии Arduino IDE
Переходим по ссылке https://www.arduino.cc/en/Main/Software и выбираем Download the Arduino IDE -> Linux 32/64 bits. Распаковываем скачанный архив в домашний каталог и запускаем файл install.sh для начала установки.
Добавление поддержки STM32F в менеджер плат
Запускаем Arduino IDE и открываем окно настроек (Файл -> Настройки). Добавляем дополнительную ссылку для Менеджера плат:
http://dan.drown.org/stm32duino/package_STM32duino_index.json
Далее открываем сам менеджер плат (Инструменты -> Плата: «…» -> Менеджер плат), вводим в поиске «STM32F1xx/GD32F1xx boards» и устанавливаем последнюю версию данного пакета.
Теперь необходимо выполнить скрипт install.sh, который находится в каталоге ~/.Arduino15/packages/stm32duino/tools/stm32tools/номер_версии/linux/. Это добавит необходимые правила udev для корректной работы утилиты upload-reset.
На некоторых дистрибутивах Linux (например Ubuntu) возникает проблема, связанная с недоступностью последовательного порта в течении нескольких секунда после подключения платы. Решается это добавлением следующих правил в файл /etc/udev/rules.d/45-maple.rules.
ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0004", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0004", ENV{MTP_NO_PROBE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0004", MODE:="0664"
KERNEL=="ttyACM*", ATTRS{idVendor}=="1eaf", ATTRS{idProduct}=="0004", MODE:="0664"
После чего необходимо выполнить команду:
sudo udevadm control --reload-rules
Доработка платы для корректной работы USB порта
Китайцы, как обычно, накосячили с номиналом резистора R10, из за чего USB порт работает не совсем корректно. Чтобы это исправить, необходимо заменить данный резистор (10к) на другой с номиналом 1.5к (маркировка 152).
Необходимо так же учитывать то, что выводы PA11 и PA12 должны быть свободны, т.к. они используется в USB подключении.
Установка загрузчика STM32duino при помощи ST-Link v2
Схема подключения:
Скачиваем бинарник загрузчика: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/binaries
Необходимую версию можно определить по номеру пина, к которому подключен встроенный светодиод. В моем случае это PC13, соответственно файл будет иметь имя generic_boot20_pc13.bin.
Прошиваем bootloader:
~/.Arduino15/packages/stm32duino/tools/stm32tools/номер_версии/linux/st-flash write generic_boot20_pc13.bin 0x8000000
По завершению отключаем плату от ST-Link`а и возвращаем джамперы на место. Теперь можно использовать встроенный USB порт.
Загрузка прошивок через Arduino IDE
В меню Инструменты выбираем следующие параметры:
- Board: Generic STM32F103C series
- Variant: STM32F103C8 (20k RAM. 64k Flash)
- CPU Speed(MHz): 72Mhz (Normal)
- Upload method: STM32duino bootloader
- Optimize: Smallest (default)
- Port: /dev/ttyACM*
Полезный совет: во время отладки удобно приостанавливать выполнение кода до момента подключения к монитору последовательного порта. Для этого используйте следующую конструкцию:
Serial.begin(115200);
while(!Serial.isConnected()){};
Обсуждение