Прошивка stm32 через arduino ide stlink
В этом руководстве (перевод статьи [1]) показано, как записать загрузчик USB (USB Bootloader) в память микроконтроллера STM32F103C8T6 платы Blue Pill. С помощью этого загрузчика можно намного удобнее программировать плату Blue Pill Board через её порт USB, без необходимости применения дополнительного внешнего оборудования (такого как отладчик ST-Link или преобразователь интерфейсов USB - TTL UART).
Примечание: настоятельно рекомендуется предварительно ознакомиться с базовым руководством [2], чтобы получить общее понятие о конфигурации, настройках, соединениях платы Blue Pill.
Самая главная киллер-фича платы Arduino UNO (или любых подобных плат Arduino), из-за которой она стала такой популярной - простота программирования. Все, что нужно - просто подключить платку Arduino к компьютеру PC, запустить среду Arduino IDE, выполнить пару простых настроек - и после этого можно сразу погрузиться в мир программирования. Это действительно очень просто, если Вы правильно выбрали в настройках модель платы и правильный порт USB.
Изначально нельзя сказать то же самое про плату STM32F103C8T6 Blue Pill. В руководстве [2] было показано, как программировать обычную плату с микроконтроллером STM32F103C8T6 с помощью дополнительного внешнего адаптера USB - последовательный порт TTL UART. Описанный процесс выгрузки программы через адаптер FTDI не очень сложен, однако чтобы выгрузить программу, нужно каждый раз переключать микроконтроллер в режим программирования через его системный загрузчик (находящийся в ROM), и для нормальной работы нужно переключаться обратно (для чего ножку BOOT0 надо переводить в уровни лог. 1 и лог. 0).
Было бы проще, если использовать штатный microUSB порт платы Blue Pill для программирования. Загрузчик с открытым исходным кодом STM32F103C8T6 USB Bootloader [3] предоставляет такую возможность. С ним можно просто подключить плату Blue Pill через USB, и через него загрузить свою программу прямо из среды Arduino IDE. Как дополнительное преимущество - не придется манипулировать ножкой BOOT0, её можно просто оставить в рабочем режиме.
Для работы нам понадобиться следующее:
• Платка STM32F103C8T6 Blue Pill.
• Преобразователь интерфейсов USB - TTL UART (на чипе FTDI, CH340 или любой другой).
• Несколько соединительных проводов.
• Резистор 1.8 кОм (не обязательно).
• Компьютер PC с установленной системой программирования Arduino IDE
На рисунке ниже показана схема соединений между платой STM32 Blue Pill и преобразователем USB - TTL UART. Она такая же, как была описана в руководстве [2].
Наша задача - записать в память микроконтроллера двоичный код загрузчика [3] с помощью адаптера USB - TTL UART, как было описано в руководстве [2]. Двоичный код загрузчика находится в файле generic_boot20_pc13.bin, который можно загрузить по ссылке [4] (в каталоге binaries можно найти двоичный код загрузчика для многих других плат STM32).
Процесс установки загрузчика по шагам:
1. Выполните необходимые соединения, как показано на рисунке выше. Ножку BOOT0 необходимо перевести в уровень лог. 1, что при включении питания (или при сбросе) переведет микроконтроллер STM32F103C8T6 в режим программирования через его последовательный порт USART (запустится внутренний загрузчик, находящийся в системной памяти ROM микроконтроллера).
Примечание: логические уровни на ножках BOOT0 и BOOT1 переключаются желтыми перемычками. Резистор 1.8 кОм устанавливать не обязательно. Иногда это может понадобиться, при неуверенной работе интерфейса USB, если внутренней подтяжки pull-up не хватает.
2. Подключите к компьютеру адаптер USB - TTL UART, и подайте питание на плату Blue Pill. Питание можно подать через порт microUSB платы Blue Pill, либо так, как показано на рисунке выше - некоторые адаптеры USB - TTL UART выводят на свои контакты напряжение 5V или 3.3V. Запомните, какой номер COM-порта определился на компьютере, в Windows это можно узнать с помощью Диспетчера Устройств.
3. Выберите в каталоге binaries нужный файл загрузчика. Для платки Blue Pill нужен файл прошивки generic_boot20_pc13.bin [4].
Примечание: прошивки для разных плат отличаются в основном только ножкой микроконтроллера, к которой подключен светодиод. У платы Blue Pill это цифровой порт 13 по системе нумерации портов Arduino, что и отражено в имени файла прошивки загрузчика generic_boot20_pc13.bin.
Основные подготовительные работы сделаны. Остается самый важный шаг - выгрузка прошивки загрузчика через адаптер USB - TTL UART. Выгрузить прошивку можно двумя способами - с помощью утилиты STM32CubeProgrammer [5], либо с помощью утилиты STMFlashLoader Demo [6]. И тот и другой способ работают одинаково хорошо, в этой статье описано применение STM32CubeProgrammer.
4. Этот шаг можно пропустить, если утилита STM32CubeProgrammer уже установлена. Загрузите с сайта st.com утилиту STM32CubeProgrammer и установите. Утилита загружается в виде архива наподобие en.stm32cubeprg-win64_v2-7-0.zip (имя зависит от целевой операционной системы и от версии), для загрузки требуется регистрация на сайте st.com (регистрация несложная и бесплатная). Раскройте архив, и запустите находящийся в нем инсталлятор. При установке оставляйте все опции по умолчанию. После установки исполняемый файл утилиты STM32CubeProgrammer.exe будет находиться в папке наподобие "C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer".
5. Запустите утилиту STM32CubeProgrammer, выберите COM-порт для подключения (метки 1 и 2 на рисунке ниже). В этом примере показан выбор COM4, но в вашем случае может быть другой номер COM-порта, который был подключен на шаге 2. Оставьте остальные опции по умолчанию и кликните на кнопке Connect (метка 3 на рисунке).
6. В окне будет показан дамп памяти программ FLASH микроконтроллера, начиная с адреса 0x08000000. Кликните на кнопку загрузки файла прошивки, она находится слева (на рисунке ниже она показана красной стрелкой).
7. Отобразится окно диалога "Erasing & Programming", см. рисунок ниже. Кнопкой Browse (метка 1 на рисунке) выберите файл прошивки generic_boot20_pc13.bin. Убедитесь, что в поле ввода Start address указано значение 0x08000000 (метка 2 на рисунке). Все опции оставьте, как на рисунке, и кликните на кнопку Start Programming (метка 3 на рисунке).
8. Закройте утилиту STM32CubeProgrammer, отключите адаптер USB - TTL UART от компьютера. Переставьте перемычку BOOT0 обратно (для уровня лог. 0), после включения питания сразу будет запускаться программа загрузчика.
[Установка необходимых драйверов]
9. Перед тем, как продолжить, нужно скачать драйверы. Сначала загрузите ZIP-архив по ссылке [6], это драйверы для Arduino. Распакуйте содержимое архива, и переименуйте распакованную корневую папку как Arduino_STM32. Скопируйте эту папку со всем содержимым в директорию "C:\Users\ИмяПользователя\Documents\Arduino\hardware" (здесь вместо ИмяПользователя будет другой каталог, соответствующий имени текущего пользователя операционной системы). Если каталог Arduino\hardware не существует, то создайте его.
10. Откройте консоль командной строки с правами администратора, и перейдите в каталог "C:\Users\ИмяПользователя\Documents\Arduino\hardware\Arduino_STM32\drivers\win”. Запустите файл install_drivers.bat, это установит Maple DFU Driver и Maple Serial Driver.
После этого запустите файл install_STM_COM_drivers.bat для установки STM Serial Driver.
[Конфигурирование Arduino IDE]
11. Если Arduino IDE уже открыта, закройте её, подключите STM32 Blue Pill к компьютеру PC кабелем microUSB, и снова запустите Arduino IDE. В Arduino IDE перейдите в меню Tools и сделайте необходимые изменения в селекторе платы (Board Selector) так, как это было описано в руководстве [2]. Но сейчас необходимо поменять метод выгрузки программы (Upload Method) на "Maple DFU Bootloader 2.0". Остальные настройки будут такими же.
[Загрузка программы]
В качестве простой программы, на которой будем проверять работу сделанных настроек, выберите Blinky Sketch для STM32F103C8T6 Blue Pill Board. Убедитесь что для порта светодиода LED выбран порт PC13, и кликните на кнопку Upload. Программа Blinky Sketch скомпилируется, и через USB-загрузчик [3] будет записана в память микроконтроллера платы.
После загрузки программы светодиод начнет мигать.
[Ссылки]
Итак. Не будем здесь описывать для чего нужна данная плата. Думаю те кто ей заинтересовался знают о ее возможностях.
Но распиновку устройства все-же покажу для наглядности:
Я лишь покажу здесь как подключить usb/ttl или st-link для прошивки устройства. И как подготовить программу arduino ide для прошивки stm32.
Чтоб начать работу данной платы с arduino ide. Нам необходимо подключить usb/ttl конвертер к плате следующим образом:
ВАЖНО! Микроконтроллер stm32 имеет 3.3 вольтовую логику. Следовательно и usb/ttl должен быть таковым. Я же прошивал на видео обычным, который имеет 5 вольтовую логику. Но это не правильно. Всегда есть риск спалить устройство.
Также нужно поставить джампер как показано на картинке.
Итак, после того как подключили конвертер к плате и поставили перемычку правильно. Нам нужно скачать несколько приложений:
После того как все скачали, разархивируем архивы. Устанавливаем программу STM32 Flash loader demonstrator. Она не устанавливается на рабочий стол. Ее можно найти по слову deminstrator gui. После того как установили приложение. Откроем его.
И откроется первое окно, в котором выбираем COM порт которым определился usb/ttl конвертер. И нажимаем кнопку далее.
В этом окне если у Вас в первом блоке есть красные надписи, то нажимаем кнопку “Remove protection” и нажимаем Next. Ну и если у Вас все также как у меня на скрине, то ничего не делаем а сразу нажимаем “Next”.
Тут выбираем какая у нас плата. Возможно выбрать из двух вариантов. на 64К и на 128К. В моем случае это на 64К. Как определить? Если у Вас микроконтроллер STM32F103C8 то это 64К. А если STM32F103CB то это 128К.
После того как выбрали контроллер, нажимаем “Next”
В этом окне выбираем “Download from file” и переходим в распакованный архив STM32duino-bootloader. Там в папку binaries и выбираем файл gd32f1_pc13.bin .
Ну и тоже нажимаем далее. После этого начнется загрузка .bin файла.
После загрузки закрываем программу.
И открываем Arduino ide.
Если Вы ахив Arduino_stm32 положили корректно по пути Документы/arduino/hardware/ То при открытии программы Arduino ide в Инструменты в выборе платы должна появиться возможность выбора платы:
И для того чтоб плату заливался скетч необходимо выбрать “Generic STM32F103C series”
Теперь что касается прошивки. У меня работает 2 метода. Первый это прошивка через usb/ttl. Для этого нужно выбрать в “Upload method” нужно выбрать ” serial:
И все у Вас замечательно загрузится в микроконтроллер.
Но платы STM32F103C8T6 часто предлагают на aliexpress сразу с программатором st-link v2. С ним скетч в плату загружается гораздо быстрее. У него сразу 3.3 вольтовая логика, какраз которую хочет наш контроллер. По этому правильнее будет грузить программы в контроллер через st-link. Для этого подключим его к плате следующим образом:
После подключения, в “Upload method” нужно выбрать “STLink” и все. Теперь будет загружаться все через данынй свисток.
На этом все. Спасибо за внимание. Надеюсь статья помогла Вам.
Хотите прокачать ваши Arduino проекты? Заставить их работать быстрее, измерения и регулировку сделать точнее, ну и добавить баги(с новыми девайсами они неизбежны). Тогда эта статья для Вас.
Arduino тема всё больше захватывает умы человечества, но рано или поздно мы встречаемся с тем, что нам чего-то не хватает, например бюджета/размеров/пиновпортов/разрядности/производительности… Как говорил один мудрый человек — «Кто хочет, тот ищет возможности, кто не хочет — ищет причины».
Краткое изложение данной статьи в видео формате:
Ладно, меньше лирики и ближе к теме. В этой статье, я буду рассматривать дешёвую отладочную плату, которая основана на базе микроконтроллера STM32F103C8T6:
Для начала, сравним основные параметры STM32 платы, и её аналога по цене — Arduino Nano V3.0:
Всё это в сумме делает данную плату крайне привлекательной во всём, кроме одного — новичку, как например мне, тема STM32 кажется слишком затратной по времени, есть целые сайты посвящённые программированию этих микроконтроллеров. А вот если подружить STM32 с Arduino IDE, то порог вхождения опускается до крайне низкого уровня. Хотя, как говорится, «В каждой бочке мёда, есть ложка дёгтя», но об этом чуть ниже.
Приступим к подготовке платы, для работы с Arduino IDE. Первое что необходимо сделать — залить в микроконтроллер специальный загрузчик, который позволит прошивать плату через аппаратный USB, причём прямо из среды разработки. Для этого необходимо перевести верхний джампер(он же «BOOT0»), в положение «1»:
Дело в том, что в 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 переходнику следующим образом:
* PA10/PA9 на плате подписаны просто как A10/A9 — эти порты являются первым аппаратным USART'ом, всего их на плате 3, так же тут 2 аппаратных I2C и 2 SPI.
Ради удобства запитал плату от 5 В, для питания от 3.3 В на плате есть пин «3.3». Внимание, 5 В может запросто вывести микроконтроллер из строя, так что уделите должное внимание подключению.
Качаем, устанавливаем и запускаем Flash Loader Demonstrator(есть в архиве к статье):
Выбираем номер COM-порта нашего переходника, в моём случае это COM43, потом нажимаем «Next»:
Так как у меня микроконтроллер новый, ещё муха не сидела на него никто ничего не записывал(разумеется кроме самого производителя), то тут по умолчанию стоит защита от чтения, программа нас предупреждает, что если нажать кнопку «Remove protection», Flash память будет очищена, то есть если бы там была какая-то прошивка — она удалится. В моём случае там ничего полезного нет, так что смело жму. Далее вижу следующее:
Так как моя отладочная плата основана на микроконтроллере STM32F103C8 — здесь 64 Кбайт Flash памяти, есть ещё STM32F103CB микроконтроллер, где в два раза больше Flash.
Дальше кликаем «Next»:
Опять «Next», и видим следующее окно:
Выбираем «Download to device» и жмём на ". ":
Меняем тип файлов на *.bin и открываем файл «generic_boot20_pc13.bin»(тоже присутствует в архиве) который можно взять из проекта STM32duino-bootloader.
Дальше кликаем на кнопку «Next», после прошивки загрузчика мы увидим зелёный свет:
Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро(так же есть в архиве к статье). Тут есть один нюанс, на момент написания статьи, ядро не работает на версиях среды разработки свыше 1.6.5, у меня стоит 1.6.5-r5 которую скачал тут.
Проверенна работоспособность ядра на Arduino IDE версии 1.6.9.
В моём случае полный путь выглядит вот так — «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: Не удается найти указанный файл.».
«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]…
Assuming the board is in perpetual bootloader mode and continuing to attempt dfu programming. »
И больше ничего не происходит, попробуйте в этот момент перезагрузить плату клацнув кнопку ресет. По аналогии это как с Arduino Pro Mini.
А теперь про «ложку дёгтя», о которой я писал вначале статьи, почему-то не всегда получается прошить плату в среде разработки, даже больше, она не всегда определяется компьютером. Я для себя это решил следующим образом, перед тем как загрузить прошивку(перед нажатием кнопки «Вгрузить»), клацаю «Reset» на плате, и после прошивки, ещё раз перезагружаю плату. В этом случае процент вероятности, что плата прошьется, равен 99%. Непонятно почему работает именно так, но факт. Думаю, что рано или поздно этот косяк поправят, и всё будет автоматом перезагружаться как нужно. А чтобы это быстрее поправили, надо чтобы комьюнити этой замечательной STM32 отладочной платы росла, поэтому делитесь этой статьей с друзьями, особенно с друзьями программистами.
По поводу распиновки:
Лучшее что мне удалось найти, это распиновка самого микроконтроллера(открывайте в новой вкладке):
К порту нужно обращаться по полному имени, например:
digitalWrite(PB0, LOW); analogWrite(PA8, 65535);pwmWrite(PA8, 65535);
analogRead(PA0);
LiquidCrystal lcd(PB0, PA7, PA6, PA5, PA4, PA3);
Я порылся в файлах ядра, и нашёл один интересный файл:
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-х долларовый кусок стеклотекстолита с чипом, а материнская плата компьютера.
Схема отладочной платы:
Ну и на последок:
Забыл добавить фото платы с обратной стороны:
Тут почти ничего нет, стабилизатор и немного резисторов с конденсаторами.
Так же не рассказал, что дополнительно пропаивал microUSB разъем:
Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.
Готовим «взрослую» среду разработки под STM32 в Linux
Ранее мы выяснили, как разрабатывать под микроконтроллеры STM32 с использованием знакомой и понятной многим Arduino IDE. Этот подход, впрочем, не лишен недостатков. В частности, он (1) вводит лишние слои абстракции, что не позволяет писать максимально эффективный и компактный код, (2) работает с весьма ограниченным множеством микроконтроллеров и плат, а также (3) привязан к конкретной среде разработки, и не самой лучшей. Поэтому сегодня мы научимся разрабатывать под STM32 по-взрослому.
Важно! Порог вхождения в мир STM32 довольно высокий. Если вы никогда раньше не работали с микроконтроллерами, я бы рекомендовал начинать с плат Arduino и микроконтроллеров AVR.
Необходимый софт
Нам понадобятся следующие пакеты, часть из которых уже упоминалась в предыдущем посте:
Здесь приведены названия пакетов для Arch Linux, но я довольно уверен, что в других дистрибутивах Linux они называются так же, или как-то похоже. Если вам не удастся найти готовый пакет с STM32CubeMX, программу можно скачать отсюда (потребуется регистрация). Для работы приложению требуется виртуальная машина Java. Несмотря на то, что программа имеет расширение .exe, она превосходно запускается в Linux через java -jar file.exe .
Необходимое железо
Помимо профессионального софта нам также понадобится профессиональное железо. Плата Blue Pill, рассмотренная в прошлом посте, в целом неплоха, но пользоваться ею несколько неудобно. В частности, к ней приходится подсоединять внешний программатор с его лишними проводами. Плюс STM32CubeMX про эту плату ничего не знает, что также вносит свою долю неудобства. Наконец, если у вас этой платы еще нет, вам придется ждать ее доставки с AliExpress.
Компания STMicroelectronics производит собственные отладочные платы серий Discovery и Nucleo. Последние являются более новыми, поэтому сосредоточим свое внимание на них. Платы STM32 Nucleo имеют встроенный отладчик STLink v2.1, что избавляет нас от лишних проводов. Они до определенной степени совместимы с Arduino-шилдами, что может пригодиться. Цены на платы Nucleo в России начинаются от 19$ за плату Nucleo-F030R8, притом купить ее можно в любом Чип-и-Дипе хоть сегодня.
Лично я взял плату помощнее — Nucleo-F411RE, на вырост, так сказать:
Принимая во внимание разнообразие плат Nucleo, выбор первой платы может быть непростым делом для начинающих. Следует учитывать множество факторов, включая количество Flash-, SRAM- и EEPROM-памяти, максимальную рабочую частоту, используемое ядро Cortex-M, количество аппаратных реализаций SPI/I2C/I2S/UART/CAN-интерфейсов, наличие/отсутствие DAC, ADC и модуля FSMC, энергопотребление, стоимость отладочной платы и ее наличие в ближайших магазинах, и, конечно же, стоимость и доступность самого микроконтроллера. Так как сейчас я не работаю над каким-то конкретным проектом, а просто изучаю микроконтроллеры STM32, я выбрал плату Nucleo-F411RE из-за неплохого соотношения цены и качества. Также меня привлек тот факт, что в микроконтроллере STM32F411RET6, на котором основана эта плата, используется довольно мощное ядро Cortex-M4F со встроенным FPU.
Fun fact! Существуют платы Xnucleo от компании Waveshare, совместимые с платами Nucleo. Платы Xnucleo легко узнать по характерному сине-желтому дизайну. На вид они более продуманы, чем Nucleo, так как используют более общепринятый в наше время разъем micro USB вместо mini USB, лишены дизайнерских «линий надреза» (см предыдущее фото), делающих плату более хрупкой, и имеют впаянный HSE кварцевый резонатор. Также компания Waveshare является производителем множества шилдов для плат Nucleo и Xnucleo.
Создание каркаса проекта в STM32CubeMX
Имеется большое количество отладочных плат и микроконтроллеров, под каждый из которых может требоваться немного измененные версии заголовочных файлов и стандартной библиотеки. Это количество помножим на число всевозможных конфигураций этих микроконтроллеров, например, какие пины для чего используются, какая из внутренних шин на какой частоте работает, и так далее. В плане подобных настроек STM32 является очень гибкой платформой. Получается довольно сложно. Для борьбы с этой сложностью создание каркаса пустого проекта (так называемый scaffolding) для заданной платы или микроконтроллера осуществляется при помощи специальной GUI-программы, STM32CubeMX.
Запускаем программу, жмем New Project. Во вкладке Board Selector находим вашу плату и делаем по ней двойной клик. Если у вас еще нет платы Nucleo, но есть плата Blue Pill и программатор STLink v2, на этом шаге вы можете выбрать микроконтроллер STM32F103C8Tx во вкладке MCU Selector.
Появится интерфейс с несколькими вкладками, из которых наиболее интересной для нас сейчас является вкладка Pinout:
Эта вкладка позволяет настроить, какой пин микроконтроллера для чего будет использован (ввод, вывод, аналоговое чтение, SPI/I2C/UART-шина, и так далее). Так как STM32CubeMX знает про нашу плату, программа автоматически настроила пин PC13 на ввод (для чтения синей кнопки на плате), а пин PA5 — на вывод (для управления зеленым светодиодом на плате). В рамках этой заметки другие пины нам не потребуются, поэтому оставляем все, как есть. Если же вы используете незнакомую STM32CubeMX плату, здесь вам потребуется настроить пины вручную. Например, в случае с Blue Pill вы наверняка захотите настроить пин PC13 как GPIO_Output, так как он подключен к светодиоду на плате.
Важно! Если вы используете Blue Pill, в STM32CubeMX обязательно требуется включить SWD. По умолчанию для микроконтроллера STM32F103C8T6 он выключен. В связи с этим, плату вы без труда прошьете в первый раз, но прошить ее во второй будет довольно непросто (хотя возможно). Более подробное описание этой тонкости ищите в заметке Используем STM32 безо всяких отладочных плат.
На двух других вкладках с названиями Clock Configuration и Configuration в этот раз нам ничего менять не придется. На вкладке Power Consumtion Calculator можно оценить энергопотребление микроконтроллера и время его работы в зависимости от выбранного аккумулятора и рабочего напряжения. Надо сказать, довольно любопытная и полезная возможность.
На этом с настройкой покончено. Говорим Project → Generate Code. Во вкладке Project вводим имя проекта (Project Name), выбираем родительский каталог для этого проекта (Prоject Location), в выпадающем списке Toolchain / IDE выбираем вариант «Makefile». Во вкладке Code Generator стоит выбрать опцию «Add necessary library files as reference in the toolchain project configuration file». Иначе в ваш проект будут скопированы все библиотечные файлы, а это более 160 Мб. Затем жмем ОК. Проект STM32CubeMX автоматически сохранится в каталоге с исходным кодом (файл с расширением .ioc), поэтому отдельно сохранять его не требуется.
В противном случае не будут найдены исполняемые файлы компилятора.
Во-вторых, стоит найти переменную OPT и дописать в нее флаг -Wall :
Иначе компилятор не будет ругаться на код, который скорее всего содержит ошибки — например, выражение if ( arr [ i ] = 1 ) , на месте которого почти наверняка должно быть if ( arr [ i ] == 1 ) .
В-третьих, если после этого шага сказать make , вы можете получить ошибки вроде следующих:
На момент написания этих строк в STM32CubeMX был баг, заключавшийся в том, что он несколько раз включал одни и те же файлы в список C_SOURCES . Нужно найти этот список в Makefile и убрать из него все повторы.
В-четвертых, Makefile умеет компилировать проект, но не содержит таргетов для прошивания платы, ее очистки, а также подключения по UART. Стоит дописать:
Наконец, из соображений скорее перфекционизма, чем острой надобности, я бы заменил все абсолютные пути на относительные, введя переменную вроде:
… а также прогнал бы Makefile через утилиту dos2unix.
На этом подготовку шаблона/каркаса можно считать завершенной! Чтобы не проделывать описанные выше шаги при создании каждого нового проекта, шаблон стоит сохранить где-нибудь в надежном месте. Дабы не приходилось при повторном использовании этого шаблона редактировать имя проекта, стоит также отредактировать значение переменной TARGET на какое-нибудь абстрактное main .
Пишем код!
Если вы откроете файл Src/main.c, то найдете в нем множество отметок вроде:
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
По задумке, код нужно вписывать между этими комментариями, чтобы при обновлении проекта в STM32CubeMX пользовательский код не был затерт. Лично я добавил вызов процедур init ( ) и loop ( ) в окрестностях основного цикла программы:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
init ( ) ;
while ( 1 )
{
loop ( ) ;
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
… а сами процедуры объявил перед процедурой main ( ) :
/* USER CODE BEGIN 0 */
void init ( void ) {
/* do nothing, yet */
}
void loop ( void ) {
/*
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(500);
*/
if ( HAL_GPIO_ReadPin ( GPIOC , GPIO_PIN_13 ) == GPIO_PIN_RESET ) {
HAL_GPIO_TogglePin ( GPIOA , GPIO_PIN_5 ) ;
}
/* USER CODE END 0 */
Управление микроконтроллером осуществляется через библиотеку под названием HAL, Hardware Abstraction Layer. Как видите, что касается обычного чтения кнопок и мигания светодиодами, здесь все не намного сложнее, чем в случае с той же Arduino.
Подключаем плату и говорим make flash . Если все было сделано правильно, нажатие синей кнопки на плате будет приводить к переключению зеленого светодиода. Также можно оставить в процедуре loop ( ) только код, который в приведенном выше отрывке я закомментировал, и тогда программа превратиться в обычный Blink.
Важно! Иногда микроконтроллер не запускается с новой прошивкой без нажатия черной кнопки Reset. По идее, обновление прошивки программатора с помощью утилиты STLinkUpgrade и использование утилиты st-flash с флагом --reset , как в нашем Makefile, исправляет эту проблему. Но так как она воспроизводится нерегулярно, полной уверенности нет.
Заключение
Как видите, все не так уж и сложно. Полученных знаний уже вполне достаточно, например, для того, чтобы написать программу, выводящую что-то на ЖК-экранчик или декодирующую сигнал от джойстика Sega. Можно даже пообщаться с какими-то сторонними модулями по SPI или I2C, хотя и не слишком эффективно, если вспомнить о наличии в микроконтроллере аппаратной поддержки этих протоколов. Однако эти темы, ровно как и ШИМ, чтение аналогового сигнала, работа с прерываниями или отладка кода, увы, выходят за рамки этой и без того уже довольно длинной статьи.
Кстати, к вопросу о выходящем за рамки. Хотя приведенных выше сведений будет вполне достаточно тем, кто пишет в Vim, как в данное время суток это делаю я, или каком-нибудь Sublime Text, кто-то из читателей может предпочитать работать в IDE. Настройка Eclipse для разработки под STM32 подробно расписана в книге Mastering STM32 за авторством Carmine Noviello. Если же вы предпочитаете CLion, его настройку подробно описал Илья Моторный в статье JetBrains CLion для микроконтроллеров.
Полную версию исходников к этому посту, как обычно, вы найдете на GitHub.
В этом руководстве (перевод [1]) рассматривается, как программировать платку на микроконтроллере STM32F103C8T6, так называемую "Blue Pill" [2] (часто эту плату называют Arduino STM32) с помощью Arduino IDE. Платки Blue Pill в изобилии продаются на AliExpress и Taobao, для поиска вбейте STM32 stm32f103c8t6.
Примечание: если Вы любите паять, то можно также самому заказать печатную плату Blue Pill онлайн-среде EasyEDA благодаря проекту [3]. Это модифицированный в сторону упрощения проект - заменен регулятор LDO на более удобный. Также изменены номинал резистора подтяжки USB и светодиоды индикации. Десяток плат обойдутся примерно $5, плюс доставка порядка $6.
[Что понадобится]
Платка STM32 "Blue Pill" или аналогичная:
Отладчик ST-LINK/V2 для микроконтроллеров семейств STM8 и STM32:
Примечание: этот отладчик можно купить на AliExpress и Taobao по цене порядка $2. Подойдет и более старый отладчик ST-LINK или ST-LINK/v1, однако будьте внимательны к подключению отладчика через выводы SWDCLK, SWDIO, GND и +3.3V, цоколевки у разъема отладки могут различаться (см. врезку ниже).
На цоколевках синим цветом выделены 4 провода, которыми адаптер подключается к микроконтроллеру STM32.
[STLink/STLink-V1]
Вид на штырьки разъема снаружи:
+----+
T_JRST |1 2| 3V3
5V |3 4| T_JTCK/ T_SWCLK
SWIM |5 6| T_JTMS/ T_SWDIO
GND |7 8| T_JTDO
SWIM RST |9 10| T_JTDI
+----+
[STLink-V2]
Вид на штырьки разъема снаружи:
+----+
RST |1 2| SWCLK
SWIM |3 4| SWDIO
GND |5 6| GND
3.3V |7 8| 3.3V
5V |9 10| 5V
+----+
Еще один возможный вариант цоколевки:
+----+
RST |1 2| SWDIO
GND |3 4| GND
SWIM |5 6| SWCLK
3.3V |7 8| 3.3V
5V |9 10| 5V
+----+
[Конфигурирование Arduino IDE]
Автор оригинальной статьи [1] использовал Arduino 1.8.1. Я экспериментировал в среде Arduino версии 1.8.13, и все описанное относится к ней. Так что вероятно, что в другой более-менее новой версии Arduino все также будет работать. Процесс по шагам:
1. Зайдите в меню Файл -> Настройки (File -> Preferences) и кликните на кнопку справа от поля ввода "Дополнительные ссылки для Менеджера плат:" (Additional Boards Manager URLs).
2. В окно ввода URL вставьте ссылку
Закройте окна настроек кликами на OK.
3. Зайдите в меню Инструменты -> плата -> Менеджер плат. (Tools -> Board -> Board Manager). Для ускорения поиска нужного дополнения в выпадающем списке Тип (Type) выберите Внесены (Contributed). Прокрутите до STM32 Cores by STMicroelectronics и нажмите на кнопку Установка (Install).
Установка пакета поддержки STM32 займет несколько минут. Загрузятся утилиты компилирования и отладки ARM (ARM debugging/compiling toolchain).
4. Необходимо добавить поддержку ST-Link. Загрузите Arduino_STM32-master.zip по ссылке [4]. Создайте папку Arduino_STM32 в каталоге arduino-1.8.13\hardware\ (здесь arduino-1.8.13 это корневой каталог установки Arduino IDE, где находится исполняемый файл arduino.exe). Распакуйте содержимое архива Arduino_STM32-master.zip в папку arduino-1.8.13\hardware\Arduino_STM32.
Перезапустите Arduino IDE.
5. Теперь надо сделать выбор используемой платы и программатора. Зайдите в меню Инструменты (Tools) -> Плата: (Board) -> STM32F1 Boards (Arduino_STM32) -> Generic STM32F103C series. Выбор может быть сделан на основе используемого на плате микроконтроллера.
Плата: (Board) -> STM32 Boards (selected from submenu) -> Generic STM32F1 Series. После этого меню Инструменты изменится, в нем появятся новые пункты. Выберите пункт Board part number: "Blue Pill F103C6 (32K)". Выбор может быть сделан на основе используемого на плате микроконтроллера. Поэтому, если на плате стоит STM32F103C8T6, то выберите Black Pill F103C8 или Generic F103C8. -->Пример возможного выбора:
Плата: "Generic STM32F103C series"
Variant: "STM32F103C8 (20k RAM. 64k Flash)"
Upload method: "STLink"
CPU Speed(MHz): "72 MHz (Normal)"
Optimize: "Smallest (default)"
[Загрузка скетча]
Чтобы убедиться, что все работает, запишем в память STM32103 простейшую программу мигания светодиодом - традиционный "Hello World" в мире микроконтроллеров. Для этого зайдите в меню Файл -> Примеры -> 01.Basics -> Blink (File -> Examples -> 01.Basics -> Blink).
Загрузится скетч Blink.
Соедините STLink с платой Blue Pill четырьмя проводами (см. выше врезку "Цоколевки разъема SWD адаптеров ST-Link"):
Перемычки BOOT0 и BOOT1 установите в положение 00, что соответствует запуску кода из памяти Flash.
Нажмите на круглую кнопку со стрелкой вправо (эквивалентно выбору в меню Скетч -> Загрузка Ctrl+U). Программа скомпилируется и загрузится, светодиод PC13 начнет медленно мигать.
[Что дальше?]
Микроконтроллер серии STM32F1 (Arm® Cortex™-M) обладает широким набором аппаратных интерфейсов и возможностей использования.
Поэкспериментируйте с другими примерами кода и проектами из меню Файл -> Примеры. Будьте осторожны с использованием выводов USB- и USB+ (ножки портов PA11 и PA12) - они соединены с выводами коннектора microUSB. Также имейте в виду, что к выводам OSC32IN и OSC32OUT (ножки портов PC14 и PC15) подключен часовой кварцевый резонатор на 32.768 кГц.
[Ссылки]
Читайте также: