289

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим.

Как и обещал, начинаю тему про STM32. Данный пост вводный, я расскажу о настройке рабочей среды, немножко поморгаем светодиодами, всковырнём (чуть-чуть) FreeRTOS. Ну а в следующей статье я сравню STM32 и Atmega, посмотрим, зачем вообще нам нужны ARM.


Статья рассчитана на тех, кто давно ходит вокруг да около STM32, но не знает, с какого бока подступиться. Некоторые моменты могут показаться сложными на первый взгляд, но надо поработать мозгами, уж простите =) Стоит только понять некоторые основополагающие вещи, как наступит просветление, уверяю вас!


Внимание! Много текста и картинок!


1. Макетная плата


Для Пикабу я буду адаптировать статьи под обычную и дешёвую плату на STM32F103C8T6, например такую:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Их полно на Али, стоят около 120 рублей, можно заказывать пачками. Я заказал себе штук пять вариаций. По их приезду буду адаптировать больше своих статей сюда. У неё на борту 64-Кбайт Flash и 20-КБайт RAM. Вообще, чип довольно попсовый. Таймеров всего 4 штуки, периферия хиленькая. Но он стоит копейки, частота 72МГц, много оперативы, а значит можно неплохо развернуть FreeRTOS.


Также на Хабре и у себя в блоге я публикую статьи для оригинальной макетки STM32F3DISCOVERY, она основана на МК STM32F303VCT6 c 256-Кбайт Flash и 48-КБайт RAM в корпусе LQFP100. С ней гораздо интереснее работать.


Также вам понадобится программатор ST-Link, их также полно на Али, стоят от 150 руб с доставкой.


2. Среда разработки


Корпел несколько дней и родил аж две огромные статьи по настройке среды разработки под Linux Ubuntu 16.04 и MS Windows 10. Ниже я покажу, как настроить проект под нашу макетную плату и как подключить к ней светодиоды и кнопку.


Настройка Sublime Text 3, SW4 и STM32CubeMX для разработки STM32 под Windows 10

Настройка Sublime Text 3, SW4 и STM32CubeMX для разработки STM32 под Linux


Я не буду полностью адаптировать эти статьи, т.к. большие сложности с публикацией форматированного кода на Пикабу. Выкладывать скрины и ссылки на Gist лишний раз не хочется. Я буду отсылать к этим статьям, так что держите вкладки с ними открытыми.


Также я буду приводить все примеры для SW4. Если вы хотите работать под Keil uVision - нет проблем. Я в другой статье напишу, как он устроен и какой у него крутой дебаггер, если доступные статьи вам не нравятся (пишите в комментах).



Ну ладно. приступим!


Подключать будем по такой схеме (RESET и BOOT0/BOOT1 нарисовал до кучи)

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Я считаю с этого места, что вы настроили среду разработки.


Для начала надо подключить ST-Link к нашему контроллеру. Делаем по схеме (слева программатор, справа контроллер):


SWDIO -> IO (или пин PA13)

SWCLK -> CLK (или пин PA14)

3.3V -> V3

GND -> G


Открываем STM32CubeMX и устанавливаем библиотеки для STM32F1 Help->Install New Libriaries, ставим галку Firmware Package for Family STM32F1, жмём Install Now:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Жмем New Project, в поле Part Number Search пишем STM32F103C8:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Щёлкаем два раза на чипе в нижней части экрана и попадаем в окно настройки.

Сначала настроим основные параметры.

- Включим FreeRTOS

- Включим резонатор на плате

- Затактируем системный таймер от TIM4

- Включим дебаг

- Включим RTC

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Теперь подключим кнопку и два светодиода:

- Щелчок на PA0 -> GPIO_EXTI0. Правый щелчок на PA0 -> Enter User Label -> BUTTON. Обратите внимание, мы подключаем кнопку на прерывание EXT0.

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост
STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

- Аналогично щелкаем на PB0 и PB1, только выбираем GPIO_Output и называем LED1 и LED2:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

В результате получим такую распиновку:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Откроем вкладку Clock Configuration.

- Отмечаем, что тактируемся от HSE и ставим частоту системной шины 72МГц:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Переходим во вкладку Configuration.


1. Настроим Кнопку. Жмём GPIO, выбираем кнопку и ставим сработку прерывания по обоим фронтам импульса, а также подтянем линию к питанию.

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

2. Включим прерывание на кнопку. Жмём NVIC и в строке EXTI line0 interrupt ставим обе галки

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

3. Настроим FreeRTOS

Жмём на FreeRTOS, во вкладке Config parameters выставляем TOTAL_HEAP_SIZE 4096 (это сколько памяти мы резервируем для всего FreeRTOS в целом)

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Во вкладке Task and Queues добавляем три задачи:

- Task Name: buttonPress, Priority: osPriorityNormal, Entry Function: StartButtonTask

- Task Name: Led1, Priority: osPriorityNormal, Entry Function: StartLed1Task

- Task Name: Led2, Priority: osPriorityNormal, Entry Function: StartLed2Task

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Во вкладке Timers and Semaphores добавим семафор, за который будут драться светодиоды:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Включим функцию vTaskDelayUntill во вкладке Include parameters:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

Теперь укажем параметры проекта в Project->Settings из верхнего меню.


Указываем имя проекта в поле Project Name: PikabuLes1

Указываем путь в поле Project Location: ВАШ ПУТЬ, ГДЕ ХРАНИТЕ ПРОЕКТЫ

Выбираем Toolchain: SW4STM32

Не забываем во вкладке Code Generator включить “Add necessary libriary files as reference in the toolchain project configuration file”


Генерируем проект:

STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. Stm32, Stm32f103, Freertos, Урок, Длиннопост

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


Inc/main.h -> меняем на этот

Src/main.c -> меняем на этот

Src/stm32f1xx_it.c -> меняем на этот


И для корректного автодополнения кода в ST3 в корень проекта закинуть CMakeLists.txt (если у вас Linux) либо сформировать правильный .clang_complete (если Windows), как я писал в статье.


Загружаем и запускаем так, как написано в той же статье.


Можете и тупо клонировать репо, инструкцию выше я давал для понимания, как это делается.


Теперь расскажу, как это всё работает.


Суть всего процесса - это планировщик задач FreeRTOS. У нас есть три задачи:

- ButtonTask: Занимается обработкой нажатий нашей кнопки

- Led1Task и Led2Task: занимаются светодиодами LED1 и LED2.


Для особого шика я добавил в эту связку бинарный семафор ledOnSemHandle. Суть его в том, что кто им владеет, тот и может управлять своим светодиодом. А кнопка, если перехватывает семафор, управляет обоими светодиодами.


Итак. При старте семафор свободен, состояние кнопки неизвестно. Кому повезёт, тот и хватает семафор функцией xSemaphoreTake. Соответственно задачи Led1Task или Led2Task ждут, когда семафор освободится.


Если нажимается кнопка, то задача ButtonTask ждёт, когда ей отдадут семафор. Когда она его получает, зажигает оба светодиода и держит семафор, пока не отпустить кнопку.


Дальше. Нажатия кнопки отбиваются прерыванием в Src/stm32f1xx_it.c в колбэке EXTI0_IRQHandler(). Самое главное вот в чём:

- Срабатывает прерывание.

- Мы проверяем, что сработка была более 50мсек от предыдущего срабатывания (простая защита от дребезга)

- Проверяем состояние линии: нажата или отпущена кнопка

- Уведомляем задачу ButtonTask об изменившемся состоянии кнопки

- Задача ButtonTask в зависимости от состояния кнопки пытается перехватить семафор или наоборот отдаёт его.


Вообще, с бинарными семафорами надо быть ОЧЕНЬ аккуратными. Это опасная штука и надо стараться обходиться без них. Хотя в некоторых задачах они необходимы. Например, если несколько задач используют одну шину для передачи данных. Но надо всегда держать в голове, что категорически нельзя глушить задачи, которые имеют доступ к семафору, иначе можно повесить всё наглухо.

Так, на этом всё на сегодня. Это вводная статья и тут куча моментов, на которых стоит остановиться подробнее. Об этом другой раз. Ну или пишите в комментах.


P.S. Баянометр ругается, но совпадений точно нет, контент на 100% уникальный.

Найдены дубликаты

133 комментария

по актуальности
+8
Извините, но зачем RTOS в первом же уроке? Он сам по себе на многие уроки тянет :)
раскрыть ветку 9
+2
Ну как сказать. Аммм... Я за то, чтобы сразу приучать к программированию реального времени, так сказать. Я даже в самых элементарных проектах использую FreeRTOS, пусть и в два потока. Да, памяти кушает, но её достаточно. А гешефта сразу получаешь кучу. Если вдруг проект вырастет, что не редкость, снимается куча проблем. Да и мышление заточено под асинхронное программирование. К тому же, я ж сказал, похулиганим 😂
раскрыть ветку 8
+3
Это вы зря так. Сначала человек должен понять с чем он работает. Голый си и настройка без сторонних библиотек просто меняя биты в регистрах. Да, немного сложнее, но гешафт в том, что начинаешь понимать внутреннюю структуру контроллера. Человек учится пользоваться Reference manual. Видит перед собой схему тактирования и схему выводов GPIO. Такой подход даст бОльшую фору перед ардуиноподобным подходом. Будет проще разбираться и с другими контроллерами. Это IMHO.
раскрыть ветку 6
0
СПАСИБО тебе большое! Обязательно пиши ещё!!!
+9
Иллюстрация к комментарию
раскрыть ветку 6
+4

Главный вопрос с которого стоило бы начать для чего можно использовать по мимо баловства не раскрыт%)

раскрыть ветку 5
+1
Для этого надо снимать видео. А для этого нужен штатив. Оплатил, заказал, жду)) тут вообще сложный вопрос. Я не знаю сам, откуда начать. Мнений тысяча на этот счёт, единого нет. Вот пытаюсь как-то найти свой путь 😁
раскрыть ветку 2
0
Если у вас это вопрос, значит вам это не нужно !
раскрыть ветку 1
+4

STM32CubeMX
Ой, не, нафиг-нафиг.

+3

А простой USB TTL не подойдёт?

Иллюстрация к комментарию
раскрыть ветку 1
0
Есть вариант прошивки через Uart, но дебага не будет
+2

Покажите, пожалуйста, проекты, под которые идёт такая техника.

У меня за плечами полтора десятка проектов (в т.ч. коммерческих) и я пока вообще не представляю, что нужно придумать, чтобы Arduino перестал справляться. 99% делаю на Nano (как вариант - Pro Mini), штучно - Mega/NodeMCU, ну и теоретически есть ещё Due.

раскрыть ветку 26
0

лабораторный блок питания. дисплей на ST7735 160х128 точек SPI. цвет одного пикселя 17бит. посчитай теперь нужную скорость SPI. справится твоя atmega328? справится, только фпс будет 0,5 кадра в секунду - красотища). я уже не говорю про то, что тупо не хватит вычислительной мощности. а у ф103 есть ДМА - отличная штука.

раскрыть ветку 25
+2
Т.е. быстрый вывод большого количества информации на дисплей, к примеру, ок.

У меня с относительно большими дисплеями был опыт с Mega + UTFT 320x480 - при полной отрисовке картинки "с нуля" fps действительно 0.5 (впрочем, картинку я не сам формирую, а на лету читаю из сети через W5100 ethernet), но в проекте такой fps был приемлем.

https://www.aliexpress.com/item/3-2-inch-TFT-LCD-screen-modu...


Если вести речь про "лабораторный блок питания" - неужели там надо всю картинку целиком отрисовывать? Судя по тестам этой комбинации (mega+utft), отдельные элементы (т.е. без перерисовки всего экрана) выводятся очень даже шустро.


ОК, если речь зашла о производительности - что скажете про NodeMCU? Мегагерц-то там не пожалели (не очень большое количество выводов GPIO - отдельный вопрос)?


Ну и финальный вопрос. Упомянутая в статье среда разработки и количество телодвижений для первого "Hello, world!" вызывает панику и ужас. Что скажете про работу с STM32 в Arduino IDE? Насколько понимаю, в плату заливается совместимый с IDE бутлоадер и вся конструкция начинает называться STM32duino. Был такой опыт?

раскрыть ветку 19
+1
Ок, управление графическими дисплеями - задача для стм32. А ещё есть примеры?
раскрыть ветку 4
+2

Интересно. Пиши исчо!

раскрыть ветку 1
+1

Обязательно! Спасибо.

+1
Лучше представь проекты для которых нужен stm32. Я на эти камушки уже 4 года смотрю, но все свои проекты делаю на разных мегах и тиньках , их хватает и в бытовых и в промышленных девайсах, памяти для программы достаточно, перефирии тоже хватает.
раскрыть ветку 18
0
"Если вы не любите кошек, значит вы их не умеете готовить." :-)
Знаю и AVR и STM32.
AVR почти не применяю, если есть возможность уложиться по цене с STM32, т.к. последние просто удобнее в отладке для разработчика.
раскрыть ветку 17
0
STM32, т.к. последние просто удобнее в отладке для разработчика.
Раскройте тему, пожалуйста.

У меня вся отладка (Arduino*) происходит через Serial.print(). Возможно, в 2017 этот способ назовут первобытным, но он полностью решает мои задачи. Плюс (даже на боевых версиях систем) я по максимуму обматываюсь различными индикаторами, по которым можно в реальном времени наблюдать все статусы системы.

Какие возможности для отладки даёт STM32 и программное обеспечение?

раскрыть ветку 5
0
То есть ты чисто программист? Тебе потом не приходится изготавливать платы и паять всю эту мелкоту?
раскрыть ветку 10
+1

удивило, что выбраны Windows 10 и Linux - не самые популярные вещи у электронщиков-разработчиков, не самые...
я понимаю, что сейчас набегут "красноглазики" и предложат на ходу перебрать ядро, но это как-то слишком!

раскрыть ветку 5
0
Я выбрал Windows 10, чтобы инструкция была как можно актуальнее. Но сам, если Винда, работаю под 7-й. В любом случае, что делать ещё, макось? Ну у меня нет средств для этого. А Линь для разработки самое оно. Ну я про embedded, мобильные приложения и веб
раскрыть ветку 3
+1

ну и у меня win7. Пока хватает выше крыши.
Для Win7 подойдёт описание?

Хотя, блин, зачем мне stm32? И 8-битной avr выше крыши для моих задач автоматизации...
уже года 2-3 лежат отладки под stm32, включил, помигал, выдал и uart и забыл про них ))

раскрыть ветку 2
-1
Keil-а под линух нет. А он очень хорош и удобен.
+1

Что это? Чем лучше ардуино?

раскрыть ветку 19
0
Много лучше в плане возможностей, отладки, скорости. Много хуже в плане лёгкости изучения. Её там нет.  Читать 1800 страничный мануал придётся. И на каждую серию свой.
0

Дополню пост выше:


после выхода https://www.segger.com/products/development-tools/embedded-s... (на мой взгляд неплохая) снялась проблема уебищных IDE для STM. Нет писали и раньше и неплохо, но после Студии это все как блокнот. Сам сейчас хочу попробовать 32 т.к. это хоби, а для домашнего применения 32 бита редко нужно, но вот потребление у них всегда вкусным было. да и всякие штуки MQTT интереснее на 32 битах юзать.

раскрыть ветку 2
0
Не сравнивали с keil ?
раскрыть ветку 1
0
Всем.

Просто как факт. STM32F103 (она же "голубая пилюля") сравнима с 2560 (aka Arduino Mega). Единственное, в чём выигрывает мега - 256к против 64/128к флеша, и пинов "в доступе" у 2560 больше. Всё остальное лучше у STM32... А человеческая отладка (не заколёбывает постоянно в консольку писать)? А производительность?

P.S. 120р vs 600р ... 5 плат или 1.... Непреодолимо сложный выбор. Особенно, если учесть, что можно и старшие модели stm подтянуть.. Типа 407/427 серии. Подшаманить в CubeMX, но больше ничего менять не нужно.

раскрыть ветку 14
0

Соглашусь со всем, кроме того, что на STM32F1xx вообще не стоит ориентироваться. Серия умирает, на её замену идёт STM32F3xx, она очень крутая. F103 вообще чип так себе в плане периферии, хотя и на порядок лучше Атмег. Во всей серии, например, просто куча ОЗУ и она невероятно дешёвая.

раскрыть ветку 13
0

Ну по сути норм гайд, только вот в новой версии интерфейс другой и немного было сложнее, вот код генерируется уже 30 минут и я начинаю скучать по ардуинкам

раскрыть ветку 3
0
Не очень понял, о чём конкретно сейчас речь.
раскрыть ветку 2
0

О твоем гайде? О том что больно переходить с ардуино на стм? И о том, что хз какой баг встретил, но генерация кода у меня зависает через раз

раскрыть ветку 1
0
Купил плату stm8s так и ненашел путных книг для нубов(
раскрыть ветку 3
0

По-сути та же Атмега, только вид сбоку.

раскрыть ветку 2
0
Можешь порекомендовать бумажную книгу по stm32?
раскрыть ветку 1
0

автор, подскажи пожалуйста, с чего лучше начинать знакомство с микроконтроллерами? с ардуинки или с stm? тема очень интересная, но раньше не программировал, а хотелось бы научиться. сделать что то интересное хочется (ничего супер сложного, но и не банально диод-кнопка).

спасибо за ответ

раскрыть ветку 5
+1

Если вы вообще не знакомы с программированием в принципе, то Ардуина, что ж лукавить то. Там всё работает "из коробки".

0

Для STM32 есть такая штука, как MBED https://os.mbed.com/docs/v5.6/tutorials/index.html. Для STM32 это платки Nucleo https://os.mbed.com/platforms/?mbed-enabled=15&tvend=10


эти же платы совместимы с Arduino, точнее с проектом STM32Duino, но среда разработки та же и принципы те же.

раскрыть ветку 1
0

cпасибо, посмотрю)

0
с чего лучше начинать знакомство с микроконтроллерами? с ардуинки или с stm?
Arduino. И, похоже, без вариантов.


1. Покупаете "Arduino Uno Kit". Вот самый простой пример:

https://www.aliexpress.com/item/Arduino-uno-r3-starter-kit-1...


* преимущество Uno для "настольного" изучения - можно покупать готовые "шилды" (платы расширения), которые просто втыкаются в разъёмы Uno.


2. Подключаете его к компьютеру (один раз нужно установить драйвер CH340, необходимый для китайских клонов), ставите родной софт "Arduino IDE".


3. Смотрите, что в разделе "примеры". Классика - это мигание светодиодом (Примеры / Основы / Мигание). Видите, что для осуществления базового действия "подать напряжение на вывод 13 (к которому в "стандартных системах Arduino" подключён светодиод), нужна всего одна интуитивно понятная команда:

digitalWrite( 13, HIGH ) // подать "высокое" (5 вольт) напряжение на выход 13


Первый шаг - это осознание "я пишу понятную мне команду на включение светодиода, загружаю программу в контроллер (простой кнопкой Загрузить, больше ничего делать не надо) и вижу своими глазами, как загорается (или гаснет) светодиод по моей команде".

раскрыть ветку 1
0

спасибо за развернутый ответ

дома уже валяются уно и нано, куча проводов,экранчик, модуль сд карты, электронный замок с ключом и датчиком и куча всякого с работы позаимствованного) благо у нас этого добра навалом

0

На сколько я знаю, этот же stm32 используется в полетных контроллерах для квадрокоптеров.

0
Автор, спрошу у Вас, как у человека, варящегося в теме с mcu. Я много работал с fpga и так уж получилось, что mcu не удалось пока что изучить. Я решил задаться вопросом, в чем же явное преимущество mcu перед плис, кроме вшитой flash и аналоговых блоков? Если посудить, то новые плис уже выпускаются с flash, аналоговые блоки можно навешать со стороны. Есть ли такие проекты, где плис уступали бы по скорости обработки информации mcu? И в чем преимущество (явное) mcu над плис, кроме стоимости?
раскрыть ветку 1
0

Это очень сложная тема. Сравнивать с ПЛИС очень трудно. Это как сравнивать самолёт и ракету. Они абсолютно разные. Я сам всё пытаюсь как-то к ним подобраться, но страшно, как ардуинщикам начинающим к STM32. Мне вот вам даже завидно =)

0
Пикабу уже Хабрахабр?
раскрыть ветку 1
+3

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

0

Про кейл надо однозначно, ибо дебаггер реально крутой, все что хочешь на ходу и сразу видно реакцию платы.

0

Я боюсь спросить ересь, но сам программирую атмегу, искал вакансии и нужны программисты на STM32, спросил в чем они программируют, сказали AVR, но авр студио не для STM, может я не правильно понял людей или они не то сказали?

раскрыть ветку 2
+1
Скорее всего что-то не верно расслышали. Возможно имелся в виду IAR - популярный на наших предприятиях.
раскрыть ветку 1
0

Спасибо.

0

В полку сохраненных постов прибыло. Будете за ардуино, о котором недавно писал AlexGyver.
Кто следующий? Я буду устанавливать сохранять все игры статьи

Иллюстрация к комментарию
0

Опа, хорошая тема, сейчас сам учу. Автор, надеюсь вы не остановитесь на двух-трёх статьях.

Будете ли в будущем упоминать работу с I2C и сенсорами типа mpü 6050?

Спасибо за труды.

раскрыть ветку 8
0
А зачем? I2C реализована аппаратно и по всякому. Сенсор... берите его протокол и пишите библиотечку, ну или функцию, под себя.
раскрыть ветку 7
+1

Совет из разряда - как нарисовать сову)

раскрыть ветку 6
-1

Я извиняюсь, это че хоть такое то?

раскрыть ветку 1
+1

Это микроконтроллеры =)

-1

Во, не зря подписался. Как, кстати, моя схема в целом? Я всё жду отмашку чтобы плату разводить :)


#comment_101010819

раскрыть ветку 3
-1
Завтра отпишусь днём 😀
раскрыть ветку 2
0

Ну что?

раскрыть ветку 1
Похожие посты
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: