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% уникальный.

Сообщество Ремонтёров

7.3K постов42.1K подписчиков

Добавить пост

Правила сообщества

ЕСЛИ НЕ ХОТИТЕ, ЧТОБЫ ВАС ЗАМИНУСИЛИ НЕ ПУБЛИКУЙТЕ В ЭТОМ СООБЩЕСТВЕ ПРОСЬБЫ О ПОМОЩИ В РЕМОНТЕ, ДЛЯ ЭТОГО ЕСТЬ ВТОРОЕ СООБЩЕСТВО:


Посты с просьбами о помощи в ремонте создаются в дочернем сообществе: https://pikabu.ru/community/HelpRemont

К публикации допускаются только тематические статьи с тегом "Ремонт техники".

В сообществе строго запрещено и карается баном всего две вещи:

1. Оскорбления.

2. Реклама.

В остальном действуют базовые правила Пикабу.

Вы смотрите срез комментариев. Показать все
4
Автор поста оценил этот комментарий

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

раскрыть ветку (19)
2
Автор поста оценил этот комментарий
Всем.

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

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

раскрыть ветку (14)
Автор поста оценил этот комментарий

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

раскрыть ветку (13)
1
Автор поста оценил этот комментарий
А уж если сразу на F4xxx начинать..... то там всего завались.


Пост хорош но перегружен. И если честно слабо представляю как можно объяснить работу СТМ не залезая в дебри. Слишком уж железка навороченная по архитектуре, и плюшкам.

раскрыть ветку (6)
1
Автор поста оценил этот комментарий
4XX имхо, слишком уж для начинающего сложен ))) там с кубом то иной раз в прострацию и даташиты попадаешь надолго.
раскрыть ветку (3)
Автор поста оценил этот комментарий
Ну не знаю, по сути тоже самое, только всяких плюшек.... сразу и завалом.


С кубом разницы фактически нет.

раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Если в проекте более, чем 1 кнопка и светодиод:

Cчитаешь и прикидываешь, i2c/spi/usart2 - что нужнее и удобнее на данном пине )) вроде подходит, ищешь вторичные, назначил... Так что у нас там дальше. ещё i2c/spi - так ... блжад, ошибся, оказывается нужно было на предыдущем шаге назначать другие пины....

Повторять до наступления просветления.

Потом разводка платы. Высока вероятность жевать мочало и начинать сначала...

Потом, внезапно зимой выпадает снег всплывают erratы всякие ))

P.S. Конечно, с опытом приходит понимание, и в кубе почти и не гостишь; но если ты без опыта, или 1-2-3е устройство, то обилие "всего и сразу" так крепко крышу сносит... Вероятность "продраться" есть, но, имхо, лучше начать с более простого.

dixi ))

раскрыть ветку (1)
Автор поста оценил этот комментарий
Тем куб и хорош, что визуально можно крутить периферию как хочешь. И ошибки отображает, если что. Значительно ускоряет процесс.
Автор поста оценил этот комментарий

Ну так это и есть вводный. Так сказать, направление, откуда подступиться. Чтобы можно было уже отдельно углубляться в какие-то вещи.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Вот даже вводный перегружен. Блин, не представляю как.... Без понимания структуры....


В общем ... Удачи вам. Буду наблюдать.

Автор поста оценил этот комментарий

Периферия у STM32F3XX очень годная. Разрабатываю сейчас очередную плату с 8 STM32F303 под управлением одной STM32F407. Могу с уверенностью сказать что среди микроконтроллеров сейчас конкуренции STM32 вообще нет. Был вариант сделать все на MAX10 от Альтеры (или уже нужно говорить интел) (делали даже готовое устройство, но отказались) + STM32F407 но STM молодцы реально очень качественный продукт создали. Я уже не говорю про новые F7 и H7 модели. 

Автор поста оценил этот комментарий
Согласен со всем..., но для "мелких" задач цена пока превалирует (для home hobby маузер как-то слегка избыточен ))

Вон плату дачеча делал, опрос датчиков (всего их 14, в основном для ИНС) прекрасно поместилось в 103... его хватает и на опрос, и на математику с матрицами, и 25 раз в секунду координаты основному камню отправлять)))

раскрыть ветку (4)
Автор поста оценил этот комментарий

Но вот нет у него FPU, а у 3хх есть. Мне вот как раз надо много считать с float и double, для меня панацея. Ну и есть проекты, где по штук 8 таймеров использую.

раскрыть ветку (3)
Автор поста оценил этот комментарий
F303 хорош но он пока что прилично дороже F103, которого большинству хватает
раскрыть ветку (1)
Автор поста оценил этот комментарий
Полностью согласен с вами. Но когда себестоимость всего устройства 5к, лишние 150 рублей роли не играют. Я потому и пишу про 103ю, она доступна абсолютно всем.
Автор поста оценил этот комментарий
2 слова. fixed point - и не нужен  fpu ))

Но, нужно ну очень хорошо просчитать, можно ли её использовать.. А то будет как в анекдоте про синус и военное время.

DELETED
Автор поста оценил этот комментарий

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


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

раскрыть ветку (2)
Автор поста оценил этот комментарий
Не сравнивали с keil ?
раскрыть ветку (1)
DELETED
Автор поста оценил этот комментарий

Увы. нет.Кейл у меня не пошел

2
Автор поста оценил этот комментарий
Много лучше в плане возможностей, отладки, скорости. Много хуже в плане лёгкости изучения. Её там нет.  Читать 1800 страничный мануал придётся. И на каждую серию свой.
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку