STM32duino - наследник проекта LeafMaple

разделы: STM32 , Arduino , STM32duino , дата: 6 февраля 2017г.

Как я уже упоминал, проект LeafMaple после нескольких лет простоя свернулся, а его поддержку и развитие передали на сайт http://stm32duino.com/ который выполнен в виде форума. Впрочем, имеется там и Вики http://wiki.stm32duino.com.

Первым преимуществом STM32duino является то, что он поддерживает не только платы LeafMaple и их клоны, STM32duino можно установить на целый набор плат на stm32f103 а так же на stm32f4. Списки поддерживаемых плат, а также уровень их поддержки можно посмотреть в Вики.

Второй "плюс" проекта, то что там сделали таки драйвера для систем Windows 7 и выше. Т.е. то, что не могли сделать на leafmaple.com несколько лет.

Как следует из названия, в качестве IDE проект использует Arduino IDE, что упрощает жизнь, т.к. он поддерживает внешние IDE.

1) Установка загрузчика

Первым делом нужно будет прошить загрузчик. Напомню, что я работаю c клоном Maple Mini и в качестве программатора использую опять же клон ST-Link v2. Для тех кто использует Blue Pill и прошивает микроконтроллер через встроенный загрузчик, возможно будет полезна следующая статья: Дешевая STM32 плата + Arduino IDE UPD 15.07.2016.

Загрузчик для своей платы можно скачать здесь: https://github.com/rogerclarkmelbourne/STM32duino-bootloader/tree/master/STM32F1/binaries. В случае с Maple Mini это - maple_mini_boot20.bin

Прошивается загрузчик стандартно через STM32 ST-LINK Utility:

Если все прошло успешно, то после прошивки светодиод на плате сразу начинает мигать.

Но здесь кроется первый "подводный камень". После того, как в плату будет залит первый скетч через Arduino IDE, прошить чип через ST-LINK будет уже не просто. При нажатии на кнопку "Connect" в STM32 ST-LINK Utility будет выдаваться ошибка:

Т.е. STM32 ST-LINK Utility "не видит" чип. Для решения проблемы следует зайти в настройки:

При таких настройках у меня получается разблокировать чип:

Что бы разблокировать чип нужно нажать на кнопку "Reset" что на плате, при одновременном(или немного раньше или немного позже, как получится) нажатии на кнопку "Connect" в программе STM32 ST-LINK Utility. Обычно раза с пятого-десятого подключиться к чипу все же удается.

Очистив флеш память чипа, вы избавитесь как от проблемы с подключением, так и от самого загрузчика:

Что касается самой проблемы, то как понимаю, она кроется в отключенном SWD интерфейсе в прошивке. Аналогичного эффекта можно добиться если в STM32CubeMX отключить этот интерфейс как и предлагается в настройках по умолчанию:

2) Установка IDE в Windows

Установка софта описана здесь и здесь(для Windows).

По последней ссылке есть даже официальное видео по установке.

Сейчас последняя версия Arduino IDE - это 1.8.1. Она, как понимаю, еще не поддерживается проектом STM32duino. Поэтому нужно будет скачать с сайта Arduino версию 1.6.9. Для этого следует зайти в раздел предыдущих релизов:

Найти нужную версию:

Если в системе уже установлена последняя версия Arduino то лучше будет скачать zip-архив с версией 1.6.9, что бы версии не конфликтовали.

После распаковки zip-архива и запуска Arduino IDE нужно будет установить поддержку ARM. Делается это через менеджер плат:

Вбиваем в поиск ARM, выбираем архитектуру Cortex-M3 и нажимаем на установку:

После установки закрываем менеджер плат:

В настройках Arduino IDE нужно будет выставить галочки для отображения логов компиляции и загрузки прошивки. Также, если в системе уже установлен Arduino IDE, то лучше будет поменять дефолтный каталог для проектов во избежание конфликтов, т.к. поддержку плат STM32duino/LeafMaple будем ставить именно в этот каталог:

ZIP архив с поддержкой плат STM32duino/LeafMaple скачивается по этой ссылке https://github.com/rogerclarkmelbourne/Arduino_STM32/archive/master.zip

Архив следует перекинуть в папку с проектами Arduino, той что была прописана в настройках Arduino IDE:

В самой папке с проектами Arduino предварительно следует создать каталог "hardware", если его еще нет:

В созданный каталог "hardware" следует распаковать скачанный ZIP-архив:

Суффикс "-master" распакованного каталога следует убрать, переименовав его в "Arduino_STM32"

Теперь запустив Arduino IDE 1.9.6, в списке доступных плат должны появиться платы STM32duino/LeafMaple:

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

Осталось установить драйвер. В каталоге: "Arduino_STM32\drivers\win" будет bat-файл "install_drivers.bat" который следует запустить с правами администратора:

При успешной установке драйверов, появится следующее окошко:

Подключив плату к компьютеру через USB, она должна распознаться, и в диспетчере устройств появится "Maple DFU". DFU - это режим загрузчика - Download Firmaware Update. В этом режиме микроконтроллер можно прошить через USB с помощью dfu-util.

Теперь из примеров можно выбрать Blink:

Текст программы будет немного отличаться от Blink для Arduino на AVR:

Жмем на компиляцию что бы проверить, что все Ok:

Загружаем прошивку в плату:

После прошивки плата из DFU-устройства превращается в виртуальный COM-порт:

Теперь о том, как все это работает. При загрузке скетча, плата принудительно через драйвер перезагружается. При старте загрузчик входит на несколько секунд в режим DFU, и если ему передают прошивку он ее записывает, если нет, то передает управление той прошивке, которая имеется. Отсюда мы имеем второй "подводный камень": прошивать из виртуалки НЕ ПОЛУЧИТСЯ! Не знаю как в других виртуальных машинах, но в VirtualBox проброс USB устройства осуществляется вручную. И "несколько секунд" DFU режима, просто не пройдут в виртуальную машину. Зато в "чистой" Windows все работает замечательно.

2) Установка IDE в Linux

Установка для Linux аналогична установке для Windows до того этапа, когда приходиться ставить драйвер. Т.е. нужно будет ставить Arduino IDE 1.6.9, поддержку плат ARM, поддержку плат STM32duino.

Т.к. у меня 64-битная система меня в первую очередь будет интересовать содержимое каталога Arduino_STM32/tools/linux64

45-maple.rules
49-stlinkv1.rules
49-stlinkv2-1.rules
49-stlinkv2.rules
dfu-util
install.sh
maple_upload
readme.txt
serial_upload
src
stlink
stlink_upload
stm32flash
upload-reset
upload_router

Файл install.sh является шелл-скриптом:

#!/bin/sh

if sudo [ -w /etc/udev/rules.d ]; then
    echo "Copying Maple-specific udev rules..."
    sudo cp -v 45-maple.rules /etc/udev/rules.d/45-maple.rules
    sudo chown root:root /etc/udev/rules.d/45-maple.rules
    sudo chmod 644 /etc/udev/rules.d/45-maple.rules
    sudo cp -v 49-stlinkv1.rules /etc/udev/rules.d/49-stlinkv1.rules
    sudo chown root:root /etc/udev/rules.d/49-stlinkv1.rules
    sudo chmod 644 /etc/udev/rules.d/49-stlinkv1.rules
    sudo cp -v 49-stlinkv2.rules /etc/udev/rules.d/49-stlinkv2.rules
    sudo chown root:root /etc/udev/rules.d/49-stlinkv2.rules
    sudo chmod 644 /etc/udev/rules.d/49-stlinkv2.rules
    sudo cp -v 49-stlinkv2-1.rules /etc/udev/rules.d/49-stlinkv2-1.rules
    sudo chown root:root /etc/udev/rules.d/49-stlinkv2-1.rules
    sudo chmod 644 /etc/udev/rules.d/49-stlinkv2-1.rules
    echo "Reloading udev rules"
    sudo udevadm control --reload-rules
    echo "Adding current user to dialout group"
    sudo adduser $USER dialout
else
    echo "Couldn't copy to /etc/udev/rules.d/; you probably have to run this script as root? Or your distribution of Linux doesn't include udev; try running the IDE itself as root."
fi

