Комментарии 203
Arduino Mega 2560 у них же 80$
ESP32S/NodeMCU из Китая 14.5$ + время доставки (которое тоже =деньги).
Да и речь идёт о том, почему именно Я отказался от решений на Arduino и подобных платах, и привел аргументы которые были убедительны исключительно для меня: поэтому мои утверждения нельзя считать объективно истинными для каждого.
Ну и использование ESP32 и Arduino не даёт новичкам такой возможности сформировать фундаментальные навыки и опыт разработки под МК в отличии от хорошо документированного STM32.
О гибкости решения на Arduino можно и не заикаться.
О надежности и отказоустойчивости ESP рассуждать не буду. О энергоэфективности решения на Wi-Fi относительно простых радиомодулей суб-гигагерцового диапазона тем более.
сформировать фундаментальные навыки и опыт разработки под МКИ конечно же вы можете дать ссылку на учебник под вашей редакцией, на котором выросли целые поколения студентов, позже устроившихся на профильную работу связанную с МК?
от хорошо документированного STM32Отличная шутка.
О гибкости решения на Arduino можно и не заикаться.Я заинтригован.
И конечно же вы можете дать ссылку на учебник под вашей редакцией, на котором выросли целые поколения студентов, позже устроившихся на профильную работу связанную с МК?
К слову, я по образованию педагог. Может из моего курса что-нибудь и получится, что будет взято за основу в качестве учебных материалов по МК. Под фундаментальностью я подразумевал плотную закладку базиса в освещаемом вопросе.
Отличная шутка.
Всё относительно, если вы ставите моё утверждение под сомнение.
Я заинтригован.
Дальше функций из библиотек не уползёшь.
Дальше функций из библиотек не уползёшь.
Чой-то? Никто не запрещает все писать самому.
При попытке перенести работу в AVR Studio столкнулся, на момент знакомства, с неописуемым количеством костылей.
А вот надстройка над Visual Studio для Arduino показалась мне достаточно удобной для работы. Но это решение я нашел уже тогда, когда во всю уже работал с STM.
На текущий момент с помощью Visual Studio + Arduino проверяю на общую работоспособность датчики, модули и др.
Да и опять же напомню про общие предпосылки — мне хотелось начать свое изучение МК именно с STM.
При попытке перенести работу в AVR Studio столкнулся, на момент знакомства, с неописуемым количеством костылей.
Так возьмите WinAVR. Никаких костылей. Обычный Си. Встроенный ассемблер. Простые команды асма и абсолютная предсказуемость их времени выполнения (1-2 такта обычно).
мне хотелось начать свое изучение МК именно с STM.
Посмотрите размер *.h в CMSIS. :) Мегабайт у stm32f407! Это не самый простой процессор для мигания светодиодом. А ещё есть ST-Periphery (не помню, как пишется). А ещё есть HAL. И всё это сваливается в кашу — друг с другом не стыкуется.
Отдельной строкой идёт Keil. Может, я чего не понимаю, но обычно среда разработки должна предлагать включать в проект библиотеки без их компиляции (файлы lib должны быть — и подключаться к проекту либо ручками, либо для стандартных библиотек lib должны лежать в стандартных папках. А у STM библиотеки в *c-файлах — компилируются вместе с программой (при этом в файлах проекта они не отображаются)). А где ищет библиотеку Keil — загадка природы. Если я ставлю пакеты разных версий, они все там свалены в разных каталогах. И что при подключении компилирует Keil я до сих пор в неведении.
от хорошо документированного STM32
Я тут USB-Host для тепловизора запускал на STM32F407 с помощью CubeMX (а без него вообще не понятно, что делать — примеры из инета не компилируются, так как используют совершенно разные библиотеки, которые ещё как-то надо к проекту прицепить (а после прицепления — откомпилировать)). Так вот, документации как это правильно делать фиг найдёшь.
Никто не запрещает все писать самому.
При чём тут тогда Arduino?
И нет. Не подумайте что я защищаю ардуину и/или протестую против стм.
Просто каждому инструменту свое место. И чем шире ваш опыт в инструменте как разработчика — тем больше вам цена.
А т.к. вы позиционируете себя как преподавателя — тем больше к вам требования в плане обширности кругозора.
Сам начинал с AVR и именно голых чипов — так пока разбирался с их фьюзами пару чипов залочил.
С STM же никаких проблем, залочить нереально, убить чип — тоже нужно постараться.
Под фундаментальностью я подразумевал плотную закладку базиса в освещаемом вопросе.
А я — профессиональный программист и потому отношусь к рассуждениям о базисах весьма скептически. Ниже в комментариях shell4692 рассказывает про многопоточные задачи. Это действительно интересная тема и в ней наверняка есть некоторые нюансы, которые следуют непосредственно из железа. А для мигания светодиодом (или IR/RF передатчиком) никакие базисы не нужны, это тривиальные задачи.
Дальше функций из библиотек не уползёшь.
Разве что в том смысле, что уже существуют тысячи библиотек и есть библиотека (а то и несколько) для практически любой железки или протокола. Но в целом, не вижу никаких проблем с написанием своих библиотек.
Неделю-две назад заказал на BangGood ESP32 DevBoard за 4.07$ (это была акционная цена, сейчас 6.79$ стоит)
Исследований ESP-рынка не проводил)
Geekcreit® ESP32 Development Board WiFi+Bluetooth Ultra-Low Power Consumption Dual Cores ESP-32 ESP-32S Board banggood.app.link/F7X2zBdMDG
Мне например сложно представить зачем нужны пять таймеров. Для просыпаться и что то делать достаточно одного, ну пусть нужен ШИМ, под него ещё один, итого, для 90% задач достаточно 2 таймера. Более точный АЦП тоже нужен редко. Под 5 вольт проще и дешевле найти обвязку (хотя это спорно). У 328 большое количество вариантов корпусов, от DIP (проще макетировать) до BGA (меньше места), у stm только LQFP/SSOP что для начинающих большая трудность. Ну и наконец, флеша одинаково, но один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд.
Ничего против stm32 не имею, просто не понятны критерии выбора, и мне кажется что это важный момент для начинающих, ведь это статья для них.
Насчёт DIP — полностью согласен, жаль что ST не потрудились сделать такой корпус для начинающих.
Когда я начинал, у меня плату для LQFP с помощью принтера и утюга с первого раза получилось изготовить. А это главная сложность. Пайка вообще проблем не представляет. А для макеток есть дешёвые отладочные платы с минимальной обвязкой. У них проблем с макетками нет, и даже удобнее получается.
На мой взгляд реальный минус тут не в макетировании, а в том, что если самому плату проектировать, то у LQFP между ногами дорожку не протащишь, что сильно усложняет трассировку дорожек с питанием и землёй (которых нужно четыре пары). Особенно на односторонней плате. Можно, конечно, делать Gerber и заказывать платы, но для меня это хобби. А что это за хобби, когда его за тебя кто-то другой делает? :)
Это интересно. А как там к выводам подпаиваться в домашних условиях? Фен и паяльная паста? И где берёте STM32 в таком корпусе? На Aliexpress сходу не нашёл.
Последовательность проста:
1. Залуживаем после вытравки дорожки
2. Наносим флюс
3. Позиционируем МК
4. Нагреваем феном удерживая МК пинцетом
5. Ждём пока усядется МК.
6. Чистим плату от флюса, проверяем пропайку через микроскоп.
7. Допаиваем ноги острым жалом, если где-то есть подозрения на непропай.
Закупки все осуществляю у местного (г.Екатеринбург) поставщика, в Промэлектронике.
Если интересно — загуглите STM32F051K8U6, на Али они тоже есть в продаже. Ценник особо не отличается от «Промки», мне лично время дороже, не люблю ждать. Либо обычно заказываю заранее.
один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд
Прямо скажем, такой подсчёт некорректен; более того — лукав. 1) В ядре AVR регистры данных 8-битные; но слова программы 16-битные. 2) Ядро CortexM0 в STM32 использует 16-разрядный набор инструкций Thumb.
один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд
Прямо скажем, такой подсчёт некорректен; более того — лукав. 1) В ядре AVR регистры данных 8-битные; но слова программы 16-битные. 2) Ядро CortexM0 в STM32 использует 16-разрядный набор инструкций Thumb.
Я, признаться, довольно часто использую связку стм+авр причем даже нередко в виде +ардуина(как железка-плата, а не фремворк) именно по этой причине — когда требуется именно прецизионный ногодрыг когда нужно высчитать все задержки с точностью до такта. А стм это не всегда позволяет — см RMxxxx
Да это даже не из пушки по воробьям, это атомной бомбой по комару.
А если не для этого, то напишите для чего. В какой реальной вашей задаче оно покажет преимущество перед *Дуинами несмотря на заметно более высокую сложность и цену?
Ну и попутно ставилась цель научиться. Понимание того, что знания по теме достаточно фрагментированы — я решил поделиться своим опытом и наработками с начинающими, т.е. ровно тем, чего мне не хватало когда я сам начинал учиться.
Это дает огромное преимущество — можно просто выдернуть из розетки центральный контроллер, но свет в туалете/ванной буде включаться.
Домашние это оценят особенно высоко.
На самом деле я тоже думал тянуть от каждой розетки/выключателя отдельно, но получается слишком затратно/геморно. К примеру, есть блок розеток 4-6 штук, уже жгут силовых проводов, что их непросто проложить, а в комнате таких блоков может быть 2-3, это пучок в руку толщиной.
Пришел к выводу протянуть к каждому такому блоку/розетке сигнальный провод, оставить место под управляющую плату, и подключить всё по старинке.
На счёт розеток: в идеале видеть нагрузку на каждую из них и рулить соответственно. Банальный пример — воткнули в один блок ноут на зарядку и утюг, и ушли из дома. Как погасить одно, не трогая другое?
Ещё выбор витухи вызван тем, что может понадобиться розетка для LAN, при этом можно задействовать 2 пары на своё усмотрение. То есть растянуть их везде во время ремонта, а потом делать/не делать по мере появления желания.
Образ системы — для того чтобы быстро восстановить работоспособность в случае глобальных и серьезных проблем, даже если нет ничего ценного восстановить из бэкапа всегда быстрее чем переустанавливать систему с нуля и ставить весь нужный софт. Пару раз эта функция пригодилась.
Бесконечный инкрементальный бэкап плох тем что при повреждении где-то в середине цепочки весь «хвост» становится протухшим. Поэтому инкрементальный бэкап захватывает максимум две последние недели. И копии всех бэкапов храняться как локально так и на NAS-е. Вот этот перенос копии бэкапов на NAS и занимает существенное время.
Фотографии тоже надо бэкапить как особо ценные файлы которые не с чего восстановить. А их накопилось пожалуй даже больше чем образ системы.
А несколько фоток + домашние проекты заливаются в облако по мере их появления, и всё.
Но в общем по поводу домашних проектов согласен.
Облака это пока ещё ненадёжная игрушка. Заблочат аккаунт по каким-то своим соображениям и прощай данные, к тому же где взять бесплатно 50-100-200Гб места в облаке? Пожалуй, съёмный винт(даже два винта) в перспективе и меньше рисков и дешевле обойдётся. А облако… разве что для оперативного бэкапа и синхронизации между несколькими локациями. На надёжное хранилище бесценных данных оно не катит, только как очень временное или дополнительное.
А так чтобы смешивать… очень редко когда пригодится.
Так что витуха скорее всего именно под ЛАН.
Материал для новичков на эти чипы в основном напоминает майкросовтовские курсы. Нифига никто ничего не объясняет, просто дают методичку для достижения конкретной цели. Если Ваша цель отличается — фигово быть вами. Без фундаментальных знаний можно только быдлокодить.
Обратите внимание на библиотеку HAL — это куча всякой полезности для микроконтроллера, инициализаторы всего и вся… не, не смогу кратко описать всю ее полезность (вот щас некоторые начнут рассказывать что всё должно быть без библиотек… а то развели..)
Другая тема — CubeMX. Тоже на сайте производителя можно найти, программка для конфигурирования камня. Там например в настройках частоты такой бардак, что сами микроэлектроники за голову хватаются, вот и сделали программку. Частота процессора одна, шин другая, периферии третья… и это далеко не все… Ну плюс настройка ввода вывода, интерфейсов и многого другого тоже там есть.
CubeMX смотрю, как правило, только для того чтобы сформировать значения по тактированию, возможно глазком заглянуть в генерацию таймингов. Но генерируемый им код считаю не юзабельным. Глубоко не копнешь, всё разбросано по куче файлов в проекте. Словом возмутительный бардак.
От использования HAL и CubeMX напрямую я отказался.
Со своей формой библиотек я так же ознакомлю в последующих материалах.
и серьезно упрощает жизнь, если проект не слишком заморочен.
то в таком юзкейсе ардуина — божья роса.
Кстати, использование CMSIS для новичков, это довольно сложный способ вхождения в тему. Есть гораздо более простые вещи, например, библиотека Peripheral Library, которая является надстройкой над CMSIS и предлагает простые и удобные функции работы с очень запутанной периферией контроллера, без надобности (на первом этапе) вникать в структуры периферийных регистров и карты их полей. Ну, или более современный вариант, вроде CubeMX.
На мой взгляд, самым «вкусным» контроллером 30й серии stm является ИМХО stm32f030f4p6. Имея встроенный генератор на 8МГц, который раскачивается ФАПЧем до 48МГц и корпус TQFP20, он очень красиво становится на адаптер TQFP->DIP и занимает всего лишь пару квадратных сантиметров на бредборде. На него запросто можно уместить 10-15 поточное приложение, которое будет иметь некую структуру драйверов и сервисов.
2. Использование CMSIS было использовано с целью максимально быстро организовать сборку проекта для того, чтобы увидеть вожделенное моргание светодиодами. А приучать себя заранее работать с битовыми операциями, картами регистров, изучая работу низкоуровневой части, если это подано в доступной и понятной форме, ничего сложного не вижу. Сам именно с этого начинал. Разбирался и прокачивал скилл с нуля. Смог. Справился.
Это позволяет делать на нём многопоточные приложения, чего AVR8 лишён в принципе (я имею ввиду mega328p/mega16/mega32 и вообще AVR ядрёные версии). Для однопоточной задачки вполне себе подошёл бы и Ардуино, ничего такого ужасного в нём нет.
scmRTOS — считается? Я запускал её и использовал на Arduino (в одном из журналов Хакер есть статья как это сделать). Нормально вроде работает, процессы переключает.
Целевой девайс будет полностью кастомным на отдельном МК. А центральный контроллер будет на ARM Cortex-A53.
Имхо, ядро вашей системы должно быть на одноплатнике. Проще и удобнее решение.
Там уже предстоит командная разработка. С вами не поспоришь.
Невозможно быть экспертом-профессионалом во всех областях IT.
Вы же не будете писать свою ОС под RPi3.
2. Центральный контроллер на RPi3 + LoRa.
1. ESP8266 — глючил, не оживал после резкой перезагрузки. Прожорлив по питанию. В целом не очень решение для организации низкопотребляющего автономного устройства.
2. RF-433 модули — примитивные, ASK-модуляция, никакого протокола и механизма обработки пакетов, полностью ручное управление.
3. NRF24L01+ — хорошие модули НО: криво работающая система адресации, ограничение на количество сетевых адресов в сети (7 по-моему). Бывает такое что одному модулю прилетает не предназначенный для него пакет, он шлёт ACK на передатчик и целевое устройство не получает то что должно было придти к нему.
4. SPIRIT1 — богатые по функционалу и возможностям устройства, но требуют разработки радиотракта (лежит за пределами моих текущих компетенций) и настройки согласования антенны. Готовые модули SPSGRF-XXX дорогие и имеют малый радиус покрытия даже с антенной.
5. LoRa — низкое потребление, большая дальность. Настраиваемые прерывания на ноги GPIO самого модуля, RSSI, пакетный конвейер, и много других фишек (которые к слову есть и в SPIRIT1). Предстоит еще обкатать чтобы сделать выводы об этом модуле. Ну и много хороших отзывов.
У NXP есть очень интересная серия — KW41Z (с Bluetooth и без него), у Atmel — Mega RF, SAMR и множество других.
ESP8266 — глючил, не оживал после резкой перезагрузкиТипичная проблема неправильного питания. Такое часто случается если кто-то после дешевого стабилизатора не поставит нужный конденсатор для выравнивания ряби и/или не поставит достаточно емкий конденсатор для сглаживания скачка питания, возникающего при включении радиомодуля. Если все сделать по даташиту (я знаю, это кажется нелепым, но все же), то ESP работает без малейших проблем и сбоев.
Я мало знаю людей, которые одновременно могут это делать еще и разрабатывать ПО.
Зайдите на любой радиолюбительский форум. Таких людей масса, но они больше ориентированы на низкоуровневое программирование, «ближе к железу».
В свете данного комментария я могу сказать что я стал очень необычным новичком. И своими статьями хочу снизить порог вхождения в кодинг МК на STM32, ну или сделать процесс вхождения более просты путём изложения накопленного мною опыта.
Вот и не слушайте никого, пишите.
Сам в свое время к STM32 присматривался, но так скажем эко-среда — не впечатлила.
Я считаю что чем больше будет доступным языком написано про STM32 — тем лучше. А у вас получается довольно неплохо.
вопрос с подвохом, на самом деле.
Смотря в каком направлении нужно шагать ;)
Цель моего материала — наиболее широкое освещение спектра базовых вопросов и изложение аккумулированного мною опыта. То есть создание такого материала, которого мне так не хватало на момент когда я начинал изучать STM32.
Спасибо Вам за добрые слова! Именно хорошие отзывы больше всего вдохновляют! =)
Но т.к. серия STM32F103 была пилотной серией 32-разрядных МК от ST — всё получилось по принципу «первый блин комом». И есть ряд различий по картам регистров и проблемы с совместимостью с текущим предложением в аналогичной линейке продуктов от ST.
Сам юзаю visual studio+visual micro и счастлив, хотя работать с широкой периферией задач не возникало.
P.S. С нетерпением жду от Вас статьи в которой будет расжевана работа с каналом DMA.
Спасибо за Ваш труд, он нужен нам.
По ссылке — ардуино, что не имеет никакого отношения к теме.
Я в этих STM32 не разбираюсь, но, чорт побери… Есть же usleep() (гуглится).
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;
}
И? Стандартная функция, существующая почти на любой платформе.
Если сравнить это
for (int i=0; i<500000; i++){} // Искусственная задержка
и это
usleep(500000)
, что более наглядно?
Мне надо было только сделать простейшую моргалку светодиодом при минимуме усилиий со стороны читающего статью. Вводить функции и прочее в мои планы не входило. Если нужны были бы задержки — я бы сделал их средствами периферии.
Я не преследовал цели сделать максимально красиво
при минимуме усилиий со стороны читающего статью
Эти 2 предложения конфликтуют, или мне показалось? ;)
Проехали, смысл helloworld от этого никак не страдает, и подобных мигалок светодиодом гуглятся десятки, и у всех в нутре for(). Хотя как-то странно, для демонстрации очень простого алгоритма на супер-пупер-мощном кристалле все делают helloworld в том самом Arduino-style, на который с таким пренебрежением кивают ;)
STM32CubeMX — лучший инструмент. Он генерирует код под ВСЮ переферию МК. Я лично перешел с PIC -> AVR-> STM32 только ради HAL и STM32CubeMX. А корпуса то какие удобные! Малеенькие даже на 48 ног.
Ни в коем случае не хочу обидеть автора, но меня несколько удивляет методология такого подхода. Автор берет 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.
2. Вы видимо не уловили из этой статьй информацию о том, что я собираюсь написать цикл статей по данному МК и его периферии.
3. Большая часть моих библиотек это переработанный и адаптированный HAL, с организацией под удобную мне форму. Это вы увидите когда я выложу первый проект.
4. Кто вам сказал что мне не интересен сам HAL? Мне не интересна та форма в котором её подаёт ST.
5. Насчёт переписывания — ее никто не переписывает/переделывает — я сменил форму не меняя содержания.
6. Когда упрёмся — тогда и поговорим о переходе. Пока в текущих рамках Keil более чем достаточно.
И еще про HAL. На мой взгляд, как функциональная библиотека он вполне уже работоспособен. Чего не хватает, так это удобной объектно-ориентированной библиотеки драйверов как самой переферии МК, так и внешних устройств. Я в этом направлении работаю: github.com/mkulesh/stm32DevelopmentBoards/tree/master/src/StmPlusPlus
Если Вы двигаетесь в похожем направлении, то мы могли бы скооперироваться.
Я планирую плавный переход с С на С++. Но пока что не достиг должно уровня компетенции в вопрос чтобы кооперироваться по вопросу. Спасибо за предложение.
Одно и тоже функционально приложение (USB девайс). Одно на SPL, второе на HAL.
12/28К соответственно
Что там было про размер?..
Откуда такие выводы? AVR можно наверно программировать и без использования скетчей, на чистом Си. Есть тут кстати матерые ардуинщики, может накидаете ссылок как перейти от скетчей к программированию на обычном Си для AVR?
Просто отказаться от экосистемы и перейти на светлую сторону — голая С/С++
Есть тут кстати матерые ардуинщики, может накидаете ссылок как перейти от скетчей к программированию на обычном Си для AVR?
Не надо никуда «переходить», надо просто взять контроллер, даташит на него и писать. Благо архитектура проста до ужаса, и во многих случаях ардуино только усложняет всё.
И с чего это си-шники стали матёрыми? Не так давно 8 кило «нетто» кода на ассемблере считалось нормальным… :)
void setup()
{
Printer::setup();
}
void loop()
{
Commands::commandLoop();
}
Да. Оно.
А это хорошо или плохо?
Когда надо просто, чтобы штуковина работала, Arduino с готовыми шаблонами/проектами очень подходит.
Я не матёрый, но накидаю: http://easyelectronics.ru/category/avr-uchebnyj-kurs/page/5
Читать снизу вверх
Многое из этого (и кое-что ещё) у меня работает на Arduino Mega2560 (я не использую Arduino Framework). Посты про мигание лампочками пока не дают повода перейти на stm.
На этом фоне PSOC от Cypress смотрелись… Ну скажем так, непонятно че люди занимаются этими STM, когда ест PSOC, дружелюбные как ардуины и мощнее как STM. Да еще и в корпусах с шагом 0,8 мм.
P.S. Хотя вижу подобное замечание, выше уже было высказано.
Нет проблем, берем 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, например, возможность писать многопоточку и т.д.
Но у него гораздо сложнее периферия, плохо с документацией (и есть куча неявных особенностей), гораздо меньшее коммьюнити и как следствие — гораздо меньше информации и примеров.
И браться за него надо тогда, когда четко понимаешь для чего и почему именно он нужен.
Мало того, Вы и для него использовали здоровенный оверхэд, нафиг не нужный, ну да ладно…
Использовать его для такой задачи — это ужасно. Учить других его использовать так — ужасно в квадрате.
Если копать дальше, то и ATTINY для мигания лампочкой — оверинжигиринг ;)
Баланс проходит между сложностью конструкции, затратами на нее и необходимой задачей, которую она должна выполнять.
Это была гипербола, что, я надеюсь, вполне понятно ;)
Да нифига не понятно. Цель автора — раскурить STM, а задача тут так, побоку. Так что вместо него вполне мог бы быть и Intel Atom.
Но сделав вывод, что я не узнаю, что творится внутри микроконтроллера за рамками Arduino-скетчей я решил поискать более интересный вариант, который подразумевал глубокое изучение и погружение в дебри микроконтроллерной техники.
В компании, в которой я работаю, имеется отдел разработки, и я решил обратиться к инженерам… меня решительно отговорили от изучения Arduino...
Как-бы нет. Автор не разобрался в одном, сделал неправильные выводы, пришел к профи, которые конечно-же сказали что Ардуино для лохов и дали ему навороченный девайс, с которым, кстати он тоже не разобрался. Даже с IDE.
Так что увы и ах. Если бы он написал сразу, что решил изучить STM — другое дело.
Хотя, с другой стороны, это его право. А материала для начинающих пусть будет чем больше, тем лучше.
К первому комменту: И браться за него надо тогда, когда четко понимаешь для чего и почему именно он нужен
Тогда вообще за него можно не взяться. Многие даже не представляют, какие финты можно творить на банальной 8й меге. У меня вот несколько лет лежит STM32F4-Discovery, так этого монстра я даже не могу вообразить, куда пристроить. Хорошо то, что в нём есть практически всё, что есть в более простых моделях, и из-за хорошей совместимости линейки на нём можно отлаживать код и заливать в другие контролеры. Сложных проектов не делал, но на простых удобно получается.
Как же любят люди интерпретировать то что написано не вникая в суть изложенного. Там речь шла о МОИХ мотивациях на момент выбора МК. Хотите решать свои задачи на Arduino — вперед, я никого тут не призываю изучать STM в обход Arduino.
и у STM есть Nucleo64, которое хорошо шилды ардуины принимает на себя
STM — отличный процессор, но он для сложных задач и систем, у него есть офигенные плюшки в виде DMA, например, возможность писать многопоточку и т.д.
Но у него гораздо сложнее периферия, плохо с документацией (и есть куча неявных особенностей), гораздо меньшее коммьюнити и как следствие — гораздо меньше информации и примеров.
Попробуйте не читать форумы и смотреть прочие обучалки на ютубиках, а все таки откройте для себя документацию производителя. Да-да! Те самые многостраничные RMxxxx, UMxxxx и прочие. Откроете для себя много нового, в том числе и новые возможности периферии…
Место работы, полный домашний адрес, контактный телефон — и это ещё только разминка. Я, пока это заполнял, всё ждал, что от меня сейчас потребуют NDA подписать…
Причём некоторые вопросы в той анкете сформулированы так, что просто вгоняют в ступор — вот совершенно непонятно, что туда вообще вписывать.
Нужно поставить 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 прямо во встроенном терминале, работает одинаково во всех ОС. У меня в убунте и макоси.
Тоесть без сторонних либ.
Только так можно понять, что там внутри происходит и как оно работает.
Кстати, использование такой функции-враппера добавляет оверхеад (Лишняя команда процессора.), неплохобы написать, как этого можно избежать.
Ps: Да, одна команда процессора (JMP если не ошибаюсь) — вроде мало, но если функция вызывается довольно часто — эта лишняя команда заметно просадит произвдительность.
Или я неправ?
Понимание того, как можно было бы сделать «в идеале» у каждого своё. Для меня «в идеале» получилось так, как это изложено в этой статье. Можно было без сторонних либ написать на голом ассемблере, но было бы это просто для начинающих? Тут в написании нужно соблюсти баланс доступности подаваемой информации и её полезности, что является достаточно сложной задачей перед автором, который хотел бы написать действительно полезный материал.
Я не ставил себе задачи рассмотреть в данной статье вопросы оптимизации. Я лишь хотел познакомить начинающего читателя с тем что такое регистр, как с ним работать, для чего они нужны через преломление на прикладную задачу. Не более того. Правда признаю что получилось немного сложно для новичка.
На мой взгляд, лучше было бы, чтобы Вы написали статью-конкурент по теме для сравнения)))
В идеале бы эту статью сократить до написания привычного digitalWrite(PIN_A, HIGH); с полной разверткой (В виде кода с коментариями и пояснениями) этой функции. Причем без HAL и прочего.
Зачем писать под STM32 в arduino-style?
У меня чуть другая плата, stm32f4, поэтому сразу видно, где в статье не хватило объяснений :)
Поскольку плата отличается, то просто копи-пастом ничего не получится, и надо разбираться что и почему, чтоб внести изменения. И это прекрасно. У меня светодиоды подключены к другому регистру, но благодаря вашему объяснению (в следующей статье :) все легко получилось.
Из того, что осталось за кадром:
В главном меню проекта настраиваем параметр Xtal в значение 8.0 MHz. Данный параметр отвечает за частоту работы кварцевого осциллятора нашего МК:
Почему именно 8? Этот параметр зависит от МК и его можно в datasheet узнать? Или его можно выбирать по своему желанию?
/ Заголовочный файл для нашего семейства микроконтроллеров/
include "stm32f0xx.h"
Как узнать название этого файла? Для моего МК вообщем можно угадать, что будет stm32f4xx.h или загуглить. А как вообще найти его? Или Keil может как-то подсказать?
Но, к счастью для большинства любительских задач хватает обычных кварцев с точностью 4-5 знаков а иногда и вовсе RC-генератора.
Почему именно 8? Этот параметр зависит от МК и его можно в datasheet узнать? Или его можно выбирать по своему желанию?
Я этот и многие другие вопросы касающиеся RCC планирую рассмотреть в статье про тактирование и внутреннее устройство МК)))
Если честно — хитрого способа я не знаю, обычно мне хватало возможности заглянуть в файловый состав библиотеки HAL или StdPeriph. И там сразу в дереве находятся соответствующие семейству МК файлы и их имена.
С устройствами Ардуино я знаком, и очень часто использую для быстрой проверки различных модулей и устройств. Считаю, что именно в этом их основное преимущество — быстрое макетирование и реализация устройств. Но моя цель, на момент написания статьи, состояла не в этом)
К тому же, я не говорил ни слова про микроконтроллеры AVR. Я не стал в них погружаться потому, что при равной стоимости STM32 и ATMega мы получаем несколько разные показатели производительности. Для меня изучение ARM-овских микроконтроллеров выглядит гораздо более перспективным и интересным занятием, чем умирающих (ИМХО) 8-битных. Хоть для них и больше примеров, «лучше» документация и т.д.
Плюсом к этому, как я уже сказал в начале статьи, объясняя свои мотивации — у меня много коллег и товарищей которые кодят именно под STM32, т.е. тут сыграл так же социально-бытовой фактор.
И вот когда 8-ми(16-ти) битных перестаёт хватать — а это уже начинается с ввода/вывода звука, работа с внешней SD-картой памяти, с сетью и т.п. тогда есть смысл рассматривать применение STM32.
Я конечно тоже хочу их изучить, но где взять на это время при отсутствии насущной необходимости их применения? Если никто не подскажет, будешь долго искать где же взять полную документацию на конкретный контроллер который у тебя на руках — это надо знать на каком он ядре, найти даташит на ядро, даташит на периферию(семейства контроллеров?) и общий даташит конкретно на контроллер в который это всё упаковано и где указано какая периферия актуальна для конкретной модели.
Второй вопрос — IDE для компилятора и выбор языка… тоже поле непаханое, пробовать всё подряд — времени не напасёшься.
Плата под контроллер уже как минимум двухслойная нужна, на одном слое очень неудобно разводить питание.
«Чем больше трудностей — тем лучше» — это гарантированный способ навсегда отвадить от предмета 99% обучаемых.
Ардуино по своей сути, по идеологии задумывалась как система, ОБЛЕГЧАЮЩАЯ освоение микроконтроллеров, как наиболее простой и лёгкий путь вхождения в эту очень большую и объёмную область знаний. Да, с огромными ногами, чтобы чуть-шо — можно было к ним подпаяться домашним паяльником. Да, с очень простой IDE, чтобы не пугать новичка кучей не совсем понятных действий по наладке. Да, с отнюдь не идельным кодом и с очень мягкой проверкой синтаксиса — всё для того, чтобы было проще начать работу.
Но нет! «Мы простых путей не ищем!» Правильно выше написали — надо было пример моргания лампочкой сразу для Целерона ваять!
Первое, с чего следовало бы начинать — не с обзора цен (взятых, прямо скажем, с примерно непонятно какого потолка), а с обзора производительности различных микроконтроллеров. Показать главное преимущество этой экосистемы: что под разные задачи можно выбирать совершенно разные кристаллы. Поморгать светодиодиком — и Аттиньки 8-ой хватит, Лору запустить (с правильным AES-ом) — уже и 328-ой ардуинки может не хватить. Дисплей красивый нарисовать — уже ES32 может не хватить. Ну и т.д. И показать в конце, почему под контроллер Умного Дома нужен именно STM32F. Это было бы системно.
А так получилось слишком алогично, а потому непонятно и спорно. «Моргать светодиодиком через STM32? Я вас умоляю!..»
Для всех этих пищалок, мигалок, переключателей и прочих реализаций простой автоматики за глаза хватит AVR. Не нравится framework Arduino (мне он, кстати, тоже не нравится), но никто же не запрещает писать на чистом С\С++
Смотрим таблицу автора:

Смотрим описание контроллера на сайте производителя:

Начинаем изучать STM32 или Управляем светом по-умному