![image](https://habrastorage.org/files/c77/812/08e/c7781208e99a4b5ba071204b56d89691.jpg)
Хотите прокачать ваши 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.
![image](https://habrastorage.org/r/w1560/files/5a4/813/115/5a48131155d249a1b97e5619c133a0af.png)
![image](https://habrastorage.org/files/5a4/813/115/5a48131155d249a1b97e5619c133a0af.png)
Дальше нам понадобиться переходник с USB на UART. Стоит помнить, что STM32, это 3.3 В логика, совместимость с 5-ти вольтовой не гарантируется, поэтому рекомендовано использовать USB to UART, у которого есть возможность выбора режимов работы с 3.3/5В логикой. Я использовал дешёвый переходник на базе CH340G:
![image](https://habrastorage.org/files/85c/50b/0cb/85c50b0cbdf442daa01f436e37fd4b9b.jpg)
* как видно, производитель не стал заворачиваться со смывкой флюса, на работу, конечно, никак не влияет.
Плату подключил к USB to UART переходнику следующим образом:
G <-> GND;
5V <-> 5V;
PA10 <-> TXD;
PA9 <-> RXD.
![image](https://habrastorage.org/files/fa1/7c6/356/fa17c635681842d6b94add76cf4b2beb.jpg)
* PA10/PA9 на плате подписаны просто как A10/A9 — эти порты являются первым аппаратным USART'ом, всего их на плате 3, так же тут 2 аппаратных I2C и 2 SPI.
Ради удобства запитал плату от 5 В, для питания от 3.3 В на плате есть пин «3.3». Внимание, 5 В может запросто вывести микроконтроллер из строя, так что уделите должное внимание подключению.
Качаем, устанавливаем и запускаем Flash Loader Demonstrator(есть в архиве к статье):
![image](https://habrastorage.org/files/124/554/93b/12455493b0334429b4f975143717ef88.png)
Выбираем номер COM-порта нашего переходника, в моём случае это COM43, потом нажимаем «Next»:
![image](https://habrastorage.org/files/866/092/649/866092649ba24aaf9db036baa5aa29df.png)
Так как у меня микроконтроллер новый, ещё
Жмём «OK»:
![image](https://habrastorage.org/files/132/4ea/aa8/1324eaaa861144bca5619c2703a49b38.png)
Так как моя отладочная плата основана на микроконтроллере STM32F103C8 — здесь 64 Кбайт Flash памяти, есть ещё STM32F103CB микроконтроллер, где в два раза больше Flash.
Дальше кликаем «Next»:
![image](https://habrastorage.org/files/021/79d/9e9/02179d9e9acb48fd845b79364cf3765a.png)
Опять «Next», и видим следующее окно:
![image](https://habrastorage.org/files/eb8/373/a44/eb8373a444d2489ba2ac37077ebe9093.png)
Выбираем «Download to device» и жмём на "...":
![image](https://habrastorage.org/files/cd4/f1e/af6/cd4f1eaf6e4a4557befea62a0d5f91ee.png)
Меняем тип файлов на *.bin и открываем файл «generic_boot20_pc13.bin»(тоже присутствует в архиве) который можно взять из проекта STM32duino-bootloader.
Дальше кликаем на кнопку «Next», после прошивки загрузчика мы увидим зелёный свет:
![image](https://habrastorage.org/files/694/7e2/a39/6947e2a39b0e4dd2995145f80ec1a1b8.png)
Потом надо скачать, для среды разработки 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»:
![image](https://habrastorage.org/files/99a/523/588/99a523588e134d478d0d72988d9b1e6a.png)
После этого верхний джампер(тот что «BOOT0»), переводим в положение «0» и подключаем плату к компьютеру через microUSB кабель:
Она должна в диспетчере устройств определиться или как «Maple DFU» или «Maple Serial (COM*)»:
![image](https://habrastorage.org/files/97b/154/a3b/97b154a3b891400ca365af6e0c7ef922.png)
Не совсем понятно почему после первого подключения плата определяется по-разному, на разных компьютерах, но не суть, приступаем к настройке Arduino IDE.
Запускаем среду разработки, дальше Инструменты -> Плата -> Boards Manager:
![image](https://habrastorage.org/files/3c6/306/4e1/3c63064e14424feeba0dd583863de356.png)
Здесь нужно установить ядро для платы Arduino Due. Выбираем последнюю версию и нажимаем «Install»:
![image](https://habrastorage.org/files/558/187/594/558187594cfb4bce944089a37d76d7f9.png)
Потом Инструменты -> Плата -> «Generic STM32F103C», дальше Variant: «STM32F103C8 (20k RAM. 64k Flash)», Upload Method: «STM32duino bootloader», Порт — номер COM-порта платы, вообщем всё как на скрине:
![image](https://habrastorage.org/files/3a3/2a2/ecd/3a32a2ecdfdf4ca2bb9164eeffa9050d.png)
Всё, плата готова к прошивке и программированию в среде разработки Arduino IDE. Давайте прошьём какой-то скетч из примеров, которые «вшиты» в ядро, заходим Файл -> Папка со скетчами -> hardware -> Arduino_STM32 -> STM32F1 -> libraries -> A_STM32_Examples -> Digital -> Blink:
![image](https://habrastorage.org/files/fdb/7df/6fb/fdb7df6fb6b64ade9f6c23a031367e4b.png)
Классический «Hello World» в мире микроконтроллеров. Изменяем PB1 на PC13, так как светодиод, что на плате, подключен к этому порту:
* К стати, загорается он по низкому уровню на ножке PC13.
Нажимаем кнопку «Вгрузить», после прошивки среда разработки выдаст что-то типа:
![image](https://habrastorage.org/files/ae6/07b/674/ae607b6742f744088bd27b5388dbf31b.png)
«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](https://habrastorage.org/r/w1560/files/2f7/9b6/3c3/2f79b63c37dd44f6804f39c83d8ca14c.png)
«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»
Это означает, что плату прошить не удалось.
![image](https://habrastorage.org/files/2f7/9b6/3c3/2f79b63c37dd44f6804f39c83d8ca14c.png)
«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](https://habrastorage.org/r/w1560/files/b2f/a3e/a09/b2fa3ea09c004c8caf3175f1053e9d39.png)
«Searching for DFU device [1EAF:0003]…
Assuming the board is in perpetual bootloader mode and continuing to attempt dfu programming...»
И больше ничего не происходит, попробуйте в этот момент перезагрузить плату клацнув кнопку ресет. По аналогии это как с Arduino Pro Mini.
![image](https://habrastorage.org/files/b2f/a3e/a09/b2fa3ea09c004c8caf3175f1053e9d39.png)
«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](https://habrastorage.org/r/w1560/getpro/geektimes/post_images/4b0/def/711/4b0def711af2f6fc049dcb9c2c6c759e.png)
(с) 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-х долларовый кусок стеклотекстолита с чипом, а материнская плата компьютера.
![image](https://habrastorage.org/getpro/geektimes/post_images/4b0/def/711/4b0def711af2f6fc049dcb9c2c6c759e.png)
(с) 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.
Что ещё забыл
Забыл добавить фото платы с обратной стороны:
![image](https://habrastorage.org/files/08e/d64/4c5/08ed644c5daf40cb80ef5e2aa9442d51.JPG)
Тут почти ничего нет, стабилизатор и немного резисторов с конденсаторами.
Так же не рассказал, что дополнительно пропаивал microUSB разъем:
![image](https://habrastorage.org/r/w780q1/files/9fa/27c/f23/9fa27cf2394a446d8411f0b14f77f427.jpg)
Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.
Тут почти ничего нет, стабилизатор и немного резисторов с конденсаторами.
Так же не рассказал, что дополнительно пропаивал microUSB разъем:
![image](https://habrastorage.org/files/9fa/27c/f23/9fa27cf2394a446d8411f0b14f77f427.jpg)
Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.