В Readme предлагается запустить этот файл и скрестить пальцы в надежде, что все заработает. У меня заработало, но скажем так, далеко не сразу.

Во-первых, если посмотреть на содержимое установочного скрипта, нам предлагается: 1) перекинуть правила udev.rules в /etc/udev; 2) добавить пользователя в группе dialout для доступа к виртуальному последовательному порту. 3) перезагрузить правила udev командой: udevadm control --reload-rules.

Несмотря на название каталога linux64 программа upload-reset была собрана под 32-битную архитектуру, и отказывалась работать в моей 64-битной системе:

zero:~/Arduino/hardware/Arduino_STM32/tools/linux64: file ./upload-reset 
./upload-reset: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter 
/lib/ld-linux.so.2, BuildID[sha1]=dc8dc5ad6de94179a9d534b1a34aeb6d906640b1, not stripped

К счастью там есть каталог src в котором содержится исходник программы. Он без проблем компилируется под нужную архитектуру.

Второй проблемой являлось то, что среда не могла определить то, моя система 64-битная, и поэтому пришлось содержимое каталога linux64 скопировать в каталог linux.

После этого все заработало:

Т.е. если подытожить, то если хост-система является 32-битной, то достаточно будет запуска установочного скрипта install.sh с правами суперпользователя.

Если ли же система "pure"(не мультилиб) 64-bit, то потребуется перекомпиляция upload-reset, и замена каталога linux на содержимое каталога linux64(возможно хватит симлинка?).

Работает эта система как-то так:

Из лога видно, что плата меняет pid устройства с 0003 на 0004 и обратно, переключаясь с режима DFU в режим виртуального последовательного(COM) порта.

Если в логе Arduino IDE при прошивке будет ошибка вроде "не могу обнаружить DFU устройство" - это значит, что имеются проблемы или с udev-правилами или с утилитой upload-reset которая перезагружает плату перед прошивкой. По правде говоря, с этой ошибкой тоже можно перепрошить плату, если перед загрузкой скетча нажать reset на плате. Раза с пятого-десятого это получается.

3) Несколько примеров

Попробуем запустить несколько примеров.

Для начала, не хотите ли поиграться FreeRTOS?

Здесь красным подчеркнута строка, которую надо добавить к шаблонному примеру, чтобы он компилировался и работал на Maple Mini.

Теперь попробуем запустить виртуальный COM-порт, и передать с него данные с ADC:

Здесь в шаблонный пример я добавил задержку 500ms, и поменял аналоговый пин с 15-го на 11-й. В Maple Mini на 15-ом пине нет аналогового входа. Пины нумеруются по разметке на плате:

Так же призываю обратить внимание на комментарий к строке Serial.begin(115200); В USB нет тех скоростей, которые были в UART. В USB есть три скоростных режима работы: 1) Low-Speed 1500 КБит/с; 2) Full-Speed 12 МБит/c; 3) High-Speed 480M МБит/c. Как не трудно догадаться, USB порт микроконтроллера работает на скорости Full-Speed.

Про работу USB шины можно посмотреть например здесь:

В довершение к сказанному посмотрим на экран последовательного монитора:

Внизу справа есть переключение скоростей. И если в случае с UART при неправильно выставленной скорости, пропадала связь, то сейчас какое бы значение не выставить, ничего не изменится.

Ну и немного о результатах. Левый столбик sensor - вывод с аналогового входа. Здесь я сначала соединил пин с землей, а затем с питанием. ADC в STM32 12битный, что означает, что его значения варьируются в пределах [0-4095]. Ну и по логу видно, что младшие два бита "шумят". Правая колонка - значение PWM, она нас не интересует.

В завершение, попробуем подключить какое нибудь "умное" железо. По рукой у меня был цифровой температурный датчик DS18B20. Он нормально питается как от 5Вольт так и от 3.3Вольт.

В шаблонный скетч я добавил лишь задержку 500ms. Подключение типовое, подробно описано здесь: Практическое программирование Arduino/CraftDuino - температурный 1-Wire датчик DS18S20

Датчик подключается к 10 пину(задается через конструктор в самом начале: "OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary)")

Результат работы:

Все работает.

PS Последний скетч "весит" ~20Кбайт.

поделиться: