Хотите прокачать ваши Arduino проекты? Заставить их работать быстрее, измерения и регулировку сделать точнее, ну и добавить баги(с новыми девайсами они неизбежны). Тогда эта статья для Вас.
Arduino тема всё больше захватывает умы человечества, но рано или поздно мы встречаемся с тем, что нам чего-то не хватает, например бюджета/размеров/
Хорошие люди это понимают, и потихоньку начинают приобщать STM32 к ардуино теме, ибо восьмибитные AVR микроконтроллеры, на которых основано немало ардуино плат, не всегда могут справиться с поставленными задачами.
Краткое изложение данной статьи в видео формате:
Ладно, меньше лирики и ближе к теме. В этой статье, я буду рассматривать дешёвую отладочную плату, которая основана на базе микроконтроллера STM32F103C8T6:
Для начала, сравним основные параметры 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 или интегрированные в микроконтроллер часы реального времени.
Всё это в сумме делает данную плату крайне привлекательной во всём, кроме одного — новичку, как например мне, тема STM32 кажется слишком затратной по времени, есть целые сайты посвящённые программированию этих микроконтроллеров. А вот если подружить STM32 с Arduino IDE, то порог вхождения опускается до крайне низкого уровня. Хотя, как говорится, «В каждой бочке мёда, есть ложка дёгтя», но об этом чуть ниже.
Приступим к подготовке платы, для работы с Arduino IDE. Первое что необходимо сделать — залить в микроконтроллер специальный загрузчик, который позволит прошивать плату через аппаратный USB, причём прямо из среды разработки. Для этого необходимо перевести верхний джампер(он же «BOOT0»), в положение «1»:
Для чего нужны BOOT0 и BOOT1 джамперы
Дело в том, что в STM32 с завода прошит, в так называемую системную память(system memory), специальный загрузчик, который позволяет прошивать плату через самый обычный USB to UART переходник, не прибегая к специфическим программаторам типа ST-Link V2.
Дальше нам понадобиться переходник с USB на UART. Стоит помнить, что STM32, это 3.3 В логика, совместимость с 5-ти вольтовой не гарантируется, поэтому рекомендовано использовать USB to UART, у которого есть возможность выбора режимов работы с 3.3/5В логикой. Я использовал дешёвый переходник на базе CH340G:
* как видно, производитель не стал заворачиваться со смывкой флюса, на работу, конечно, никак не влияет.
Плату подключил к USB to UART переходнику следующим образом:
G <-> GND;
5V <-> 5V;
PA10 <-> TXD;
PA9 <-> RXD.
* PA10/PA9 на плате подписаны просто как A10/A9 — эти порты являются первым аппаратным USART'ом, всего их на плате 3, так же тут 2 аппаратных I2C и 2 SPI.
Ради удобства запитал плату от 5 В, для питания от 3.3 В на плате есть пин «3.3». Внимание, 5 В может запросто вывести микроконтроллер из строя, так что уделите должное внимание подключению.
Качаем, устанавливаем и запускаем Flash Loader Demonstrator(есть в архиве к статье):
Выбираем номер COM-порта нашего переходника, в моём случае это COM43, потом нажимаем «Next»:
Так как у меня микроконтроллер новый, ещё
Жмём «OK»:
Так как моя отладочная плата основана на микроконтроллере STM32F103C8 — здесь 64 Кбайт Flash памяти, есть ещё STM32F103CB микроконтроллер, где в два раза больше Flash.
Дальше кликаем «Next»:
Опять «Next», и видим следующее окно:
Выбираем «Download to device» и жмём на "...":
Меняем тип файлов на *.bin и открываем файл «generic_boot20_pc13.bin»(тоже присутствует в архиве) который можно взять из проекта STM32duino-bootloader.
Дальше кликаем на кнопку «Next», после прошивки загрузчика мы увидим зелёный свет:
Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро(так же есть в архиве к статье).
Проверенна работоспособность ядра на Arduino IDE версии 1.6.9.
Дальше разархивируем содержимое по адресу Мои Документы\Arduino\hardware:
В моём случае полный путь выглядит вот так — «C:\Users\RSK\Documents\Arduino\hardware»
Разумеется, что система устройство определить не сумеет, поэтому надо ещё установить драйвера на плату. Заходим в папку «Мои Документы\Arduino\hardware\Arduino_STM32\drivers\win»(или «drivers\win», в случае архива к статье), и запускаем от имени администратора файл «install_drivers.bat»:
После этого верхний джампер(тот что «BOOT0»), переводим в положение «0» и подключаем плату к компьютеру через microUSB кабель:
Она должна в диспетчере устройств определиться или как «Maple DFU» или «Maple Serial (COM*)»:
Не совсем понятно почему после первого подключения плата определяется по-разному, на разных компьютерах, но не суть, приступаем к настройке Arduino IDE.
Запускаем среду разработки, дальше Инструменты -> Плата -> Boards Manager:
Здесь нужно установить ядро для платы Arduino Due. Выбираем последнюю версию и нажимаем «Install»:
Потом Инструменты -> Плата -> «Generic STM32F103C», дальше Variant: «STM32F103C8 (20k RAM. 64k Flash)», Upload Method: «STM32duino bootloader», Порт — номер COM-порта платы, вообщем всё как на скрине:
Всё, плата готова к прошивке и программированию в среде разработки Arduino IDE. Давайте прошьём какой-то скетч из примеров, которые «вшиты» в ядро, заходим Файл -> Папка со скетчами -> hardware -> Arduino_STM32 -> STM32F1 -> libraries -> A_STM32_Examples -> Digital -> Blink:
Классический «Hello World» в мире микроконтроллеров. Изменяем PB1 на PC13, так как светодиод, что на плате, подключен к этому порту:
* К стати, загорается он по низкому уровню на ножке PC13.
Нажимаем кнопку «Вгрузить», после прошивки среда разработки выдаст что-то типа:
«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
Когда видите, сообщение типа:
«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»
Это означает, что плату прошить не удалось.
«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]...
Когда среда разработки выдаёт:
«Searching for DFU device [1EAF:0003]…
Assuming the board is in perpetual bootloader mode and continuing to attempt dfu programming...»
И больше ничего не происходит, попробуйте в этот момент перезагрузить плату клацнув кнопку ресет. По аналогии это как с Arduino Pro Mini.
«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 отладочной платы росла, поэтому делитесь этой статьей с друзьями, особенно с друзьями программистами.
По поводу распиновки:
Кликабельно
Лучшее что мне удалось найти, это распиновка самого микроконтроллера(открывайте в новой вкладке):
(с) 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
Там прописаны все порты, которые поддерживают:
Так что имейте это ввиду. Хотя этого более чем достаточно от платы, стоимостью в 1.9 доллара.
Ещё заметил, что пины PA12/PA11 подключены к D+/D- USB, их лишний раз лучше вообще не трогать, ибо чуть что, на кону не 2-х долларовый кусок стеклотекстолита с чипом, а материнская плата компьютера.
(с) www.stm32duino.com/viewtopic.php?p=11137
К порту нужно обращаться по полному имени, например:
digitalWrite(PB0, LOW);
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-х долларовый кусок стеклотекстолита с чипом, а материнская плата компьютера.
Схема отладочной платы:
Кликабельно
Ну и на последок:
Привет geektimes.ru
//https://github.com/mk90/LiquidCrystalRus
//STM32 в массы!
#include <LiquidCrystalRus.h>
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.
UPD 15.07.2016
Проверенна работоспособность ядра на Arduino IDE версии 1.6.9:
geektimes.ru/post/277928/#comment_9532576
P.S.
Что ещё забыл
Забыл добавить фото платы с обратной стороны:
Тут почти ничего нет, стабилизатор и немного резисторов с конденсаторами.
Так же не рассказал, что дополнительно пропаивал microUSB разъем:
Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.
Тут почти ничего нет, стабилизатор и немного резисторов с конденсаторами.
Так же не рассказал, что дополнительно пропаивал microUSB разъем:
Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.