Comments 65
Именно с этого микроконтроллера когда-то давно начинал знакомство с АРМами. Очень дешевая и удобная игрушка, можно найти значительно дешевле доллара за штуку.
Сейчас проще купить плату серии Nucleo со встроенным отладчиком и не заниматься извращениями с USB UART. А если хочется получить опыт работы с периферией без паяльника — Discovery или даже Eval.
Конечно проще, кто спорит. Но тут как-бы из говна и палок. Дешево и не жалко.
Купил Nucleo F401RE и F4-Discovery на аукционах по 10 долларов каждая, это не намного дороже, чем описанный в статье велосипед, зато примеры не нужно подгонять сразу и под другой камень, и под другую плату.

Это все весело и забавно когда хочется просто поморгать светодиодом, а вот когда нужно сделать свою плату с обвесом (например, контроллер заряда, fuel gauge, BLE, крутилки/нажималки и т.д.) и не за полгода, а за пару месяцев — намного проще срисовать референс-дизайн и начать писать прошивку еще до того, как первая версия платы с фабрики приедет…
Вы, конечно, правы. Вопрос же в цели. Если вы серьезно занимаетесь разработкой embedded, вам это все не нужно, но и статья эта вам ну вообще бесполезна. Если вы, как я, просто любите поиграться с микроконтроллерами (из всего, что я создал на МК за последние 10 лет, реально использую только переходник клавиатуры PS/2-XT), то разница огромна, за 10 долларов вы купите 10 чипов, или за 100. А 10 чипов нужно, так как что-то точно спалим, да и поиграться это не 1 проект, а, как правило, несколько. Ну, я свою ситуацию описываю. Хотя я использую свисток с STLink c отладкой.
я по большому счету тоже играюсь, а не зарабатываю этим, но люблю делать это с комфортом, да и из игр со светодиодом вырос давно
Играться волен каждый, как хочет, мне кажется. Главное, чтобы игратели в профессиональную разработку без соответствующего образования не лезли. Но, опять же, статья не о профессиональной разработке же.
Вы молодец, что довели работу до конца и написали хорошо иллюстрированную статью по ее итогам, но, на мой взгляд, есть два момента, которые нужно знать начинающим работать с STM32:

1. У STMicroelectronics есть линейка плат STM32 MCU Discovery Kits, которые содержат большое количество релевантной для каждого конкретного камня периферии и, что немаловажно, достаточно дешевы (ценник плат на пределе себестоимости).

2. Инициализировать периферию стоит при помощи STM32CubeMX (пример), и чем меньше разработчик ориентируется в STM32, тем больше у него поводов использовать STM32CubeMX.
Инициализировать периферию стоит при помощи STM32CubeMX (пример), и чем меньше разработчик ориентируется в STM32, тем больше у него поводов использовать STM32CubeMX

Как раз не стоит при обучении это делать.
Применять или нет STM32CubeMX — вопрос спорный, можно долго биться на эту тему. Но зачем использовать давно мертвый CooCoc CoIDE?
Есть пригодные для обучения демо-версии Kail и IAR, есть полностью халявный софт от STM.
То, что момент спорный — да, уже много комментариев было на эту тему. Зависит также от цели обучения. А вот про IDE я ничего не говорил. Для Cortex-M0 у Keil бесплатное использование, лучше использовать его.
CubeMX помогает, особенно когда что-то не работает, и непонятно почему — можно посмотреть как это делает CubeMX и добиться, чтобы свой код заработал. Но CubeMX громоздкий и неэффективный, особенно в применении к минималистичному контроллеру STM32F030f4p6 — CubeMX съест значительную часть памяти программ и данных. К тому же, сложность API CubeMX для многих из периферийных модулей не уступает сложности работы с регистрами напрямую. Поэтому если цель — понять как работает этот контроллер — лучше начинать не с CubeMX, а с работы с регистрами, по крайней мере применительно к GPIO.
Работа с регистрами не дает понять как работает контроллер, регистры это такая же абстракция как и функции, вы записываете какое-то число и получаете какой-то эффект, вот и все что вы понимаете.
В то же время нет никакого смысла тратить драгоценное время на решение одной задачи сложным образом вместо простого, поэтому использование CubeMX и библиотеки HAL предпочтительно.
Всё бы хорошо, но картину портит такой эффект который назвали дырявыми абстракциями. Почти все абстракции дырявы, используя какую-то очень абстрактную функцию можно просто попасть на одну или сразу несколько дырок и долго думать «почему так?».
Хороший пример можно взять с такой абстракции как файл. Обращаясь к файлу можно получить одну из сетевых ошибок, которые к файлу казалось бы ну никаким боком. Или ещё лучше — ошибку деления на ноль.
Регистры — это тоже абстракция, но эта абстракция хорошо документирована, намного лучше чем HAL, и в этой документации описано как работает контроллер. Работа с GPIO через регистры не сложнее работы с ними через HAL, и главное — если периферия, конфигурируемая через HAL, не работает как задумано — понять почему так происходит можно, анализируя содержимое регистров в отладчике — а значит эту абстракцию тоже придётся изучить, в дополнение к HAL. Но если говорить о более сложной периферии, такой как I2C, DMA, Advanced-control Timer или, тем более Ethernet — для начала работы с ней лучше использовать библиотеки, в том числе можно и HAL, хотя с регистровым интерфейсом этой периферии тоже нужно ознакомиться.
Может я чего-то недопонимаю, но зачем пушпульный выход куда-то подтягивать?
логика и интуиция подсказывают, что здесь должен быть push-pull и далее должен быть pull-up.
Если вместо документации пользоваться «логикой и интуицией», то еще и не такое можно нагородить.
Статья, конечно, хорошая, но почему все всегда «начинают»? Статей о быстром старте очень много, но хотелось бы видеть больше статей о каких-то особенностях и алгоритмах для микроконтроллеров, а не только инструкции по написанию мигалки светодиодом.

И да, ST-Link стоит не сильно дороже USB-COM, лучше уже сразу использовать его.
Ну, в данном случае автор сам в программе в абзац размером наляпал кучу ошибок, так что он действительно начинает.

А по теме вопроса — ну вот я, например, читал студентам лекции по работе с STM32 в RTOS, от мигания светодиодом до вполне осмысленных вещей (https://www.youtube.com/playlist?list=PLJEYfuHbcEIApuZR4L5tRiBCwTZCYeTNY), но перекладывать это в текст тупо нет времени, так как на одну лекцию плюс семинар надо минимум полдня работы.
Начинать тяжело. Нередко нет ответов на очевидные вопросы — для профессионалов они очевидны, а для начинающих не всегда очевидны. В процессе google'ения попадается сплошной copy->paste — приходится по крупицам собирать информацию, долго читать книги. Это я к тому, что изучение — долгий процесс.

Слушал ваши лекции на YouTube, прямо всасывал информацию, был очень рад слушать компетентного человека. К сожалению, нахожусь в другом городе (Томск), а ведь так хотел попасть на ваши практические занятия!
в отличие от них у bin файла можно выбрать адрес


Не «можно», а «нужно». В HEX адреса прописаны, а куда этот BIN заливать, программатор понятия не имеет.

Отмечу, что в электронике принято разбивать выводы микроконтроллера на порты


Не обязательно.

Чтобы убедиться, что МК действительно будет работать от этого источника, я пропишу это явно в программе


Вы дальше забыли это сделать — это в RCC_CFGR.

Чтобы записать в регистр CR блока RCC единицу для включения HSI, понадобится строка кода


После этого необходимо подождать флаг HSIRDY.

в 9-ом бите должен оказаться ноль, в 8-ом единица: GPIOA->MODER |= (1 << 8);


С девятым битом ваша инструкция ничего не делает, соответственно, в нём ничего не должно оказаться.

По умолчанию ножки МК не подключены, т.е. на выходе неопределённость


По умолчанию ножки STM32, в зависимости от серии, сконфигурированы как цифровой или аналоговый вход. С точки зрения светодиода, на выходе у них при этом вполне определённое Z-состояние.

и далее должен быть pull-up


Pull-up не нужен.

Есть реальный риск сжечь, если выбрать тип open-drain и закоротить этот вывод с другим устройством


Реальный риск сжечь выход push-pull выше ровно вдвое.

Есть один момент: если включена оптимизация компилятора, то компилятор вырежет наш холостой цикл, и задержки не будет


Объявите переменную как volatile.

Радует, что опираясь на документацию, получилось написать рабочий код


Вообще нет, в общем случае он нерабочий — тактирование не настроено, MODER записывается некорректно. Работает только потому, что конкретно эта серия контроллеров действительно запускается на HSI, а в MODER по умолчанию 00.
CooCox с вероятностью 99.9% запустит «свои» стартап скрипты типа system_stm32f0xx.c и startup_stm32f030.s и все настроит верно
Риска сжечь МК через push-pull — никакого. Читаем даташит. Сопротивление перехода транзистора даёт ограничение тока в 20 мА. Единственное ограничение — количество одновременно используемых ног в этом режиме. Опять таки см. даташит на максимальный ток, который можно «зарядить» в МК. Что-то около 80-100 мА (точно не помню, даташит листать — лень). Т.е. имеем максимум 3-4 ноги в этом режиме. При перегрузке МК просто перестаёт устойчиво работать…
Потрясают такие знатоки — если в дата написано, что выходное напряжение нуля НЕ БУДЕТ ВЫШЕ 1,3 В при токе через 5 ножек по 20 мА, и больше ничего не написано, откуда Вы берете глубокомысленные выводы об сопротивлении перехода, которое ограничивает ток.

Олег абсолютно прав — если открытый коллектор можно сжечь только когда на выходе 0, то двухтактный выход можно сжечь и при 1 тоже.
В STM32 такого ограничения нет, вы неправильно читаете даташит.

В даташите сказано лишь «при токе 20 мА напряжение логической 1 на выходе будет не менее чем Vdd — 1,3 В». Из этого никак не следует, что ток и напряжение не могут быть выше (в реальности при питании 3,3 В и комнатной температуре ток короткого замыкания там получается миллиампер сорок).

Вообще если в даташите нигде в характеристиках GPIO нет в явном виде строки типа «short circuit current limit», то никаких оснований считать, что GPIO обязан пережить коротыш, нет.
Олег, может быть, у Вас и у меня неправильные дата, а настоящие доступны только избранным, или мы их просто читать не умеем, надо между строк заглядывать?
Проведем небольшой эксперимент (можете повторить, если конечно умеете пользоваться амперметром/вольтметром...).
«Камень» STM32F303CBT6, режим PP на любую ногу.

Устанавливаем в «1», измеряем напряжение без нагрузки: 3.3V
«Коротим» на «0» амперметром. Наблюдаем ток 0.045 А.

Устанавливаем в «0»
«Коротим» на «1» (3.3V) амперметром. Наблюдаем ток 0.045 А.

Итого: R внутренних транзисторов = примерно 80 Ohm, P отдаваемая в режиме «КЗ» = 0.1 Вт

Учитавая, что МК может по цепям питания обеспечить себя только на 120-140 мА, можно в таком режиме использовать максимум 3 ноги. Тепловая отдача должна быть не менее 0.3 Вт.

Вопрос к «знатокам»: можно ли такими режимами вывести МК из строя?!
Проведем небольшой эксперимент (этот эксперимент проводился неоднократно различными людьми, в том числе и лично мной, впервые в возрасте 5 лет) — берем конкретного человека и позволяем ему схватится за цоколь разбитой лампочки с подключенной сетью. Конечно, тряхнет, но не убивает.
Вопрос к «знатокам» — может ли убить другого конкретного человека при соприкосновении с сетью 220 В?

Это был сарказм, а теперь по делу — единственное, на что можно ориентироваться при разработке устройства — это данные в технической документации, причем именно те, что в ней написаны явно, а не те, которые Вы пытаетесь додумать за авторов. Все остальное, в том числе измерения конкретного образца — это «от лукавого».

Типичный пример — постоянно возникающий на форумах вопрос — «зачем ставить ограничивающий резистор в цепи светодиода, ведь у меня и так ничего не перегорает» — обусловлен именно непониманием (а иногда, как в Вашем случае, нежеланием понимать) простой истины, изложенной в предыдущем абзаце.
То есть Вы по прежнему считаете, что фраза «но ведь работает же» является достаточным основанием?
А если 3,6 В? А если температура +60 °С? А если новая ревизия ядра, в которой техпроцесс немного поменяли?

То, что вы запроектными нагрузками не вывели из строя один конкретный контроллер в один конкретный момент — не значит ничего, кроме того, что этот конкретный контроллер конкретно сейчас не умер.
Может быть я вас расстрою, но…
Общаясь с инженерами STM (проектировщики чипов) получил информацию, что мосфеты применяемые в МК проектируются как высокоомные с рапряжением 30V. Выход из строя обусловлен именно перегревом. Т.е. буквально сгорают. Хотя и имеется тепловая защита чипа (которая кстати и будет работать после сгорания транзистора). При подаче на ногу например 24V транзистор успевает нагреться до запредельных температур быстрее, чем весь чип и выходит из строя. Повышенное поребление тока вызывает сильный перегрев МК, после чего срабатывает тепловая защита. Какое-то небольшое время МК успевает таки поработать.

Этот вопрос обсуждался после того, когда я случайно уронил провод с 24V на ногу с GPIO режимом.

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

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

Вам в связи с чем так трудно осознать тезис «всё, что не написано в даташите — не гарантируется»?

У вас в даташите какая-либо «тепловая защита» упоминается на какой конкретно странице? Ах, она там не упоминается вообще? Ну тогда я уверен, что в случае чего понесённый вами материальный ущерб вам те инженеры лично возместят.
«Мыши плакали, кололись, но продолжали жрать кактус».
Как я и предполагал ранее, существуют секретные дата, в которых описаны узлы МК, слегка нарушающие законы электротехники, и именно эти секретные документы, ну или частные беседы с проектировщиками чипов (интересно, на каком языке они проводились) и служат основанием для выводов, противоречащих распространенным инженерным практикам.

Мне лично казалось совершенно естественным, что при подаче на ножку чипа напряжения, превосходящего допустимое (особенно в 4+ раза превосходящее), микросхема выйдет из строя, и данный факт не требует каких-либо объяснений или оправданий от проектировщиков кристалла.
МОжно и он в конце-концов выйдет из строя. И если не через пару секунд, а через минуты-часы-дни… То что оно работает в таком режиме надо рассматривать как исключительное чудо а не как руководство к применению.
Я когда-то давно из чистого интереса попробовал светодиод зелёненкий АЛ-307 на прочность. Он вобщем-то рассчитан максимум на 10мА… ну я начал на него подавать ток всё больше и больше, на 100мА он проработал секунд 5 постепенно меняя цвет до оранжевого, после чего издох. Но работал же!
Так и тут — порт МОЖЕТ в принципе работать на токе больше 20мА, но его долгая работа НЕ ГАРАНТИРОВАНА и он может выйти из строя в любой момент! Причем такая перегрузка даже кратковременная постепенно подтачивает его сильно сокращая стандартный срок службы. В итоге схема вместо рассчетных 10000 часов отрабатывает 1000 и дохнет, а вы сокрушаетесь о низком качестве комплектующих.
Мне кажется, что все же не стоит начинать изучение микроконтроллеров с записи прошивки через USB-UART, учитывая, что полноценный отладчик ST-LINK стоит не намного дороже.
Используя USB-UART вы упускаете хорошую возможность в действительности изучить работу микроконтроллера и, в случае чего, найти закравшуюся ошибку в коде.
Несколько странный способ втянуть новичков.
Лучший вариант (именно для старта новичков) было бы использовать:
1) CubeMX для инициализации периферии
2) TrueSTUDIO — Atollic — ST в качестве IDE — потому что бесплатно и от самой ST
3) ST-LINK для прошивки и отладки
4) Дать три варианта кода: на HAL, на LL и на регистрах, чтобы человек сам решал что ему важнее: скорость работы кода или скорость разработки кода
С таким инструментарием новичкам было бы в разы проще
Хоть блин сам садись и пиши статью обо всем этом
Пишите, пожалуйста. Про TrueSTUDIO вот только что из вошего сообщения узнал. До сих пор использовал Keil в бесплатной ограниченной версии. Спасибо!
Спасибо. Я в настоящее время так и работаю с СТМками, но такие статьи очень полезны. В свое время такая статья помогла бы мне очень много времени сэкономить.
TrueSTUDIO требует довольно мощного компьютера (как и все, что выросло из Эклипса)…
Отсутствие отладчика это выстрел себе в ногу.
ST-Link V2 в китае стоит всего 200 рублей

Если планируете заниматься ARM микроконтроллерами, лучше сразу купить J-Link. ST-Link умеет только микроконтроллеры ST, но есть ещё масса других производителей, а J-Link умеет практически все Cortex-M, кроме того возможности отладки у него шире (RTT, например).

BrInE38
Сборка проекта в слепом варианте напоминает отладку связки мк с внешним навороченным чипом, у которого собственных управляющих регистров под тысячу штук. Уникальные ощущения сборки трёхпалубного брига в бутылке из чёрного стекла.
Вам всё-же придётся заниматься подобными вещами, потому как это просто следующая ступень для работы с мк. Вот тогда вам пригодится подобный стиль и последовательность — как в вашей статье. Но не раньше.
Написано сумбурно, всё в кучу. Решения применены спорные. Виртуальная машина — зачем??
Для новичков уж лет 10-15 есть десяток сайтов на которых всё разжёвано, начиная от архитектуры мк, и заканчивая кубом, с программированнием в любых ИДЕ, под любыми ОС. Это ваше графоманство в свете этого воспринимается просто никак.
Насчет конфигурации выхода. Сам выход электрически представлен из двух ключей, которые могут вывод контроллера подключать к "+" шине и к "-" шине питания контроллера. Так вот Push-Pull режим это когда работают оба ключа и на выходе никогда никакой неопределённости нет — по русски это звучит тяни-толкай. Т.е. вывод может как тянуть(брать ток извне и сливать его в "-" шину притягивая вывод к нулю) так и толкать(выдавать ток в нагрузку с "+" шины).
Open-Drain означает что контроллер может управлять только нижним ключом и он замыкается только когда на порту лог.0 в ином случае(лог.1) ни один ключ не замкнут и порт висит в воздухе. Но и здесь есть ньюансы — поскольку вывод контроллера защищён защитными диодами напряжение на выводе НЕ МОЖЕТ превышать напряжение питания контроллера — иначе откроется диод и начнёт сливать ток на шину питания. Но есть выводы БЕЗ ЗАЩИТЫ — напряжение на них МОЖЕТ превышать напряжение питания контроллера но тоже имеет свой предел — где 5 вольт, где 30 вольт… надо уточнять в документации. Но чаще всего это защищённый вывод и напряжение на нём физически не может превышать рамки напряжения питания контроллера(абсолютный максимум +0.3В за эти рамки, при этом через диоды течёт ток!) без физического разрушения самого контроллера. Стоит так же учесть что диоды эти слабые и подвержены тиристорному защелкиванию — при токе через них больше 2мА высока вероятность что он сработает как тиристорная структура и замкнёт шину питания контроллера, а если источник питания достаточно мощный — он может физически разрушить часть кристалла. А если слабый — тиристор этот будет держать пока будет протекать ток — т.е. пока не снимешь питание с контроллера. Иногда эти «тиристоры» достаточно слабые и даже не просаживают общую шину питания но приводят к повышенному нагреву кристалла и временной дисфункции всего порта. Но доводить до этого не стоит.
Так вот Pull-UP это специальный резистор-подтяжка для того чтобы вывод контроллера не болтался в воздухе находясь в режиме входа, Hi-Z или Open-Drain. Технологически это не резистор а полевой транзистор работающий в режиме источника тока. Поэтому сказать что он имеет определённое сопротивление фактически нельзя. Удобно использовать для кнопок. И ток небольшой и внешний резистор не нужен.
Но чаще всего это защищённый вывод и напряжение на нём физически не может превышать рамки напряжения питания контроллера


Нет, как раз у STM32 практически все ноги, кроме входов АЦП, к 5 В толерантны. См. в даташите табличку с перечислением ножек, там у каждой стоит короткая аббревиатура — так вот, FT это толерантные к 5 В.
Вопрос к автору: А почему именно эта отладочная плата выбрана для начала экспериментов?
Смотрю на наличие MicroUSB разъёма… Он чисто для эстетического удовольствия?
Есть подозрение, что для начала разумнее было бы взять так называемую «голубую таблетку»
И ресурсов поболее, и частота повыше, да и USB «на борту» имеется…
Цена выше рублей на 20-30. (смотрел на али)

PS. Из «голубой таблетки» легко делается аналог китайского варианта ST-Link V2: ST-Link V2 из «голубой таблетки»
  1. Именно эта отладочная плата выбрана по совету одного человека, который неожиданно появился в офисе, где я подрабатываю, и смотивировал меня изучать МК. Т.е. нет явных причин, так получилось. :)
  2. MicroUSB-разъём есть, судя по схеме платы, пользоваться им можно. Как пользоваться? — пока не знаю.
  3. О «голубой» и «зелёной» «таблетках» я слышу впервые — заинтересовали.
«Голубая Таблетка» — самая массовая отзнакомительная плата с STM32F103C8T6 «на борту». Да и похоже, что самая массовая вообще (благодаря китайским товарищам).
Про коКоос. Он по сути уже мёртв. Никто не захотел «подхватить проект». Но есть «замена» — EmBitz. Основан на Em::Blocks. Компилятор из GNU Toolchain сразу в соcтаве IDE. Проекты кокоса открывает без проблем. По умолчанию использует SPL.
И EmBitz по сути уже мертв, автор внезапно осознал, что хочет кушать, а внятную модель монетизации придумать не смог, платные подписки на новые версии как то не взлетели…
Автор, советую заместо кокоса попробовать atolic true studio. Это тот же эклипс и уже бесплатный. Пока нет только мастера проектов. Во всем остальном по сравнению с кокосом только плюсы.
Особенно для МК 03х… Хало-Куб с ходу сожрет половину ПЗУ только для моргания диодом…
(выражаюсь фигурально)
Если использовать LL, то всё равно нужно будет детально знакомиться с описанием регистров и писать по сути на CMSIS.
И… возможно сюда заглядывают любители сделать «девайс» своими руками…
Проект «Зеленая Таблетка», слегка доработанный аналог «голубой таблетки». Краткое описание, проект, гербер файлы для заказа плат. Можно впаять МК STM32F100C8T6, STM32F103C8T6, STM32F103CBT6, STM32F303CBT6, и много других, совместимых по «ногам».
Вместо возни с флагами оптимизации, проще просто переменную t объявить volatile, тогда будет работать при любых флагах, так как это прямое указание компилятору, что переменную нельзя оптимизировать.
STM стал хорош только тогда, когда Cube перестал косячить. Настроить врукопашную тот же DMA +АЦП в трайлпмоде по ддокументации, примером от чужих плат и советам советчиков, чтоб он завелся без куба — это очень дурная работа даже на CMSIS, не говоря о регистрах. А чтобы еще и правильно работал, не путая размеры буферов в словах, типах данных или байтах — еще половина от этого.
А при изучении важнее, в общем и целом, объяснять чем пушпул отличается от опендрейн, а не технологии прошивки прошивальщиком. IMHO
PS. Лично наблюдал пример творчества на STM32, когда люди на плюсах написали свои библитеки дрыганья регистрами… Естественно, жестко привязав к отладочной плате. В результате, потом это всё пришлось переделать…
Насчет скорости — правило Парето в помощь. 80% времени жрут 20% кода.
На самом деле очистка — это процесс записи нулей в память.

Стертая FLASH память представляет собой все единицы в битовом представлении. Это никак не запись нулей.
Вообще это не везде и не всегда так. Иногда ячейки представляют собой инверсную логику — есть заряд => ноль на выходе или наоборот. В зависимости от технологических особенностей чипа, чтобы лишний инвертор не ставить на котором идет хоть маленькая но задержка.
Привыкли, конечно, что массово делают память с «1» в качестве очищенной ячейки, но это не всегда так.
у STM32L1xx серии вроде нули при стирании (ох и доставили же они мне проблем при портировании на них загрузчика и адаптации моих утилит прошивки и отладки стм32. Итог для себя — не забивать в констант даже такие тривиальные вещи как значение стёртой флешь памяти, сам дурак оказался, явно не ST которая наверное просто рассчитала что такая именно память будет меньше потреблять)
Only those users with full accounts are able to leave comments. Log in, please.