Дешевая STM32 плата + Arduino IDE

image

Хотите прокачать ваши Arduino проекты? Заставить их работать быстрее, измерения и регулировку сделать точнее, ну и добавить баги, с новыми девайсами они неизбежны. Тогда эта статья для Вас.

Arduino тема всё больше захватывает умы человечества, но рано или поздно мы встречаемся с тем, что нам чего-то не хватает, например бюджета/размеров/пиновпортов/разрядности/производительности… Как говорил один мудрый человек — «Кто хочет, тот ищет возможности, кто не хочет — ищет причины».

Хорошие люди это понимают, и потихоньку начинают приобщать STM32 к ардуино теме, ибо восьмибитные AVR микроконтроллеры, на которых основано немало ардуино плат, не всегда могут справиться с поставленными задачами.

Краткое изложение данной статьи в видео формате:


Ладно, меньше лирики и ближе к теме. В этой статье, я буду рассматривать дешёвую отладочную плату, которая основана на базе микроконтроллера STM32F103C8T6:

image

Для начала, сравним основные параметры STM32 платы, и её аналога по цене — Arduino Nano V3.0:

  • Рабочая частота 72 МГц, против 16 у ардуино;
  • Объем Flash памяти 64 Кбайта, против 32;
  • Оперативной памяти, она же RAM (где хранятся переменные), у STM32 целых 20 Кбайт, у ардуинки всего лишь 2;
  • Быстрый 12-ти битный АЦП, в то время как у Arduino плат, что на базе AVR микроконтроллеров (это как правило большинство) используется 10-ти битный. Это означает, что в случае STM32, функция analogRead (*); будет возвращать 0…4095 против 0…1023, что в первом случае ведёт к более точным измерениям;
  • 16-ти битный аппаратный ШИМ, против 8-ми у Arduino плат, то есть, функция analogWrite (*); pwmWrite (*); может принимать значение 0…65535, против убогих 0…255. Это позволит ещё точнее управлять нашими двигателями, сервами и прочими девайсами, которые рулятся при помощи ШИМ;
  • Аппаратная работа с USB, чем не может похвастаться не одна Arduino плата стоимостью менее 2 долларов;
  • Напряжение питания — от 2 до 3.6В (прямо таки заточено под 2 AA батарейки), против 2.7…5В у ардуино плат;
  • Цены на момент написания статьи — 1.9 доллара против 1.8(алиэкспресс).


Очевидно, что отладочная плата на базе STM32 выигрывает по всём параметрам у Arduino Nano, исключением является разве что стоимость, но согласитесь 10 центов — хорошая цена за большую производительность, а про периферию, которой нафарширован STM32, так я вообще молчу, чего только стоят DMA или интегрированные в микроконтроллер часы реального времени.

image

Всё это в сумме делает данную плату крайне привлекательной во всём, кроме одного — новичку, как например мне, тема STM32 кажется слишком затратной по времени, есть целые сайты посвящённые программированию этих микроконтроллеров. А вот если подружить STM32 с Arduino IDE, то порог вхождения опускается до крайне низкого уровня. Хотя, как говориться, «В каждой бочке мёда, есть ложка дёгтя», но об этом чуть ниже.

Приступим к подготовке платы, для работы с Arduino IDE. Первое что необходимо сделать — залить в микроконтроллер специальный загрузчик, который позволит прошивать плату через аппаратный USB, причём прямо из среды разработки. Для этого необходимо перевести верхний джампер (он же «BOOT0»), в положение »1»:

image

Для чего нужны BOOT0 и BOOT1 джамперы
Дело в том, что в STM32 с завода прошит, в так называемую системную память (system memory), специальный загрузчик, который позволяет прошивать плату через самый обычный USB to UART переходник, не прибегая к специфическим программаторам типа ST-Link V2.

image

Дальше нам понадобиться переходник с USB на UART. Стоит помнить, что STM32, это 3.3 В логика, совместимость с 5-ти вольтовой не гарантируется, поэтому рекомендовано использовать USB to UART, у которого есть возможность выбора режимов работы с 3.3/5В логикой. Я использовал дешёвый переходник на базе CH340G:

image
* как видно, производитель не стал заворачиваться со смывкой флюса, на работу, конечно, никак не влияет.

Плату подключил к USB to UART переходнику следующим образом:

G <-> GND;
5V <-> 5V;
PA10 <-> TXD;
PA9 <-> RXD.

image
* PA10/PA9 на плате подписаны просто как A10/A9 — эти порты являются первым аппаратным USART’ом, всего их на плате 3, так же тут 2 аппаратных I2C и 2 SPI.

Ради удобства запитал плату от 5 В, для питания от 3.3 В на плате есть пин »3.3». Внимание, 5 В может запросто вывести микроконтроллер из строя, так что уделите должное внимание подключению.

Качаем, устанавливаем и запускаем Flash Loader Demonstrator (есть в архиве к статье):

image

Выбираем номер COM-порта нашего переходника, в моём случае это COM43, потом нажимаем «Next»:

image

Так как у меня микроконтроллер новый, ещё муха не сидела на него никто ничего не записывал (разумеется кроме самого производителя), то тут по умолчанию стоит защита от чтения, программа нас предупреждает, что если нажать кнопку «Remove protection», Flash память будет очищена, то есть если бы там была какая-то прошивка — она удалится. В моём случае там ничего полезного нет, так что смело жму. Далее вижу следующее:

image

Жмём «OK»:

image

Так как моя отладочная плата основана на микроконтроллере STM32F103C8 — здесь 64 Кбайт Flash памяти, есть ещё STM32F103CB микроконтроллер, где в два раза больше Flash.

Дальше кликаем «Next»:

image

Опять «Next», и видим следующее окно:

image

Выбираем «Download to device» и жмём на »…»:

image

Меняем тип файлов на *.bin и открываем файл «generic_boot20_pc13.bin»(тоже присутствует в архиве) который можно взять из проекта STM32duino-bootloader.

Дальше кликаем на кнопку «Next», после прошивки загрузчика мы увидим зелёный свет:

image

Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро (так же есть в архиве к статье). Тут есть один нюанс, на момент написания статьи, ядро не работает на версиях среды разработки свыше 1.6.5, у меня стоит 1.6.5-r5 которую скачал тут.

Дальше разархивируем содержимое по адресу Мои Документы\Arduino\hardware:

image

В моём случае полный путь выглядит вот так — «C:\Users\RSK\Documents\Arduino\hardware»

Разумеется, что система устройство определить не сумеет, поэтому надо ещё установить драйвера на плату. Заходим в папку «Мои Документы\Arduino\hardware\Arduino_STM32\drivers\win»(или «drivers\win», в случае архива к статье), и запускаем от имени администратора файл «install_drivers.bat»:

image

После этого верхний джампер (тот что «BOOT0»), переводим в положение »0» и подключаем плату к компьютеру через microUSB кабель:

image

Она должна в диспетчере устройств определиться или как «Maple DFU» или «Maple Serial (COM*)»:

image

Не совсем понятно почему после первого подключения плата определяется по-разному, на разных компьютерах, но не суть, приступаем к настройке Arduino IDE.

Запускаем среду разработки, дальше Инструменты → Плата → Boards Manager:

image

Здесь нужно установить ядро для платы Arduino Due. Выбираем последнюю версию и нажимаем «Install»:

image

Потом Инструменты → Плата → «Generic STM32F103C», дальше Variant: «STM32F103C8 (20k RAM. 64k Flash)», Upload Method: «STM32duino bootloader», Порт — номер COM-порта платы, вообщем всё как на скрине:

image

Всё, плата готова к прошивке и программированию в среде разработки Arduino IDE. Давайте прошьём какой-то скетч из примеров, которые «вшиты» в ядро, заходим Файл → Папка со скетчами → hardware → Arduino_STM32 → STM32F1 → libraries → A_STM32_Examples → Digital → Blink:

image

Классический «Hello World» в мире микроконтроллеров. Изменяем PB1 на PC13, так как светодиод, что на плате, подключен к этому порту:

image
* К стати, загорается он по низкому уровню на ножке PC13.

Нажимаем кнопку «Вгрузить», после прошивки среда разработки выдаст что-то типа:

image

«Done!
Resetting USB to switch back to runtime mode
error resetting after download: usb_reset: could not reset device, win error: Не удается найти указанный файл.».

Но прошивка то загрузилась успешно, хотя не всегда так, иногда Arduino IDE выдаёт другие сообщения.

Couldn’t find the DFU device
Когда видите, сообщение типа:

image

«dfu-util — © 2007–2008 by OpenMoko Inc.
Couldn’t find the DFU device: [1EAF:0003]
This program is Free Software and has ABSOLUTELY NO WARRANTY»

Это означает, что плату прошить не удалось.

Searching for DFU device [1EAF:0003]…
Когда среда разработки выдаёт:

image

«Searching for DFU device [1EAF:0003]…
Assuming the board is in perpetual bootloader mode and continuing to attempt dfu programming…»

И больше ничего не происходит, попробуйте в этот момент перезагрузить плату клацнув кнопку ресет. По аналогии это как с Arduino Pro Mini.

А теперь про «ложку дёгтя», о которой я писал вначале статьи, почему-то не всегда получается прошить плату в среде разработки, даже больше, она не всегда определяется компьютером. Я для себя это решил следующим образом, перед тем как загрузить прошивку (перед нажатием кнопки «Вгрузить»), клацаю «Reset» на плате, и после прошивки, ещё раз перезагружаю плату. В этом случае процент вероятности, что плата прошьется, равен 99%. Непонятно почему работает именно так, но факт. Думаю, что рано или поздно этот косяк поправят, и всё будет автоматом перезагружаться как нужно. А чтобы это быстрее поправили, надо чтобы комьюнити этой замечательной STM32 отладочной платы росла, поэтому делитесь этой статьей с друзьями, особенно с друзьями программистами.

По поводу распиновки:

Кликабельно
Лучшее что мне удалось найти, это распиновка самого микроконтроллера (открывайте в новой вкладке):

image
© www.stm32duino.com/viewtopic.php? p=11137

К порту нужно обращаться по полному имени, например:

digitalWrite (PB0, LOW);
analogWrite (PA8, 65535); pwmWrite (PA8, 65535);
analogRead (PA0);
LiquidCrystal lcd (PB0, PA7, PA6, PA5, PA4, PA3);

Ещё рекомендую зайти на сайт docs.leaflabs.com/docs.leaflabs.com/index.html там есть много чего интересного по теме программирования в Arduino IDE, правда на английском языке.

Я порылся в файлах ядра, и нашёл один интересный файл:
Documents\Arduino\hardware\Arduino_STM32\STM32F1\variants\generic_stm32f103c\board.cpp

Там прописаны все порты, которые поддерживают:

  • ШИМ, то есть функция analogWrite (); pwmWrite (); — PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8, а это далеко не все, которые размечены на распиновке чипа;
  • АЦП, аля analogRead (); — PB0, PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0.

Так что имейте это ввиду. Хотя этого более чем достаточно от платы, стоимостью в 1.9 доллара.

Ещё заметил, что пины PA12/PA11 подключены к D+/D- USB, их лишний раз лучше вообще не трогать, ибо чуть что, на кону не 2-х долларовый кусок стеклотекстолита с чипом, а материнская плата компьютера.

Схема отладочной платы:

Ну и на последок:

image

Привет geektimes.ru
//https://github.com/mk90/LiquidCrystalRus

//STM32 в массы!

#include 

LiquidCrystalRus lcd(PB9, PB8, PB7, PB6, PB5, PB4);

void setup() {
  lcd.begin(16, 2);
  lcd.print("Привет");
  lcd.setCursor(0, 1);
  lcd.print("geektimes.ru");
}

void loop() {
  lcd.setCursor(14, 1);
  lcd.print(millis() / 1000);
}


Ссылки:
Архив к статье;
Сайт товарища Roger Clark, посвящённый портированию STM32, вопросы/предложения/благодарности, всё туда;
https://github.com/rogerclarkmelbourne/Arduino_STM32;
http://docs.leaflabs.com/docs.leaflabs.com/index.html — именно этот проект был взят Роджером за основу, поэтому там много чего полезного, правда, на английском языке;
Arduino IDE версии 1.6.5-r5 скачать можно тут;
Моя статья, в какой-то мере пересекается с «STM32 vs Arduino» товарища RaJa;
Даташит на STM32F103C8T6;
Все мои публикации на geektimes.

P.S.

Что ещё забыл
Забыл добавить фото платы с обратной стороны:

image

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

Так же не рассказал, что дополнительно пропаивал microUSB разъем:

image

Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.

© Geektimes