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. Реклама.

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

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

А причём тут это? Я делаю полный цикл, от ТЗ вплоть до пайки паяльником, но также применяю STM32. Я бы применял и NXP, например, у них есть очень крутые чипы на ARM, но вход туда уж очень дорогой.

раскрыть ветку (9)
Автор поста оценил этот комментарий
Для меня изготовление и пайка чипов с шагом ног 0,5 - чистое мучение, шаг меньше 0,8 очень некомфортен.
Ладно, иногда можно с Китая платку с запаяным чипом заказать, но что на нём изготавливать? Зачем флеш больше 32кб? Если только с большими цветными дисплеями использовать? Но это уже совсем другой уровень, не микроконтроллеров, а одноплатников.
раскрыть ветку (8)
Автор поста оценил этот комментарий

Почему? Мне проще запаять LQFP100 чем TQFP-32. Нанёс побольше флюса, взял тонкое жало аля T12-BC2, т.е. скошенное на 45% и с небольшой впадинкой. На него совсем чуть припоя и просто проводите по ножкам слегка их касаясь. Одним движением всё. Конечно же, если спозиционировали до этого и укрепили в паре точек сам чип. С TQFP сложнее просто потому, что припоя надо больше, потому жало больше и остаются спайки иногда.


Вот приедет штатив ко мне, я сниму видос про пайку таких чипов и как потом отмыть простой салфеткой =)

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

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

раскрыть ветку (3)
1
Автор поста оценил этот комментарий
Обычно на STM32 ставят RTOS. Это огромное удобство и ускорение разработки.
Не забывайте, что разработчикам и программистам необходимо платить зарплату и RTOS минимизирует расходы.
раскрыть ветку (2)
Автор поста оценил этот комментарий

Я бы сказал, ЗНАЧИТЕЛЬНОЕ ускорение. Но надо понимать, как он работает. Не забывать про делёж ресурсов, использовать очереди, счётчики и избегать бинарных семафоров по-возможности. В принципе, это как пересесть с PHP на Javascript =)

раскрыть ветку (1)
Автор поста оценил этот комментарий
Что то у Вас пунктик насчет бинарных семафоров :-)
Я их использую во всех своих проектах и ничего страшного. Все пучком.
В основном пишу под ChibiOS.
Автор поста оценил этот комментарий
BCM-2 ака микроволна паяет их ещё лучше)
А, чертеж именно его) bc-2 скос без выемки) а так да, тип жала замечательный
раскрыть ветку (1)
Автор поста оценил этот комментарий

Самый удобный, почти всё такими паяю.

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

" Нанёс побольше флюса"  о каком флюсе идёт речь? марочку озвучь

Автор поста оценил этот комментарий
STM32, т.к. последние просто удобнее в отладке для разработчика.
Раскройте тему, пожалуйста.

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

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

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

В статьях про создание среды заработки я чуть-чуть показал, как устроена отладка. Грубо говоря, вы вообще не используете Serial.print() или printf(). В процессе отладки вы имеете доступ ко всей периферии, ко всем регистрам. Видите значения переменных и т.д. Можете ставить breakpoint - когда программа дойдет до этого места, будет остановлена и вы увидите её "слепок" на этот момент. Ну и т.д. Это действительно материал огромный, тема неисчерпаемая. Но раз попробовав так отлаживать программы, к банальному Seial.print() не вернёшься никогда.

раскрыть ветку (2)
Автор поста оценил этот комментарий
> доступ ко всей периферии, ко всем регистрам


Звучит шикарно :) А как это технически реализовано? В контроллер встроена возможность такой отладки и он наружу выставляет интерфейс, через который компьютер может на таком низком уровне им управлять? 4 пина на боку платы F103C8T6 - это оно?


Обязательно ли иметь железку типа ST-Link? Или это может работать через usb-хвост, которым подцепляются платы типа F103C8T6?


Про ST-Link отдельный вопрос - это вообще что, если не стандартный USB-Serial/TTL конвертер? И если это такая реально нужная штука (как пишут) и нужно его купить, то в чём разница между оригинальными яйцевидными устройствами ($10) с каким-то здоровенным шлейф-кабелем и донглами ($2) без большого шлейфа?


P.S. Breakpoints - это отлично, а Conditional Breakpoints оно умеет?

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

Да, вроде того. Есть разные протоколы. ARM сам по себе имеет JTAG, у ST фирменный SWD. ST-Link умеет оба. В принципе, донгл меньше и умеет SWD+Trace. С пузырьком можно ещё и JTAG полноценный. Грубо говоря, SWD - это JTAG поверх одной линии Serial.


На практике, китайские работают на меньшей частоте, чем могли бы. Формально 4МГц, на деле 1МГц. Фирменные ST-Link работают стабильно на 4МГц, лучше трассировка, легче дабаг - нет тормозов. Я поэтому люблю Keil Ulink, даже с китайским дебаг одно удовольствие, он работает на 10Мгц.


Плюс под пузырёк нужен либо переходник, либо плата отладочная сразу с IDC-разъемом отладочным.


И да, Conditional Breakpoints умеет. Это прерогатива отладчика, если ничего не путаю.

1
Автор поста оценил этот комментарий
Камрад Булкин ниже все обьяснил, а я скажу по простому.
Пересесть с AVR на STM32 - это как пересесть с автомобиля у которого вместо лобового стекла маленькая амбразура и колеса без резины на нормальный современный автомобиль :-)
Автор поста оценил этот комментарий

Вам верно ответили, после нормальной отладки, с доступом к всему и вся. К "принту" возврата нет.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку