Небольшое вступление
Однажды, заехав в очередную съемную квартиру, я столкнулся с определенным неудобством, которое достаточно сильно напрягало: выключатель света в основной комнате оказался за шкафом-стенкой, который был прикручен к стене, и его перестановка была невозможна т.к. на это требовалось значительно много времени и сил. Решить данную проблему хотелось очень сильно и в голову пришла одна мысль: сделать дистанционный пульт для управления освещением!
Именно с идеи создания собственного пультика для управления светом в комнате и началось моё увлечение электроникой, микроконтроллерами и различными радиоустройствами.
После этого я начал изучать данную тему, знакомиться с основами электроники, примерами устройств, узнавать, как люди реализуют подобного рода устройства. Поискав информацию на тему того, с чего можно было бы начать изучение микроконтроллеров я узнал о том, что такое Arduino, с чем их едят, о том, как с ними работать. Легкое решение выглядело весьма привлекательно, ведь насколько я понял на тот момент, код собирается на раз-два. Но сделав вывод, что я не узнаю, что творится внутри микроконтроллера за рамками Arduino-скетчей я решил поискать более интересный вариант, который подразумевал глубокое изучение и погружение в дебри микроконтроллерной техники.
В компании, в которой я работаю, имеется отдел разработки, и я решил обратиться к инженерам чтобы они направили меня на путь истинный и показали с чего можно было бы начать решение своей задачи. Меня решительно отговорили от изучения Arduino и у меня в руках оказалась неведомая и непонятная зеленая платка на которой виднелись надписи, буковки, разные электронные компоненты.
Всё это для меня на тот момент показалось непостижимо сложным, и я даже пришел в некоторое смятение, но от реализации поставленной задачи отказываться не собирался. Так я познакомился с семейством микроконтроллеров STM32 и платой STM32F0-Discovery, после изучения которых мне хотелось бы сваять свой девайс под нужные мне цели.
К моему большому удивлению, такого большого комьюнити, статей, примеров, различных материалов по STM не было в таком же изобилии как для Arduino. Конечно, если поискать найдется множество статей «для начинающих» где описано, как и с чего начать. Но на тот момент мне показалось, что все это очень сложно, не рассказывались многие детали, интересные для пытливого ума новичка, вещи. Многие статьи хоть и характеризовались как «обучение для самых маленьких», но не всегда с их помощью получалось достичь требуемого результата, даже с готовыми примерами кода. Именно поэтому я решил написать небольшой цикл статей по программированию на STM32 в свете реализации конкретной задумки: пульт управления освещением в комнате.
Почему не AVR/Arduino?
Предвосхищая высказывания о том, что неопытному новичку бросаться сразу же в изучение такого сложного МК как STM32 было бы рановато — я расскажу, почему я решил пойти именно этим путём, не вникая и не знакомясь с семейством процессоров от Atmel и даже не рассматривая Arduino как вариант.
Во-первых, решающую роль сыграло отношение цена-функционал, разницу видно даже между одним из самых дешевых и простых МК от ST и достаточно «жирной» ATMega:
После того, что я увидел значительные различия между ценой и возможностями AVR и STM32 – мною было принято решение, что AVR использовать в своей разработке я не буду =)
Во-вторых, я предварительно для себя старался определить набор умений и навыков, которые бы я получил к моменту, когда я достигну требуемого результата. В случае если бы я решил использовать Arduino – мне было бы достаточно скопировать готовые библиотеки, накидать скетч и вуаля. Но понимание того, как работают цифровые шины, как работает радиопередатчик, как это всё конфигурируется и используется – при таком раскладе мне бы не пришло бы никогда. Для себя я выбрал самый сложный и тернистый путь, чтобы на пути достижения результата – я бы получил максимум опыта и знаний.
В-третьих, любой STM32 можно заменить другим STM32, но с лучшими характеристиками. Причем без изменения схемы включения.
В-четвертых, люди, занимающиеся профессиональной разработкой больше склонны к использованию 32-разрядных МК, и чаще всего это модели от NXP, Texas Instruments и ST Microelectronics. Да и мне можно было в любой момент подойти к своим инженерам из отдела разработки и разузнать о том, как решить ту или иную задачу и получить консультацию по интересующим меня вопросам.
Почему стоит начинать изучение микроконтроллеров STM32 с использования платы Discovery?
Как вы уже поняли, знакомство и изучение микроконтроллера STM32 мы начнем с Вами, уважаемые читатели, с использования платы Discovery. Почему именно Discovery, а не своя плата?
- На любой плате Discovery имеется встроенный программатор/отладчик ST-LINK который подключается к компьютеру через USB и его можно использовать как для программирования микроконтроллера на плате, так и внешних устройств путем снятия/установки соответствующих перемычек. То есть плюсом ко всему — мы еще и экономим деньги, получая решение два в одном: микроконтроллер и программатор.
- Платы Discovery имеют полную разводку всех пинов прямо с микроконтроллера на пины платы. Я для удобства использования воткнул Discovery так же в две макетные платы.
- 3. На плате всегда имеется некоторое количество всяких периферийных устройств, например, таких как акселерометры, микрофоны, дисплеи, сенсоры и многих других. На разных платах Discovery имеются различные варианты обвеса. Если кому интересно, можете ознакомиться подробнее на сайте производителя.
Что нам понадобится для разработки помимо платы Discovery?
В своей работе с платой Discovery нам понадобится еще ряд незаменимых вещей, без которых мы не сможем обойтись:
- Схему платы чтобы видеть куда, где и что подключено. Взять схему можно на страничке производителя Вашей платы в разделе Schematic Pack. Скачать схемы можно пролистав страницу немного ниже в блоке, указанном на картинке:
- Datasheet на наш микроконтроллер, чтобы в любой удобный момент можно было посмотреть распиновку, характеристики, параметры и прочую необходимую информацию для работы. В моём случае это STM32F051R8T6. Ссылка на datasheet находится в заголовке страницы:
- Так же нам понадобится Reference manual на наш микроконтроллер. Это документ, в котором подробнейшим образом описаны методы и подходы к работе с ядром МК, c его тактовым блоком, с периферией и т.д. Так же в нем содержатся описание всех регистров МК, всех опций и настроек МК и периферии. Наверное, это самый важный файл без которого разобраться в том, как и что работает внутри МК было бы очень сложно. Скачать файл можно по ссылке на странице микроконтроллера:
- И наконец, нам нужно установить среду разработки, в которой бы мы могли создавать программы для нашего МК и спокойно осуществлять компиляцию и прошивку наших программ. В свое время я перепробовал почти все из самых популярных IDE и остановился на Keil uVision 5. На мой взгляд, данная среда разработки показалась мне самой удобной и простой в освоении. Встроенный отладчик, готовые и легко подключаемые низкоуровневые библиотеки, огромное количество примеров и удобно организованный рабочий интерфейс и пространство IDE стали решающими факторами, повлиявшими на мой выбор. Скачать данную IDE можно с официального сайта, но требуется простая регистрация:. Есть правда одно небольшое ограничение на размер загружаемой прошивки в 32кБ т.к. данная IDE платная. Но нам этого будет более чем достаточно. Нам понадобится MDK-Arm:
Приступим к первоначальной настройке и подготовке IDE к работе!
После того, как скачается установочный файл нашей IDE можно приступать к установке. Следуя указаниям инсталлятора проведите процесс установки. После того, как скопируются все файлы, необходимые для работы появится окно установщика софтовых пакетов для разработки Pack Installer. В данном установщике содержатся низкоуровневые библиотеки, Middleware, примеры программ, которые регулярно пополняются и обновляются.
Для начала работы с нашей платой нам необходимо установить ряд пакетов необходимых для работы и необходимо найти микроконтроллер, с которым мы будем работать. Так же можно воспользоваться поиском вверху окна. После того, как мы нашли наш МК кликаем на него и во второй половине окна и нам необходимо установить следующий перечень библиотек:
- Keil::STM32F0xx_DFP – полноценный пакет программного обеспечения для конкретного семейства микроконтроллеров, включающий в себя мануалы, даташиты, SVD-файлы, библиотеки от производителя.
- ARM::CMSIS – пакет Cortex Microcontroller Software Interface Standard, включающий в себя полный набор библиотек от ARM для поддержки ядра Cortex.
- Keil::ARM_Compiler – последняя версия компилятора для ARM.
После установки требуемых паков можно перейти к настройке IDE и нашего отладчика/программатора. Для этого нам необходимо открыть главное окно Keil и создать новый проект.
Для этого необходимо перейти в меню Project -> New uVision Project и выбрать папку, в которую сохраним наш проект.
После Keil спросит нас какой МК будет использоваться в проекте. Выбираем нужный нам МК и нажимаем ОК.
И вновь появится, уже знакомое нам, окно в котором мы можем подключить интересующие нас модули к проекту. Для нашего проекта понадобится два модуля:
- Ядро библиотеки CMSIS, в котором объявлены настройки, адреса регистров и многое другое из того что необходимо для работы нашего МК.
- Startup-файл, который отвечает за первоначальную инициализацию МК при старте, объявление векторов и обработчиков прерываний и многое другое.
Если все зависимости у подключаемых удовлетворены – менеджер будет нам сигнализировать об этом зеленым цветом:
После того как мы нажмем клавишу ОК мы можем приступать к созданию нашего проекта.
Для того, чтобы сконфигурировать параметры проекта и настроить наш программатор нужно правым кликом по Target 1 открыть соответствующее меню.
В главном меню проекта настраиваем параметр Xtal в значение 8.0 MHz. Данный параметр отвечает за частоту работы кварцевого осциллятора нашего МК:
Далее переходим к настройке нашего программатора/дебагер. Кликаем в этом же окне на вкладку Debug и выбираем в поле Use параметр ST-Link Debugger и переходим в настройки:
В настройках мы должны увидеть модель нашего ST-Link установленного на плате, его серийный номер, версию HW и IDCODE МК который будем прошивать:
Для удобства можно настроить параметр, отвечающий за то, чтобы МК сбрасывался автоматически после перепрошивки. Для этого нужно поставить галочку в поле Reset and Run.
После этого нужно настроить еще одну опцию, которая позволит нам писать русскоязычные комментарии к коду наших проектов. Нажимаем кнопку Configuration и в открывшемся меню в поле Encoding выбираем Russian Windows-1251.
Всё. Наша IDE и программатор готовы к работе!
В Keil имеется удобный навигатор по проекту, в котором мы можем видеть структуру проекта, необходимые для работы справочные материалы, в т. ч. те, которые мы уже скачали к себе на компьютер до этого (схема Discovery, datasheet, reference manual), список функций, использованных в проекте и шаблоны для быстрой вставки разных языковых конструкций языка программирования.
Переименуем папку в структуре проекта с Source Group 1 на App/User, таким образом обозначив то, что в данной папке у нас будут располагаться файлы пользовательской программы:
Добавим основной файл программы через навигатор проекта, выполнив команду Add New Item To Group “App/User”.
Необходимо выбрать из предложенного списка C File (.c) и назначить ему имя main.c:
Созданный файл автоматически добавится в структуру проекта и откроется в главном окне программы.
Что ж, теперь мы можем приступить к созданию нашей программы.
Первым делом, необходимо подключить к нашему исполняемому файлу заголовочный документ нашего семейства микроконтроллеров. Добавим в файл main.c строки следующего содержания, данная программа заставить попеременно моргать наши светодиоды:
/* Заголовочный файл для нашего семейства микроконтроллеров*/
#include "stm32f0xx.h"
/* Тело основной программы */
int main(void)
{
/* Включаем тактирование на порту GPIO */
RCC->AHBENR |= RCC_AHBENR_GPIOCEN;
/* Настраиваем режим работы портов PC8 и PC9 в Output*/
GPIOC ->MODER = 0x50000;
/* Настраиваем Output type в режим Push-Pull */
GPIOC->OTYPER = 0;
/* Настраиваем скорость работы порта в Low */
GPIOC->OSPEEDR = 0;
while(1)
{
/* Зажигаем светодиод PC8, гасим PC9 */
GPIOC->ODR = 0x100;
for (int i=0; i<500000; i++){} // Искусственная задержка
/* Зажигаем светодиод PC9, гасим PC8 */
GPIOC->ODR = 0x200;
for (int i=0; i<500000; i++){} // Искусственная задержка
}
}
После того, как мы написали нашу программу, настала пора скомпилировать код и загрузить прошивку в наш МК. Чтобы скомпилировать код и загрузить можно воспользоваться данным меню:
Команда Build (или горячая клавиша F7) скомпилирует код, и если не было никаких ошибок программе выведет в логе компиляции следующее сообщение о том, что ошибок и предупреждений нет:
Команда Load (или горячая клавиша F8) загрузит компилированный код в наш МК и автоматически отправит его на исполнение:
После загрузки кода мы увидим, как светодиоды начали мигать с равными временными промежутками.
Ура! Первый шаг в освоении микроконтроллеров STM32 мы сделали! В следующем уроке мы разберем что делает каждая строчка нашего кода, как работают порты GPIO и многое другое, а пока можем наслаждаться тем, как весело перемигиваются светодиоды на нашей плате Discovery. )
Комментарии (165)
cyberly
22.09.2017 06:06А Keil по-прежнему платный? Лет 10 назад писал на нем для Atmel'овскоко 51-го микроконтроллера и лицензия, ЕМНИП, стоила 8000 EUR. Хотя, не то, чтобы я ее покупал…
megalloid Автор
22.09.2017 06:20Сейчас есть бесплатная лицензия на Cortex-M0 но ее установка блокирует возможность работы с другими типами ядер (M4, M7, etc.)
Ghost_nsk
22.09.2017 07:03+4Процесс выбора МК не описан. Из таблички можно сделать и совсем другие выводы.
Мне например сложно представить зачем нужны пять таймеров. Для просыпаться и что то делать достаточно одного, ну пусть нужен ШИМ, под него ещё один, итого, для 90% задач достаточно 2 таймера. Более точный АЦП тоже нужен редко. Под 5 вольт проще и дешевле найти обвязку (хотя это спорно). У 328 большое количество вариантов корпусов, от DIP (проще макетировать) до BGA (меньше места), у stm только LQFP/SSOP что для начинающих большая трудность. Ну и наконец, флеша одинаково, но один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд.
Ничего против stm32 не имею, просто не понятны критерии выбора, и мне кажется что это важный момент для начинающих, ведь это статья для них.megalloid Автор
22.09.2017 07:21Я думаю что, этот вопрос необходимо раскрывать ориентируясь на конкретное ТЗ и на основании определенного перечня требований. Этот вопрос я раскрою когда буду раскрывать выбор МК для своего устройства.
Насчёт DIP — полностью согласен, жаль что ST не потрудились сделать такой корпус для начинающих.masai
22.09.2017 11:03Когда я начинал, у меня плату для LQFP с помощью принтера и утюга с первого раза получилось изготовить. А это главная сложность. Пайка вообще проблем не представляет. А для макеток есть дешёвые отладочные платы с минимальной обвязкой. У них проблем с макетками нет, и даже удобнее получается.
На мой взгляд реальный минус тут не в макетировании, а в том, что если самому плату проектировать, то у LQFP между ногами дорожку не протащишь, что сильно усложняет трассировку дорожек с питанием и землёй (которых нужно четыре пары). Особенно на односторонней плате. Можно, конечно, делать Gerber и заказывать платы, но для меня это хобби. А что это за хобби, когда его за тебя кто-то другой делает? :)
megalloid Автор
22.09.2017 11:57Я юзаю QFN-корпуса и платы делаются относительно не плохо. Тем более, если учитывать тот факт, что габариты встраиваемого устройства порой сильно ограничены.
masai
22.09.2017 12:48Это интересно. А как там к выводам подпаиваться в домашних условиях? Фен и паяльная паста? И где берёте STM32 в таком корпусе? На Aliexpress сходу не нашёл.
megalloid Автор
22.09.2017 12:57+1Всё ношу в голове мысль попробовать паяльную пасту. Но пока только флюс, фен, паяльник.
Последовательность проста:
1. Залуживаем после вытравки дорожки
2. Наносим флюс
3. Позиционируем МК
4. Нагреваем феном удерживая МК пинцетом
5. Ждём пока усядется МК.
6. Чистим плату от флюса, проверяем пропайку через микроскоп.
7. Допаиваем ноги острым жалом, если где-то есть подозрения на непропай.
Закупки все осуществляю у местного (г.Екатеринбург) поставщика, в Промэлектронике.
Если интересно — загуглите STM32F051K8U6, на Али они тоже есть в продаже. Ценник особо не отличается от «Промки», мне лично время дороже, не люблю ждать. Либо обычно заказываю заранее.
ploop
22.09.2017 11:07+1Да не бойтесь вы LQFP, паяются они с закрытыми глазами. Плату изготовить сложнее, но есть вариант развести и заказать у китайцев, только подождать доставку придётся. Но зато девайс будет выглядеть как заводской. Плюс вы не ограничены одним слоем и имеется возможность сделать металлизированные переходы, а при разводке это просто кайф, в отличии от разводки под утюг.
Ghost_nsk
25.09.2017 07:26после ssop32 я ничего выводного не боюсь )) Но до этого надо дойти. Естественно использовать DIP в готовом устройстве уже выглядит немного странным, но возможность по быстрому натыкать их в бредборд, накидать перемычек и убедиться что белый дым не выходит — бесценно. А потом, когда уже все работает и отлажено можно делать разводку платы под любые корпуса.
nonpar
22.09.2017 09:56один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд
Прямо скажем, такой подсчёт некорректен; более того — лукав. 1) В ядре AVR регистры данных 8-битные; но слова программы 16-битные. 2) Ядро CortexM0 в STM32 использует 16-разрядный набор инструкций Thumb.Ghost_nsk
25.09.2017 07:32«совсем грубо» же. Ок, в два раза меньше команд. Но что то мне подсказывает, что у ARM на настройку периферии уйдет больше команд чем в AVR, и в итоге в AVR все рано поместится больше полезного кода.
nonpar
22.09.2017 09:56один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд
Прямо скажем, такой подсчёт некорректен; более того — лукав. 1) В ядре AVR регистры данных 8-битные; но слова программы 16-битные. 2) Ядро CortexM0 в STM32 использует 16-разрядный набор инструкций Thumb.
holomen
22.09.2017 22:10У стм есть скорость и довольно развитая периферия, у авр есть прецизионный ногодрыг. Каждому молотку свое применение. Вы ведь не будете кувалдой забивать какойнить гвоздик в часовую оправу? Вот здесь точно так же.
Я, признаться, довольно часто использую связку стм+авр причем даже нередко в виде +ардуина(как железка-плата, а не фремворк) именно по этой причине — когда требуется именно прецизионный ногодрыг когда нужно высчитать все задержки с точностью до такта. А стм это не всегда позволяет — см RMxxxxdernuss
22.09.2017 23:10Зато в стм32 можно писать из памяти в порт через DMA. Очень даже прецизионно и плюс проц не занят.
holomen
22.09.2017 23:44И как в посылке между битами обработать условия при использовании DMA?
Вопрос риторический. Не отвечайте — никак.
Ситуация экзотическая, не спорю. Но иногда все таки бывает и вот такой вывих.
boojum
22.09.2017 08:05То есть вот это всё только ради изготовления выносного выключателя из за того что " выключатель света в основной комнате оказался за шкафом-стенкой"?
Да это даже не из пушки по воробьям, это атомной бомбой по комару.
А если не для этого, то напишите для чего. В какой реальной вашей задаче оно покажет преимущество перед *Дуинами несмотря на заметно более высокую сложность и цену?
megalloid Автор
22.09.2017 08:20Тема насчёт дистанционного выключателя была взята в качестве отправной точки. В сущности я не планирую останавливаться только на выносном выключателе. На текущий момент я работаю над цельной централизованной экосистемой устройств а-ля «Умный дом», в т.ч. для управления освещением/нагрузками (тех которые действительно требуют управления, например электронагреватель, теплый пол и др.), системой датчиков качества воздуха, приточной вентиляцией, датчиками температуры и т.д.
Ну и попутно ставилась цель научиться. Понимание того, что знания по теме достаточно фрагментированы — я решил поделиться своим опытом и наработками с начинающими, т.е. ровно тем, чего мне не хватало когда я сам начинал учиться.holomen
22.09.2017 22:20+1Сразу подскажу куда ковырять эту тему. К сожалению, многие тяготеют к топологии «звезда». А ведь в быту это крайне неудобно. КМК, самое разумное примерно следующее: «полуумные» устройства. Т.е. «выключатель» логически вяжется с «лампочкой». Смысл в чем. выключатель напрямую говорит лампочке включиться или выключиться. БЕЗ участия центрального контроллера. Он, конечно, тоже слушает весь этот трафик и послушно рисует во всех этих веб-интерфейсах красивые анимированные иконки состояния. Но на этапе управления его роль маленькая — задает связи выключатель-лампочка, и… и ВСЁ! дальше выключатель и лампочка общаются между собой.
Это дает огромное преимущество — можно просто выдернуть из розетки центральный контроллер, но свет в туалете/ванной буде включаться.
Домашние это оценят особенно высоко.vbifkol
23.09.2017 21:32Завтра как раз буду растягивать провода в доме под схожую архитектуру — отдельный кабель до каждого источника света и каждого выключателя. В щитке будет сменный блок коммутации, позволяющий либо управлять всем барахлом с ардуины, либо на чистом аналоге. Хотя по здравому размышлению баловство все это — проще держать в запасе прям в щитке пяток ардуин на смену, чем перекоммутировать.
ploop
23.09.2017 22:27Что за кабели решили использовать? У меня пока ремонта нет — над тем же думаю. Склоняюсь к витухе.
vbifkol
24.09.2017 18:36Ээээ… ВВГнгЛС. Смысл в том, что сигнальный кабель параллельно силовому тянуть не буду — вся коммутация только в щитке. Вместо обычной схемы, когда от щитка идет провод до коробки, оттуда фаза ответвляется до выключателя, возвращается и с нулем идет до светильника — и выключатель, и светильник имеют свой выделенный трехпроводной кабель. Если захочу — в щитке организую классическое подключение, а захочу — приведу проводник с выключателя на дигитал.ин, а фазу возьму с дергаемого той же ардуиной реле. Благодаря трем проводникам до каждого выключателя есть возможность использовать трехклавишные выключатели, обеспечивая управление тремя источниками. Благодаря ардуине (в отличие от бистабильных реле) можно использовать традиционные выключатели, а не «кнопки», которые дороже и реже в наличии — сигнал на включение/выключение можно кодировать изменением статуса клавиши, а не кратковременным нажатием.
ploop
24.09.2017 20:14А, вон как. Я думал, вы про сигнальные.
На самом деле я тоже думал тянуть от каждой розетки/выключателя отдельно, но получается слишком затратно/геморно. К примеру, есть блок розеток 4-6 штук, уже жгут силовых проводов, что их непросто проложить, а в комнате таких блоков может быть 2-3, это пучок в руку толщиной.
Пришел к выводу протянуть к каждому такому блоку/розетке сигнальный провод, оставить место под управляющую плату, и подключить всё по старинке.vbifkol
25.09.2017 05:55С розетками — скорее всего так и сделаю (хотя не очень понятно, нахрена рулить каждой розеткой), даже если не понадобится для автоматики, витая пара в каждом блоке не помешает. Со светом это смысла не имеет — одна/две нагрузка на точку, дешевле и проще дотянуть до каждой кабель.
ploop
25.09.2017 09:46Со светом конечно, при том сечение провода будет гораздо меньше.
На счёт розеток: в идеале видеть нагрузку на каждую из них и рулить соответственно. Банальный пример — воткнули в один блок ноут на зарядку и утюг, и ушли из дома. Как погасить одно, не трогая другое?
Ещё выбор витухи вызван тем, что может понадобиться розетка для LAN, при этом можно задействовать 2 пары на своё усмотрение. То есть растянуть их везде во время ремонта, а потом делать/не делать по мере появления желания.Alexeyslav
25.09.2017 15:52Гигабит становится обыденностью, двумя парами уже не обойтись… темболее еще и неэкранированными.
vbifkol
25.09.2017 18:03Знаете, я ретроград. Я дома удаленно не рендерю и кластеров из холодильника и торшера делать не собираюсь. 100 МБит хватит всем, почти как 64к памяти.
Alexeyslav
25.09.2017 20:09Разве что если цель сети — только доставка интернета. А когда бэкап при полностью свободной сети заливается на NAS больше 40 минут… это очень уныло.
vbifkol
25.09.2017 18:01Ну вот как раз я долго и упорно думал — может ли у меня быть ситуация втыкания в один блок ноута и утюга… Пожалуй, нет — у меня утюг будет только в гардеробе. Ну и так далее: отдельный «всегда вкл» блок для мультимедиа, блок с резервированием под сервер, некоторое количество управляемых блоков. На кухне тоже: управляемые (розетки для кухонной фиготы типа блендеров/кофемолок), «всегда вкл» (для девайсов с таймером) и резервированные (для холодильника).
А так чтобы смешивать… очень редко когда пригодится.
Так что витуха скорее всего именно под ЛАН.
kurojneko
22.09.2017 08:34Товарищ, пишите ищо!
Материал для новичков на эти чипы в основном напоминает майкросовтовские курсы. Нифига никто ничего не объясняет, просто дают методичку для достижения конкретной цели. Если Ваша цель отличается — фигово быть вами. Без фундаментальных знаний можно только быдлокодить.
Обратите внимание на библиотеку HAL — это куча всякой полезности для микроконтроллера, инициализаторы всего и вся… не, не смогу кратко описать всю ее полезность (вот щас некоторые начнут рассказывать что всё должно быть без библиотек… а то развели..)
Другая тема — CubeMX. Тоже на сайте производителя можно найти, программка для конфигурирования камня. Там например в настройках частоты такой бардак, что сами микроэлектроники за голову хватаются, вот и сделали программку. Частота процессора одна, шин другая, периферии третья… и это далеко не все… Ну плюс настройка ввода вывода, интерфейсов и многого другого тоже там есть.megalloid Автор
22.09.2017 08:59-2Я считаю HAL очень мусорным, нечитабельным. Дебаг в нем превращается в сущий ад.
CubeMX смотрю, как правило, только для того чтобы сформировать значения по тактированию, возможно глазком заглянуть в генерацию таймингов. Но генерируемый им код считаю не юзабельным. Глубоко не копнешь, всё разбросано по куче файлов в проекте. Словом возмутительный бардак.
От использования HAL и CubeMX напрямую я отказался.
Со своей формой библиотек я так же ознакомлю в последующих материалах.
shell4692
22.09.2017 08:34+3Будучи уже 5 лет разработчиком на stm32 хочу обратить внимание автора статьи на один нюанс. Главное отличие stm32 от AVR есть возможность вложенной обработки прерываний и наличие DMA. А также, наличие SysTick — таймера, который тикает не во внешней периферии, а в ядре. Это позволяет делать на нём многопоточные приложения, чего AVR8 лишён в принципе (я имею ввиду mega328p/mega16/mega32 и вообще AVR ядрёные версии). Для однопоточной задачки вполне себе подошёл бы и Ардуино, ничего такого ужасного в нём нет. С моей точки зрения, оба контроллера пригодны для решения задач, у каждого есть свои преимущества и недостатки. Пятивольтовые AVRки вполне себе могут уживаться в одной схеме с трёхвольтовой stm32. А для выключателя на стенке вполне себе, наверное, хватило бы и чего-то мелкого, вроде attiny.
Кстати, использование CMSIS для новичков, это довольно сложный способ вхождения в тему. Есть гораздо более простые вещи, например, библиотека Peripheral Library, которая является надстройкой над CMSIS и предлагает простые и удобные функции работы с очень запутанной периферией контроллера, без надобности (на первом этапе) вникать в структуры периферийных регистров и карты их полей. Ну, или более современный вариант, вроде CubeMX.
На мой взгляд, самым «вкусным» контроллером 30й серии stm является ИМХО stm32f030f4p6. Имея встроенный генератор на 8МГц, который раскачивается ФАПЧем до 48МГц и корпус TQFP20, он очень красиво становится на адаптер TQFP->DIP и занимает всего лишь пару квадратных сантиметров на бредборде. На него запросто можно уместить 10-15 поточное приложение, которое будет иметь некую структуру драйверов и сервисов.megalloid Автор
22.09.2017 08:451. Насчёт использования AVR/Arduino/ATTiny — по секрету говоря, я с них как раз таки начинал, но STM32 мне показался более перспективным в плане моего развития, да и коллеги могли помочь в значительной степени на начальном этапе. Я не говорю что мой вариант и способ решения единственно правильный или сообразный — я говорю о том, что мне он показался наиболее интересным. Согласен, тут свои плюсы и минусы.
2. Использование CMSIS было использовано с целью максимально быстро организовать сборку проекта для того, чтобы увидеть вожделенное моргание светодиодами. А приучать себя заранее работать с битовыми операциями, картами регистров, изучая работу низкоуровневой части, если это подано в доступной и понятной форме, ничего сложного не вижу. Сам именно с этого начинал. Разбирался и прокачивал скилл с нуля. Смог. Справился.
ViacheslavMezentsev
22.09.2017 13:25Это позволяет делать на нём многопоточные приложения, чего AVR8 лишён в принципе (я имею ввиду mega328p/mega16/mega32 и вообще AVR ядрёные версии). Для однопоточной задачки вполне себе подошёл бы и Ардуино, ничего такого ужасного в нём нет.
scmRTOS — считается? Я запускал её и использовал на Arduino (в одном из журналов Хакер есть статья как это сделать). Нормально вроде работает, процессы переключает.shell4692
22.09.2017 18:27Несомненно считается. Автор scmRTOS делал её для не только для AVR, а вообще для МК и делал её на C++. И это наложило отпчаток на системные требования scmRTOS — 512 байт ОЗУ минимум. Однако, простой кооперативной многозадачности было бы достаточно для небольшого (по сравнению с stm32) ресурса этих контроллеров. Честно говоря, не хочется превращать беседу в holywar типа stm32 vs avr. Я много лет назад начинал на AVR и до сих пор их использую. Также, как и stm32.
shell4692
22.09.2017 08:42Вот насчёт контроллера «умного дома» на stm32Discovery у меня возникают сомнения. Тридцатка слабовата, чтобы тянуть на себе RTOS на целый умный дом, для таких целей, наверное, могли бы подойти модули Maple-Mini, на stm32f103c8, у которых 72Мгц с внешним кварцем. Да и они тоже как-то слабоваты.
megalloid Автор
22.09.2017 08:54Да не на Discovery же, я их беру в поле рассмотрения только для обучения же, ну!
Целевой девайс будет полностью кастомным на отдельном МК. А центральный контроллер будет на ARM Cortex-A53.mitgard
22.09.2017 09:42Вы понимаете всю пропасть в схемотехнике и проектирование ПП? Это иная область. Я мало знаю людей, которые одновременно могут это делать еще и разрабатывать ПО.
Имхо, ядро вашей системы должно быть на одноплатнике. Проще и удобнее решение.megalloid Автор
22.09.2017 09:50Именно так и есть: под ARM Cortex-A53 я подразумевал Raspberry Pi 3.
Там уже предстоит командная разработка. С вами не поспоришь.
Невозможно быть экспертом-профессионалом во всех областях IT.mitgard
22.09.2017 10:00Тогда не понятно, зачем вам нужен stm32. Делать на нем периферию?
Вы же не будете писать свою ОС под RPi3.megalloid Автор
22.09.2017 10:101. Одноранговые устройства сети: датчики, управлялки, модули, драйверы и др. — это всё на STM32 + LoRa.
2. Центральный контроллер на RPi3 + LoRa.dernuss
22.09.2017 13:03а почему LoRa?
Дальность большая нужна?megalloid Автор
22.09.2017 13:18Вообще, на самом деле, прежде чем выбрать LoRa я опробовал целую кучу решений для радиосвязи прежде чем остановился на LoRa.
1. ESP8266 — глючил, не оживал после резкой перезагрузки. Прожорлив по питанию. В целом не очень решение для организации низкопотребляющего автономного устройства.
2. RF-433 модули — примитивные, ASK-модуляция, никакого протокола и механизма обработки пакетов, полностью ручное управление.
3. NRF24L01+ — хорошие модули НО: криво работающая система адресации, ограничение на количество сетевых адресов в сети (7 по-моему). Бывает такое что одному модулю прилетает не предназначенный для него пакет, он шлёт ACK на передатчик и целевое устройство не получает то что должно было придти к нему.
4. SPIRIT1 — богатые по функционалу и возможностям устройства, но требуют разработки радиотракта (лежит за пределами моих текущих компетенций) и настройки согласования антенны. Готовые модули SPSGRF-XXX дорогие и имеют малый радиус покрытия даже с антенной.
5. LoRa — низкое потребление, большая дальность. Настраиваемые прерывания на ноги GPIO самого модуля, RSSI, пакетный конвейер, и много других фишек (которые к слову есть и в SPIRIT1). Предстоит еще обкатать чтобы сделать выводы об этом модуле. Ну и много хороших отзывов.dernuss
22.09.2017 13:21Мне нравятся всех больше si4432 (si4463). Дешевле чем LoRa.
Для дома (+ около дома) помоему самое то.
dernuss
22.09.2017 13:31megalloid Автор
22.09.2017 13:39Возможно это только мне повезло так.
dernuss
22.09.2017 13:56есть ещё вариант CC1101 от ti. Но я его не пробовал.
megalloid Автор
22.09.2017 14:06Это и есть купленный в последующем ST SPIRIT1)))
dernuss
22.09.2017 14:38а ну так модулей на cc1101 у китайцев полно
Уже с радио трактом.
Так же как и на si4432
Тоже с радио трактом.
megalloid Автор
22.09.2017 14:43Они отличаются немного ST-шных. Сам не юзал, не могу дать оценку качеству и пригодности к использованию данных модулей.
romixlab
22.09.2017 19:01А как же 802.15.4 — ZigBee или Thread?
У NXP есть очень интересная серия — KW41Z (с Bluetooth и без него), у Atmel — Mega RF, SAMR и множество других.
Hellsy22
23.09.2017 08:01+1ESP8266 — глючил, не оживал после резкой перезагрузки
Типичная проблема неправильного питания. Такое часто случается если кто-то после дешевого стабилизатора не поставит нужный конденсатор для выравнивания ряби и/или не поставит достаточно емкий конденсатор для сглаживания скачка питания, возникающего при включении радиомодуля. Если все сделать по даташиту (я знаю, это кажется нелепым, но все же), то ESP работает без малейших проблем и сбоев.
ploop
22.09.2017 10:37+1Я мало знаю людей, которые одновременно могут это делать еще и разрабатывать ПО.
Зайдите на любой радиолюбительский форум. Таких людей масса, но они больше ориентированы на низкоуровневое программирование, «ближе к железу».mitgard
22.09.2017 20:16+1Реально сильных программистов, которые делают правильно не так-то и много. Просто кодить это вот ардуино доказало, что может каждый. Вы ещё скажите, что любой из них под плис напишет.
ploop
22.09.2017 21:58+1И под плис пишут, и в связке с МК, и в сочетании с нехилой схемотехникой. Но таких конечно мало, а составить схему и написать код (не идеальный, но рабочий) — очень многие. При том ардуино не жалуют.
latonita
22.09.2017 09:32+1Последнее, о чем нужно думать новичку при выборе первого контроллера — это сравнение производительности, наличие DMA и пр. Простота входа — вот первый шаг — тут и лёгкий старт, наличие простых обучающих материалов, а не копание в даташитах. А дальше, после первых проб и проектов, уже будет понятно, что надо, а что не надо. И можно будет выбрать соответствующий МК.
megalloid Автор
22.09.2017 09:42Если вообще -то нужно предварительно разобраться в вопросе прежде чем принимать то или иное решение в пользу того или иного контроллера. И всё очень сильно зависит от целей и возможностей конечного пользователя.
В свете данного комментария я могу сказать что я стал очень необычным новичком. И своими статьями хочу снизить порог вхождения в кодинг МК на STM32, ну или сделать процесс вхождения более просты путём изложения накопленного мною опыта.Sly_tom_cat
22.09.2017 11:05+1> снизить порог вхождения в кодинг МК на STM32, ну или сделать процесс вхождения более просты путём изложения накопленного мною опыта
Вот и не слушайте никого, пишите.
Сам в свое время к STM32 присматривался, но так скажем эко-среда — не впечатлила.
Я считаю что чем больше будет доступным языком написано про STM32 — тем лучше. А у вас получается довольно неплохо.megalloid Автор
22.09.2017 11:58+1Спасибо за добрые слова!) Постараюсь регулярно радовать Вас своими материалами.
Koyanisqatsi
22.09.2017 10:42+1Еще один туториал по STM32? А зачем?
megalloid Автор
22.09.2017 10:49Вся проблема в том, что информация по вопросу достаточно фрагментарна и приходится её аккумулировать, ползая по огромному количеству ресурсов и складывая общую картину из пазлла. Ну и некоторые вещи которые я собираюсь рассмотреть взяты из англоязычных источников. А начинающие, как правило, не отягощены знанием тех. английского и порой передовой опыт зарубежных коллег обходит новичков стороной.
Цель моего материала — наиболее широкое освещение спектра базовых вопросов и изложение аккумулированного мною опыта. То есть создание такого материала, которого мне так не хватало на момент когда я начинал изучать STM32.Koyanisqatsi
22.09.2017 10:57Ну не знаю. Статей про светодиод и его мигание очень много. А вот статей про какие-нибудь редкие функции периферии, навроде режима захвата у таймера или про использование MAC контроллера, явно недостаточно, даже из референс мануала информации вытянуть получается немного. Поэтому, если начинать такую обширную тему с основ, которые разжёваны тысячу раз другими, до настоящих интересных задач вы не доберетесь, т.к. просто надоест писать столько статей.
megalloid Автор
22.09.2017 11:00Рассчёт был именно на «писать столько статей». Т.к. когда готовишь подобного рода материал для публикации — как минимум систематизируешь свои знания и иногда можно даже узнать что-то новое. Поэтому мотивация продолжать написание разного рода статей — железная! =)
Koyanisqatsi
22.09.2017 11:14В таком случае я бы вам посоветовал использовать CubeMX+какую-нибудь бесплатную IDE, например, Atollic, Coocox (кажется он уже всё), SW4STM32 или же чистый Eclipse с плагинами, т.к. размеры кода со временем вырастут за 32кб. CubeMX и библиотеку HAL многие ругают (возможно есть за что), но если при объяснении функционала микроконтроллера использовать и её, и чистый CMSIS, то статьи только выиграют. Удачи вам в ваших начинаниях!
megalloid Автор
22.09.2017 12:02В моих библиотеках получилась смесь CMSIS + HAL + плюшки CubeMX (в плане удобного интерфейса для рассчёта схемы тактирования и справочной составляющей этой программы) завёрнутая в удобные иерархически выстроенные и отлично откомментированные библиотеки.
Спасибо Вам за добрые слова! Именно хорошие отзывы больше всего вдохновляют! =)
VBKesha
22.09.2017 10:53+1Я думаю при изучении STM32 стоит ещё обратить внимание на wiki.stm32duino.com/index.php?title=Blue_Pill стоит копейки, но достаточно удобна для мелких проектов.
megalloid Автор
22.09.2017 10:58-1Да, это самое дешевое предложение из имеющихся на базе STM32 — около 100р. из Китая.
Но т.к. серия STM32F103 была пилотной серией 32-разрядных МК от ST — всё получилось по принципу «первый блин комом». И есть ряд различий по картам регистров и проблемы с совместимостью с текущим предложением в аналогичной линейке продуктов от ST.VBKesha
22.09.2017 11:28+1Я использую HAL и про регистры не знаю, в целом спокойно перешел с 103 на L433 когда понадобилось, и всё работает.
megalloid Автор
22.09.2017 12:12Не рискну делать каких-либо выводов но мне кажется что портируемый код был достаточно прост чтобы плавно переехать с F103 на L433. Я люблю абстракции но с условием полного понимания что за этими абстракциями происходит.
Fox_exe
22.09.2017 11:18А ещё можно было извернуться и воспользоваться проектом Stm32Duino: Получить мощь и функционал STM32 и обилие библиотек, готового кода, мануалов и прочих нищтяков от Arduino.
megalloid Автор
22.09.2017 12:04Так или иначе данный подход не реализует весь потенциал STM32 во всей широте и не даст ощутимой прокачки скилла и опыта т.к. всё будет уже готовое.
Ksiw
23.09.2017 16:58Почему не дает, поясните? Фреймворк ардуины только лишь берет на себя рутину, но ничуть не бьет по рукам желающим напрямую обращаться к регистрам и писать наиболее эффективный код. Поправьте если ошибаюсь.
Сам юзаю visual studio+visual micro и счастлив, хотя работать с широкой периферией задач не возникало.
P.S. С нетерпением жду от Вас статьи в которой будет расжевана работа с каналом DMA.
Спасибо за Ваш труд, он нужен нам.megalloid Автор
23.09.2017 16:59Я имел ввиду традиционный подход к программированию Arduino в Arduino IDE
MegaVaD
22.09.2017 11:29Рекомендую для начала всё же ардуино, чтобы не заморачиваться наперво по поводу железных вещей и сосредоточиться на качестве кода. Ну о каких циклах для задержки может идти речь? Гуглю давно пора забанить за такие костыли.
learn.adafruit.com/multi-tasking-the-arduino-part-1/a-classy-solution
Т.к. я и сам новичок, то хочется услышать от более зрелых коллег по поводу реализации т.н. задержек по ссылке. ИМХО — как раз там всё описано очень хорошо, и код мне люб.ploop
22.09.2017 11:36Это HelloWorld в мире МК, минимально работающая программа, результаты которой видны. В реальной программе никто задержки циклами не делает, если это не считанные такты.
По ссылке — ардуино, что не имеет никакого отношения к теме.
megalloid Автор
22.09.2017 12:13Предложите лучший вариант без использования дополнительной периферии для организации задержки. Очень интересно было бы увидеть оригинальное и простое решение! =)
iig
22.09.2017 12:58Я в этих STM32 не разбираюсь, но, чорт побери… Есть же usleep() (гуглится).
megalloid Автор
22.09.2017 13:02Вы про это что-ли? Обратите внимание на тело функции пожалуйста :D
int usleep( useconds_t __useconds ) { volatile uint32_t nCount; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq (&RCC_Clocks); nCount = ( RCC_Clocks.HCLK_Frequency / 10000000 ) * __useconds; for( ; nCount !=0 ; nCount-- ); return 0; }
iig
22.09.2017 13:37+1И? Стандартная функция, существующая почти на любой платформе.
Если сравнить это
for (int i=0; i<500000; i++){} // Искусственная задержка
и это
usleep(500000)
, что более наглядно?
megalloid Автор
22.09.2017 13:41Я не преследовал цели сделать максимально красиво и наглядно.
Мне надо было только сделать простейшую моргалку светодиодом при минимуме усилиий со стороны читающего статью. Вводить функции и прочее в мои планы не входило. Если нужны были бы задержки — я бы сделал их средствами периферии.iig
22.09.2017 14:04+1Я не преследовал цели сделать максимально красиво
при минимуме усилиий со стороны читающего статьюЭти 2 предложения конфликтуют, или мне показалось? ;)
Проехали, смысл helloworld от этого никак не страдает, и подобных мигалок светодиодом гуглятся десятки, и у всех в нутре for(). Хотя как-то странно, для демонстрации очень простого алгоритма на супер-пупер-мощном кристалле все делают helloworld в том самом Arduino-style, на который с таким пренебрежением кивают ;)
MegaVaD
22.09.2017 12:59Без использования периферии можно использовать счётчик, но не определено время инкрементирования (зависит от времени цикла) — это решение тоже не будет годиться для критичных к точному времени задач, но оно не будет блокировать остальной код во время между включением и выключением диода.
megalloid Автор
22.09.2017 13:05Вы про SysTick?
MegaVaD
22.09.2017 13:11SysTick is an ARM core peripheral (с), следовательно — нет, я не про него. C ним как раз всё будет более-менее детерминированным. Но Ploop говорит, что это ардуино, а значит — плохо.
Без периферии просто uint32 счётчик, инкрементить раз в цикл.ploop
22.09.2017 13:19Я не говорю, что это плохо, я говорю, что это не тема данной статьи.
А так всё вы верно сказали, без использования периферии не сделать чётких таймингов (если, конечно, основной цикл занимается хоть чем-то ещё).
Armleo
22.09.2017 12:04+3STM32CubeMX — лучший инструмент. Он генерирует код под ВСЮ переферию МК. Я лично перешел с PIC -> AVR-> STM32 только ради HAL и STM32CubeMX. А корпуса то какие удобные! Малеенькие даже на 48 ног.
megalloid Автор
22.09.2017 12:08-3Генерируемый код, на мой взгляд, очень не читабелен и трудно отследить его до низкоуровневой составляющей. Нет наглядности. Простота — да, скорость — да, удобство — несомненно. Но я прежде всего планирую научить и рассказать, а потом уже предлагать готовые решения и уровни абстракции, причем на начальном этапе я рассматривают CubeMX как абстракцию от понимания того что происходит на нижних уровнях и как это всё работает. Мне, как инженеру, интересно как там всё устроено и по какому принципу всё работает.
mkulesh
22.09.2017 12:24+4Я уже писал подобный комментарий две недели назад под аналогичной статьей про STM32 на хабре, поэтому повторюсь.
Ни в коем случае не хочу обидеть автора, но меня несколько удивляет методология такого подхода. Автор берет STM32 (внимание, контроллер с мощнейней перефирией), показывает, что через регистры можно изменять состоние светодиода и делает вывод, что таким образом можно делать все. Но ведь это не так. Если я беру STM32, то, очевидно, мне нужно много больше, чем мигать светодиодом. Например, RTC (включая все зубодробильную логику работы с датами и временем в разных часовых поясах и високосных/невисокосных годах), SDIO со всей логикой общения с карточкой (включая CRC контроль данных), USB-стек, внешняя память, и все это через DMA. Именно этот функционал и является основной частью HAL, а поморгать светодиодом — это так, базовый уровень. Вы высокоуровневый протокол работы SD карты, FatFS или USB-стек тоже сами будете с нуля переписывать? А если Вам этот слой HAL неинтересен (то есть нет потребности в этом функционале), то зачем Вы вообще берете STM, а, скажем, не Atmega16?
Да, HAL сложен, там есть ошибки, в документации сам черт ногу сломит, но он реализует высокоуровневые протоколы богатейшей перифирии STM32, которые не просто не нужно, но даже вредно переписывать самому.
И второй момент. Вы берете платную IDE в демо-режиме с ограничением по размеру программы и говорите, что все OK. Нет, не OK. Как только Вы задействуйте перефирию (USB, SD, дисплей), вы мгновенно в это ограничение упретесть, а именно перефирия и является сильной стороной STM32. Зачем такие костыли, когда есть официальная кроссплатформенная IDE именно для STM32, бесплатная, без ограничений, с полной интеграцией HAL и CubeMX, а также с тысячами рабочих и полезных плагинов. Я говорю про sw4Stm.megalloid Автор
22.09.2017 12:35-21. Я не делаю вывод на основании того, что поморгав светодиодом мы можем сделать всё что угодно. Поморгать светодиодом это своеобразный ритуал вожделенного дрыганья ногой от нашего МК, первое что хотят новички от МК и я не отказал им в праве удовлетворить своё желание вдоволь надрыгаться.
2. Вы видимо не уловили из этой статьй информацию о том, что я собираюсь написать цикл статей по данному МК и его периферии.
3. Большая часть моих библиотек это переработанный и адаптированный HAL, с организацией под удобную мне форму. Это вы увидите когда я выложу первый проект.
4. Кто вам сказал что мне не интересен сам HAL? Мне не интересна та форма в котором её подаёт ST.
5. Насчёт переписывания — ее никто не переписывает/переделывает — я сменил форму не меняя содержания.
6. Когда упрёмся — тогда и поговорим о переходе. Пока в текущих рамках Keil более чем достаточно.
mkulesh
22.09.2017 13:17+1Вы делаете полезную и нужную работу своими статьями — популяризация STM32. Обеими руками поддерживаю. Я только хочу сказать, что неудачно расставленными акцентами можно отпугнуть новичков. STM32 сегодня уже имеет очень развитую и качественную экосистему — SW4STM, HAL, CubeMX. Все это реально работает из коробки, все примеры по миганию светодиодами для всех демо плат уже включены в SW4STM, и именно это и понижает порог вхождения в тему. Но от Вашего рассказа создается впечатление, что такой экосистемы нет и поэтому все сложно.
И еще про HAL. На мой взгляд, как функциональная библиотека он вполне уже работоспособен. Чего не хватает, так это удобной объектно-ориентированной библиотеки драйверов как самой переферии МК, так и внешних устройств. Я в этом направлении работаю: github.com/mkulesh/stm32DevelopmentBoards/tree/master/src/StmPlusPlus
Если Вы двигаетесь в похожем направлении, то мы могли бы скооперироваться.megalloid Автор
22.09.2017 13:30Вспомогательные утилки типа ST-Studio, ST-LINK Utility, CubeMX и многие другие я хотел рассмотреть в отдельной статье, особенно показав возможность Real-TIme отладки.
Я планирую плавный переход с С на С++. Но пока что не достиг должно уровня компетенции в вопрос чтобы кооперироваться по вопросу. Спасибо за предложение.
holomen
23.09.2017 00:11Про HAL и размер.
Одно и тоже функционально приложение (USB девайс). Одно на SPL, второе на HAL.
12/28К соответственно
Что там было про размер?..
Andronas
22.09.2017 13:07Но сделав вывод, что я не узнаю, что творится внутри микроконтроллера за рамками Arduino-скетчей я решил поискать более интересный вариант, который подразумевал глубокое изучение и погружение в дебри микроконтроллерной техники.
Откуда такие выводы? AVR можно наверно программировать и без использования скетчей, на чистом Си. Есть тут кстати матерые ардуинщики, может накидаете ссылок как перейти от скетчей к программированию на обычном Си для AVR?megalloid Автор
22.09.2017 13:20Я имею ввиду не тех необычных ардуинщиков а в целом парадигму Arduino-программирования и то на что она ориентирована. Если интересно: начните отсюда blogs.msdn.microsoft.com/rucoding4fun/2012/01/14/visual-studio-20082010-arduino
Andronas
22.09.2017 13:28Вас понял, но ничто не мешает взять ту же атмегу328 и запрограммировать ее на Си. Причем взять именно отдельный чип, программировать через отладочную ардуинку. А потом этот чип уже смонтировать на плате с необходимыми компонентами в готовое устройство (не превращая это устройство в ардуину).
megalloid Автор
22.09.2017 13:38Согласен, ваше мнение безусловно имеет право на существование, но мне на момент определения какой МК взять для реализации задачи — показалось интереснее «броситься в омут с головой» и взяться именно за STM32, хотя и понимая, что AVR значительно проще в освоении.
dernuss
22.09.2017 13:47Стоимость на ali atmega328 и например stm32f103 почти одинаковая.
А например stm8s003 стоит вообще копейки
holomen
23.09.2017 00:15Не надо брать голую 328. Вполне можно и в виде ардуины взять. И даже бутлодырь сносить не нужно — он довольно удобен бывает.
Просто отказаться от экосистемы и перейти на светлую сторону — голая С/С++
ploop
22.09.2017 13:45Есть тут кстати матерые ардуинщики, может накидаете ссылок как перейти от скетчей к программированию на обычном Си для AVR?
Не надо никуда «переходить», надо просто взять контроллер, даташит на него и писать. Благо архитектура проста до ужаса, и во многих случаях ардуино только усложняет всё.
И с чего это си-шники стали матёрыми? Не так давно 8 кило «нетто» кода на ассемблере считалось нормальным… :)
MegaVaD
22.09.2017 14:06Достаточно посмотреть на готовые проекты. К примеру —
github.com/repetier/Repetier-Firmware/tree/master/src/ArduinoAVR/Repetier
Знатоки, поругайте, пожалуйста, если этот пример плохо отражает парадигму программирования ардуиноiig
22.09.2017 14:13void setup() { Printer::setup(); } void loop() { Commands::commandLoop(); }
Да. Оно.
А это хорошо или плохо?ViacheslavMezentsev
22.09.2017 14:19По ссылке очень хороший пример программирования на C/C++ для Arduino. Не так часто встретишь C++ код для мк avr такого объёма. Автор, судя по всему, не заморачивался оптимизацией, т.к. Arduino Framework формирует очень жирный код, в отличие от C-стиля в C++.
Когда надо просто, чтобы штуковина работала, Arduino с готовыми шаблонами/проектами очень подходит.
mkulesh
22.09.2017 15:13В рецепте этого пирога всего 4 простых ингридиента: контроллер в DIP корпусе на монтажной плате, ISP программатор, Atmel-Studio (сейчас, может, по-другому называется), и книга Евстифеева «Микроконтороллеры AVR». Одна из моих первых поделок была именно такой, хотя я тоже не удержался и очень быстро перешел на С++ для более чистого разделения драйверов и логики приложения: github.com/mkulesh/avrDigitalClock
AlNi89
22.09.2017 13:47-1Автор, не тратьте время и силы на споры, лучше напишите следующую статью. Нравится спорящим AVR, HAL — пусть используют, зачем их переубеждать? На ваш труд найдутся свои читатели, которые оценят и скажут спасибо, когда начнут гуглить уроки по STM32 и попадут сюда.
ViacheslavMezentsev
22.09.2017 14:00+1Буду ждать статей про: ОС, взаимодействие между процессами, драйвер sd-карты, парсинг xml/json, httpd, ajax, ftpd, telnetd (настоящий), modbus tcp/rtu, usb, драйвер rndis, загрузчик… и работы всего этого совместно. Писать самому это всё не надо, хотелось бы разбора чужого кода, запущенного на stm.
Многое из этого (и кое-что ещё) у меня работает на Arduino Mega2560 (я не использую Arduino Framework). Посты про мигание лампочками пока не дают повода перейти на stm.
ks0
22.09.2017 14:03Жду продолжения. Но в первую очередь ради комментариев, чтобы узнать что там в мире STM32 делается. Мои прошлые попытки ознакомиться с STM были неудачны. Для ногодрыга годится и AVR, тем более он легко пояется и плата под него делается в домашних условиях. А если уж выбирать «фаршированные» STM, то программировать их используя более высокий уровень абстракции, чем писать биты в регистры. А с этим у STM был содом и гоморра, по крайне мере до выхода CubeMX.
На этом фоне PSOC от Cypress смотрелись… Ну скажем так, непонятно че люди занимаются этими STM, когда ест PSOC, дружелюбные как ардуины и мощнее как STM. Да еще и в корпусах с шагом 0,8 мм.
Punk_Joker
22.09.2017 14:08Интересная тенденция. Как сравнивать возможности самих чипов, так AVR и STM. А как сравнивать программирование их, так Arduino и HAL. Или с появлением Arduino думается, что программировать их как простые AVR не представляется возможным? Или же, STM32 нельзя программировать как Arduino, или для STM есть например MBED, что есть по сути своей Arduino для STM32
P.S. Хотя вижу подобное замечание, выше уже было высказано.
ionicman
22.09.2017 17:37+5Нам надо поморгать лампочкой!
Нет проблем, берем Intel Atom и ...
Пуля пробила говорившему голову насквозь, и рекошетом угодила в его поделие, вырвав сноп искр и заставив доселе мигающую лампочку потухнуть навеки...
Вот оно, новое поколение, которое собирает из конструктора не зная ни то как он работает, ни то, когда какой кубик применять и стреляет из гаубицы по воробьям… Еще и преподаватель, надеюсь Вы про это преподавать не будете. Так как преподавать то, в чем Вы абсолютно не разбираетесь — это вводить в заблуждение тех, кому Вы преподаете, а хуже этого греха для преподавателя точно нет.
Во-первых Arduino — эта платформа с IDE, экосистемой и кучей разжованных мелочей и библиотек, однако она не навязывает их использования вообще никак. Вы можете взять и начать писать с нуля на Си (или ASM) без каких-либо дополнительных инструментов.
Главное, что она дает — быстрое программирование без программатора (через USB) и ворох примеров.
Никто не запрещает переписать loader и зашить все что угодно свое. При этом можно даже пользоваться AVR Studio, а не Arduino IDE.
Фишка лишь в том, что огромная популярность из-за невыского порога старта стала пречиной огромного количества библиотек, инструментов и информации по тому как что и как лучше сделать для данных процессоров.
Куча сред разработки (CodeVision, AVR Studio, Arduino IDE — самые известные), куча программаторов и средств отладки — что еще Вам нужно?
Мало того, что клонов Arduino на али кучи за копейки — если хотите получить полный контроль над однокристаллкой — там куча плат такого рода (тыц) с ATMEGA328 на борту за 1.85$ и USB ISP программаторов к почти всей линейки ATMEGA (тыц) за 2$, купив который можно программировать как эти платки так и тиньки и всякое другое.
И все — Вы получаете готовый кит, на котором можно построить очень многое.
Вот так вот легко на Arduino без Arduino.
Для вашей-же задачи за глаза хватило бы ATTINY13A, причем из-за ее режима энергосбережения она бы у Вас от одной батарейки жила бы годами. Написалось бы все это за пару часов, если знать и за сутки — если не знать и за 15 минут, если использовать стандартный скетч, коих просто дохрена — шутка такая ходит, что Arduino — это платформа для мигания светодиодами :D
STM — отличный процессор, но он для сложных задач и систем, у него есть офигенные плюшки в виде DMA, например, возможность писать многопоточку и т.д.
Но у него гораздо сложнее периферия, плохо с документацией (и есть куча неявных особенностей), гораздо меньшее коммьюнити и как следствие — гораздо меньше информации и примеров.
И браться за него надо тогда, когда четко понимаешь для чего и почему именно он нужен.
Мало того, Вы и для него использовали здоровенный оверхэд, нафиг не нужный, ну да ладно…
Использовать его для такой задачи — это ужасно. Учить других его использовать так — ужасно в квадрате.iig
22.09.2017 17:58+1Если копать дальше, то и ATTINY для мигания лампочкой — оверинжигиринг ;)
ionicman
22.09.2017 18:09+1Это была гипербола, что, я надеюсь, вполне понятно ;)
Баланс проходит между сложностью конструкции, затратами на нее и необходимой задачей, которую она должна выполнять.ploop
22.09.2017 19:36Это была гипербола, что, я надеюсь, вполне понятно ;)
Да нифига не понятно. Цель автора — раскурить STM, а задача тут так, побоку. Так что вместо него вполне мог бы быть и Intel Atom.ionicman
22.09.2017 22:22+1Но сделав вывод, что я не узнаю, что творится внутри микроконтроллера за рамками Arduino-скетчей я решил поискать более интересный вариант, который подразумевал глубокое изучение и погружение в дебри микроконтроллерной техники.
В компании, в которой я работаю, имеется отдел разработки, и я решил обратиться к инженерам… меня решительно отговорили от изучения Arduino...
Как-бы нет. Автор не разобрался в одном, сделал неправильные выводы, пришел к профи, которые конечно-же сказали что Ардуино для лохов и дали ему навороченный девайс, с которым, кстати он тоже не разобрался. Даже с IDE.
Так что увы и ах. Если бы он написал сразу, что решил изучить STM — другое дело.ploop
22.09.2017 23:19Если так — да. Но этот момент пусть лучше он сам пояснит.
Хотя, с другой стороны, это его право. А материала для начинающих пусть будет чем больше, тем лучше.
К первому комменту: И браться за него надо тогда, когда четко понимаешь для чего и почему именно он нужен
Тогда вообще за него можно не взяться. Многие даже не представляют, какие финты можно творить на банальной 8й меге. У меня вот несколько лет лежит STM32F4-Discovery, так этого монстра я даже не могу вообразить, куда пристроить. Хорошо то, что в нём есть практически всё, что есть в более простых моделях, и из-за хорошей совместимости линейки на нём можно отлаживать код и заливать в другие контролеры. Сложных проектов не делал, но на простых удобно получается.MegaVaD
22.09.2017 23:48люди из f4-disco делают вот что, к примеру :)
www.youtube.com/watch?v=3-M-s6O-YW8
(по ссылке видео с синтезатором Goom (перевёрнутое Moog))
Описание
www.quinapalus.com/goom.html
megalloid Автор
23.09.2017 14:02Именно об этом и написано «Почему не AVR/Arduino?»
Как же любят люди интерпретировать то что написано не вникая в суть изложенного. Там речь шла о МОИХ мотивациях на момент выбора МК. Хотите решать свои задачи на Arduino — вперед, я никого тут не призываю изучать STM в обход Arduino.
stifff
22.09.2017 23:39+1зато у STM всё намного лучше с дебагом.
и у STM есть Nucleo64, которое хорошо шилды ардуины принимает на себя
holomen
23.09.2017 00:34STM — отличный процессор, но он для сложных задач и систем, у него есть офигенные плюшки в виде DMA, например, возможность писать многопоточку и т.д.
Но у него гораздо сложнее периферия, плохо с документацией (и есть куча неявных особенностей), гораздо меньшее коммьюнити и как следствие — гораздо меньше информации и примеров.
Попробуйте не читать форумы и смотреть прочие обучалки на ютубиках, а все таки откройте для себя документацию производителя. Да-да! Те самые многостраничные RMxxxx, UMxxxx и прочие. Откроете для себя много нового, в том числе и новые возможности периферии…
mkulesh
23.09.2017 13:50+1Присоединяюсь. Это лучшее сравнение Arduino и STM32, что я видел. Лаконично, в точку, и по делу.
megalloid Автор
23.09.2017 13:59Как обычно не разобравшись и не поняв почему Я выбрал именно STM в обход AVR — вы перевернули с ног на голову. Я пишу не для тех кто начинает с нуля а для тех кто желает разобраться с STM, и описывал аргументацию обхода AVR для себя не призывая никого делать то же самое. Перечитайте пожалуйста абзац с заголовком «Почему не AVR/Arduino?».
SamaRazor
23.09.2017 17:03Дело в том, что на том же алиэкспрессе stm32f103c8t6 стоит те же два бакса. А когда втянешься и разберешься, понимаешь что кучу вещей дополнительных можно сделать из-за дополнительной периферии и мощности.
Koyanisqatsi
25.09.2017 11:22Представьте себе молодого специалиста, который кроме работы с STM32 пока ничего не изучил. Его взяли на работу и дали задание сделать простенькое устройство, для реализации которого достаточно и Atmega16. Но он берет что-то из серии STM32F030, который вам, например, покажется избыточным. Однако, устройство сделано, выполняет свои функции и не проигрывает в себестоимости, при этом этот молодой специалист не потратил 2-3 недели на изучение новой для себя, но несколько устаревшей для всего остального мира, технологии. В чем тогда состоит смысл использовать эту самую Atmega16? В чем экономия? Если Intel Atom будет стоить 50 рублей, то пусть и его использует.
Alexey2005
23.09.2017 18:44+1Вот что больше всего раздражает в американских компаниях, так это их иррациональная жадность до персональных данных, граничащая с упоротостью. Просто так под STM32 с официального сайта можно скачать разве только мануалы, и то не все. Всё остальное — только после регистрации, во время которой с вас запросят столько персональных данных, словно вы к ним по меньшей мере на работу устраиваетесь.
Место работы, полный домашний адрес, контактный телефон — и это ещё только разминка. Я, пока это заполнял, всё ждал, что от меня сейчас потребуют NDA подписать…
Причём некоторые вопросы в той анкете сформулированы так, что просто вгоняют в ступор — вот совершенно непонятно, что туда вообще вписывать.imperror
25.09.2017 12:54Вы не правы. На st.com можно скачать файлы указав только свой мейл и вымышленные имена, на почту придет ссылка на скачиваемый файл.
imperror
25.09.2017 13:04Автор, а почему вы используете платный Keil и не используете отличную связку Cube, Visual Studio Code и arm-gcc? Куб генерирует (помимо инициализации чипа) мэйк файл, Студия — отличный редактор с подсветкой синтаксиса, переходом по прототипам функций и неплохой отладкой через arm-none-eabi-gdb, встроенный терминал и еще кучу плюшек.
megalloid Автор
25.09.2017 14:03Думаю что очень большую роль сыграла популярность данной IDE, количество уроков по настройке и подготовке к работе, юзер френдли GUI. Там такой же дебагер как в Keil? Где можно получить побольше инфы чтобы можно было ознакомиться с вашим вариантом?
imperror
25.09.2017 16:11Code не IDE, это продвинутый редактор с кучей возможностей.
Нужно поставить Cube скачав его у ST, установить Code, поставить из его онлайн репозитория расширения: C/C++, C++ Intellisense, Native Debug. Установить arm-none-eabi-gcc.Сгенерировать с Cube свой проект, в настройках выбрать — генерировать make-файл. В Code открыть папку с проектом. Подправить маке-файл под свои пути (не сложно). Секции C_INCLUDES (если надо), C_SOURCES (если надо), BINPATH -путь до arm-none-eabi-.
По настройкам дебагера можно глянуть: mcu.goodboard.ru/viewtopic.php?id=7
electronix.ru/forum/index.php?showtopic=139502&pid=1479913&st=0entry1479913
github.com/WebFreak001/code-debug
www.youknowwhatreallygrindsmygears.com/index.php/2016/06/18/arm-gdb-debugging-with-visual-studio-code
Все очень легко, достаточно 1 раз разобраться что к чему. Работает быстро, компилировать можно make прямо во встроенном терминале, работает одинаково во всех ОС. У меня в убунте и макоси.ploop
25.09.2017 21:28Я даже саблайм прикручивал в своё время (во, картинки от давности похерились). С дебагом.
Hellsy22
Сравнение цен на сами МК забавно, но взяли-то вы не голые чипы, а STM32F0-Discovery, который стоит 10-14$. Тогда уж сравнивайте его с Arduino Mega 2560 или ESP32S/NodeMCU — характеристики последнего вообще камня на камне не оставляют от STM32.
megalloid Автор
Для своего проекта я буду использовать голые МК, а учиться будем на Discovery!)
megalloid Автор
STM32F0-Discovery у местных поставщиков (promelec.ru), равно как и из Китая стоит 17.5$.
Arduino Mega 2560 у них же 80$
ESP32S/NodeMCU из Китая 14.5$ + время доставки (которое тоже =деньги).
Да и речь идёт о том, почему именно Я отказался от решений на Arduino и подобных платах, и привел аргументы которые были убедительны исключительно для меня: поэтому мои утверждения нельзя считать объективно истинными для каждого.
Ну и использование ESP32 и Arduino не даёт новичкам такой возможности сформировать фундаментальные навыки и опыт разработки под МК в отличии от хорошо документированного STM32.
О гибкости решения на Arduino можно и не заикаться.
О надежности и отказоустойчивости ESP рассуждать не буду. О энергоэфективности решения на Wi-Fi относительно простых радиомодулей суб-гигагерцового диапазона тем более.
Hellsy22
Отличная шутка.
Я заинтригован.
megalloid Автор
К слову, я по образованию педагог. Может из моего курса что-нибудь и получится, что будет взято за основу в качестве учебных материалов по МК. Под фундаментальностью я подразумевал плотную закладку базиса в освещаемом вопросе.
Всё относительно, если вы ставите моё утверждение под сомнение.
Дальше функций из библиотек не уползёшь.
Ghost_nsk
Чой-то? Никто не запрещает все писать самому.
megalloid Автор
Мне это не показалось удобным. Архитектура проекта, навигация по нему в ArduinoIDE — невозможна.
При попытке перенести работу в AVR Studio столкнулся, на момент знакомства, с неописуемым количеством костылей.
А вот надстройка над Visual Studio для Arduino показалась мне достаточно удобной для работы. Но это решение я нашел уже тогда, когда во всю уже работал с STM.
На текущий момент с помощью Visual Studio + Arduino проверяю на общую работоспособность датчики, модули и др.
Да и опять же напомню про общие предпосылки — мне хотелось начать свое изучение МК именно с STM.
da-nie
Так возьмите WinAVR. Никаких костылей. Обычный Си. Встроенный ассемблер. Простые команды асма и абсолютная предсказуемость их времени выполнения (1-2 такта обычно).
Посмотрите размер *.h в CMSIS. :) Мегабайт у stm32f407! Это не самый простой процессор для мигания светодиодом. А ещё есть ST-Periphery (не помню, как пишется). А ещё есть HAL. И всё это сваливается в кашу — друг с другом не стыкуется.
Отдельной строкой идёт Keil. Может, я чего не понимаю, но обычно среда разработки должна предлагать включать в проект библиотеки без их компиляции (файлы lib должны быть — и подключаться к проекту либо ручками, либо для стандартных библиотек lib должны лежать в стандартных папках. А у STM библиотеки в *c-файлах — компилируются вместе с программой (при этом в файлах проекта они не отображаются)). А где ищет библиотеку Keil — загадка природы. Если я ставлю пакеты разных версий, они все там свалены в разных каталогах. И что при подключении компилирует Keil я до сих пор в неведении.
Я тут USB-Host для тепловизора запускал на STM32F407 с помощью CubeMX (а без него вообще не понятно, что делать — примеры из инета не компилируются, так как используют совершенно разные библиотеки, которые ещё как-то надо к проекту прицепить (а после прицепления — откомпилировать)). Так вот, документации как это правильно делать фиг найдёшь.
ploop
При чём тут тогда Arduino?
megalloid Автор
Не понятно))) Парадигма Arduino построена на использовании готовых библиотек и отчасти кода из семплов с последующей переадаптацией
ploop
В том-то и дело, Arduino — просто огромный фреймворк, который либо используем, либо делаем всё сами. В последнем случае всё это превращается в обычное программирование под AVR8, которое, кстати, тоже довольно увлекательно.
holomen
Возьмите от ардуины только железную часть. Т.е. экстремально дешевые готовые для втыкания в бредборду платы от наших азиатских друзей. А программную часть… Выбросить и забыть. Взять AtmelStudio (которая есть удобнейшая Visual Studio) и пишите на правоверной и удобной сишечке без всех этих ужасных digitalOutput и прочих макросов поверх коллбеком обернутых в макросы.
И нет. Не подумайте что я защищаю ардуину и/или протестую против стм.
Просто каждому инструменту свое место. И чем шире ваш опыт в инструменте как разработчика — тем больше вам цена.
А т.к. вы позиционируете себя как преподавателя — тем больше к вам требования в плане обширности кругозора.
vassav
Хочу добавить еще один + в пользу STM.
Сам начинал с AVR и именно голых чипов — так пока разбирался с их фьюзами пару чипов залочил.
С STM же никаких проблем, залочить нереально, убить чип — тоже нужно постараться.
Ghost_nsk
Вы наверное изолентой только провода изолируете?
mitgard
Лучшая закладка, чем ссылка на страницу DiHALT я не знаю.
mitgard
не там отобразился, речь про «закладку базиса»
megalloid Автор
Согласен. DiHALT очень хороший базис даёт. Просто о сложном — это про него.
Hellsy22
А я — профессиональный программист и потому отношусь к рассуждениям о базисах весьма скептически. Ниже в комментариях shell4692 рассказывает про многопоточные задачи. Это действительно интересная тема и в ней наверняка есть некоторые нюансы, которые следуют непосредственно из железа. А для мигания светодиодом (или IR/RF передатчиком) никакие базисы не нужны, это тривиальные задачи.
Разве что в том смысле, что уже существуют тысячи библиотек и есть библиотека (а то и несколько) для практически любой железки или протокола. Но в целом, не вижу никаких проблем с написанием своих библиотек.
megalloid Автор
До проф. программистов мне явно далеко, и пока я возможно кому-то помогу понять базовые стартовые вещи поняв которые человек уже сможет отправиться в обучение самостоятельно. Я, к примеру, когда только взял в руки Discovery понятия не имел как ее запрограммировать и как поморгать светодиодами — мои статьи скорее для зеленых новичков нежели для проф. программистов. Нужно понимать на какую аудиторию нацелены мои материалы.
SolarW
«ESP32S/NodeMCU из Китая 14.5$» — где вы такие цены находите?
Неделю-две назад заказал на BangGood ESP32 DevBoard за 4.07$ (это была акционная цена, сейчас 6.79$ стоит)
megalloid Автор
Судил по первой ссылке из поисковика: ru.aliexpress.com/item/Nodemcu-ESP-32S-ESP32-Development-Board-For-Arduino-IDE-Wireless-Wifi-Bluetooth-Micro-USB-Shield-Module/32802435488.html
Исследований ESP-рынка не проводил)
SolarW
Ну тогда для комплекта давайте такую ссылочку оставим тут:
Geekcreit® ESP32 Development Board WiFi+Bluetooth Ultra-Low Power Consumption Dual Cores ESP-32 ESP-32S Board banggood.app.link/F7X2zBdMDG