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

    Небольшое вступление


    Однажды, заехав в очередную съемную квартиру, я столкнулся с определенным неудобством, которое достаточно сильно напрягало: выключатель света в основной комнате оказался за шкафом-стенкой, который был прикручен к стене, и его перестановка была невозможна т.к. на это требовалось значительно много времени и сил. Решить данную проблему хотелось очень сильно и в голову пришла одна мысль: сделать дистанционный пульт для управления освещением!

    Именно с идеи создания собственного пультика для управления светом в комнате и началось моё увлечение электроникой, микроконтроллерами и различными радиоустройствами.

    После этого я начал изучать данную тему, знакомиться с основами электроники, примерами устройств, узнавать, как люди реализуют подобного рода устройства. Поискав информацию на тему того, с чего можно было бы начать изучение микроконтроллеров я узнал о том, что такое 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, а не своя плата?

    1. На любой плате Discovery имеется встроенный программатор/отладчик ST-LINK который подключается к компьютеру через USB и его можно использовать как для программирования микроконтроллера на плате, так и внешних устройств путем снятия/установки соответствующих перемычек. То есть плюсом ко всему — мы еще и экономим деньги, получая решение два в одном: микроконтроллер и программатор.
    2. Платы Discovery имеют полную разводку всех пинов прямо с микроконтроллера на пины платы. Я для удобства использования воткнул Discovery так же в две макетные платы.
    3. 3. На плате всегда имеется некоторое количество всяких периферийных устройств, например, таких как акселерометры, микрофоны, дисплеи, сенсоры и многих других. На разных платах Discovery имеются различные варианты обвеса. Если кому интересно, можете ознакомиться подробнее на сайте производителя.

    Что нам понадобится для разработки помимо платы Discovery?


    В своей работе с платой Discovery нам понадобится еще ряд незаменимых вещей, без которых мы не сможем обойтись:

    1. Схему платы чтобы видеть куда, где и что подключено. Взять схему можно на страничке производителя Вашей платы в разделе Schematic Pack. Скачать схемы можно пролистав страницу немного ниже в блоке, указанном на картинке:
    2. Datasheet на наш микроконтроллер, чтобы в любой удобный момент можно было посмотреть распиновку, характеристики, параметры и прочую необходимую информацию для работы. В моём случае это STM32F051R8T6. Ссылка на datasheet находится в заголовке страницы:
    3. Так же нам понадобится Reference manual на наш микроконтроллер. Это документ, в котором подробнейшим образом описаны методы и подходы к работе с ядром МК, c его тактовым блоком, с периферией и т.д. Так же в нем содержатся описание всех регистров МК, всех опций и настроек МК и периферии. Наверное, это самый важный файл без которого разобраться в том, как и что работает внутри МК было бы очень сложно. Скачать файл можно по ссылке на странице микроконтроллера:
    4. И наконец, нам нужно установить среду разработки, в которой бы мы могли создавать программы для нашего МК и спокойно осуществлять компиляцию и прошивку наших программ. В свое время я перепробовал почти все из самых популярных IDE и остановился на Keil uVision 5. На мой взгляд, данная среда разработки показалась мне самой удобной и простой в освоении. Встроенный отладчик, готовые и легко подключаемые низкоуровневые библиотеки, огромное количество примеров и удобно организованный рабочий интерфейс и пространство IDE стали решающими факторами, повлиявшими на мой выбор. Скачать данную IDE можно с официального сайта, но требуется простая регистрация:. Есть правда одно небольшое ограничение на размер загружаемой прошивки в 32кБ т.к. данная IDE платная. Но нам этого будет более чем достаточно. Нам понадобится MDK-Arm:

    Приступим к первоначальной настройке и подготовке IDE к работе!


    После того, как скачается установочный файл нашей IDE можно приступать к установке. Следуя указаниям инсталлятора проведите процесс установки. После того, как скопируются все файлы, необходимые для работы появится окно установщика софтовых пакетов для разработки Pack Installer. В данном установщике содержатся низкоуровневые библиотеки, Middleware, примеры программ, которые регулярно пополняются и обновляются.


    Для начала работы с нашей платой нам необходимо установить ряд пакетов необходимых для работы и необходимо найти микроконтроллер, с которым мы будем работать. Так же можно воспользоваться поиском вверху окна. После того, как мы нашли наш МК кликаем на него и во второй половине окна и нам необходимо установить следующий перечень библиотек:

    1. Keil::STM32F0xx_DFP – полноценный пакет программного обеспечения для конкретного семейства микроконтроллеров, включающий в себя мануалы, даташиты, SVD-файлы, библиотеки от производителя.
    2. ARM::CMSIS – пакет Cortex Microcontroller Software Interface Standard, включающий в себя полный набор библиотек от ARM для поддержки ядра Cortex.
    3. Keil::ARM_Compiler – последняя версия компилятора для ARM.

    После установки требуемых паков можно перейти к настройке IDE и нашего отладчика/программатора. Для этого нам необходимо открыть главное окно Keil и создать новый проект.

    Для этого необходимо перейти в меню Project -> New uVision Project и выбрать папку, в которую сохраним наш проект.

    После Keil спросит нас какой МК будет использоваться в проекте. Выбираем нужный нам МК и нажимаем ОК.


    И вновь появится, уже знакомое нам, окно в котором мы можем подключить интересующие нас модули к проекту. Для нашего проекта понадобится два модуля:

    1. Ядро библиотеки CMSIS, в котором объявлены настройки, адреса регистров и многое другое из того что необходимо для работы нашего МК.
    2. 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 мы сделали! В следующем уроке мы разберем что такое битовые и логические операции, как ими пользоваться и узнаем об одной очень полезной утилитке для работы с МК, ну а пока можем наслаждаться тем, как весело перемигиваются светодиоды на нашей плате Discovery. )
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 193
    • +2
      Сравнение цен на сами МК забавно, но взяли-то вы не голые чипы, а STM32F0-Discovery, который стоит 10-14$. Тогда уж сравнивайте его с Arduino Mega 2560 или ESP32S/NodeMCU — характеристики последнего вообще камня на камне не оставляют от STM32.
      • 0
        Для своего проекта я буду использовать голые МК, а учиться будем на Discovery!)
        • 0
          STM32F0-Discovery у местных поставщиков (promelec.ru), равно как и из Китая стоит 17.5$.
          Arduino Mega 2560 у них же 80$
          ESP32S/NodeMCU из Китая 14.5$ + время доставки (которое тоже =деньги).

          Да и речь идёт о том, почему именно Я отказался от решений на Arduino и подобных платах, и привел аргументы которые были убедительны исключительно для меня: поэтому мои утверждения нельзя считать объективно истинными для каждого.

          Ну и использование ESP32 и Arduino не даёт новичкам такой возможности сформировать фундаментальные навыки и опыт разработки под МК в отличии от хорошо документированного STM32.

          О гибкости решения на Arduino можно и не заикаться.
          О надежности и отказоустойчивости ESP рассуждать не буду. О энергоэфективности решения на Wi-Fi относительно простых радиомодулей суб-гигагерцового диапазона тем более.
          • 0
            сформировать фундаментальные навыки и опыт разработки под МК
            И конечно же вы можете дать ссылку на учебник под вашей редакцией, на котором выросли целые поколения студентов, позже устроившихся на профильную работу связанную с МК?

            от хорошо документированного STM32
            Отличная шутка.

            О гибкости решения на Arduino можно и не заикаться.
            Я заинтригован.
            • 0
              И конечно же вы можете дать ссылку на учебник под вашей редакцией, на котором выросли целые поколения студентов, позже устроившихся на профильную работу связанную с МК?

              К слову, я по образованию педагог. Может из моего курса что-нибудь и получится, что будет взято за основу в качестве учебных материалов по МК. Под фундаментальностью я подразумевал плотную закладку базиса в освещаемом вопросе.

              Отличная шутка.

              Всё относительно, если вы ставите моё утверждение под сомнение.

              Я заинтригован.

              Дальше функций из библиотек не уползёшь.
              • 0
                Дальше функций из библиотек не уползёшь.

                Чой-то? Никто не запрещает все писать самому.
                • 0
                  Мне это не показалось удобным. Архитектура проекта, навигация по нему в ArduinoIDE — невозможна.
                  При попытке перенести работу в AVR Studio столкнулся, на момент знакомства, с неописуемым количеством костылей.
                  А вот надстройка над Visual Studio для Arduino показалась мне достаточно удобной для работы. Но это решение я нашел уже тогда, когда во всю уже работал с STM.
                  На текущий момент с помощью Visual Studio + Arduino проверяю на общую работоспособность датчики, модули и др.

                  Да и опять же напомню про общие предпосылки — мне хотелось начать свое изучение МК именно с STM.
                  • 0
                    При попытке перенести работу в AVR Studio столкнулся, на момент знакомства, с неописуемым количеством костылей.


                    Так возьмите WinAVR. Никаких костылей. Обычный Си. Встроенный ассемблер. Простые команды асма и абсолютная предсказуемость их времени выполнения (1-2 такта обычно).

                    мне хотелось начать свое изучение МК именно с STM.


                    Посмотрите размер *.h в CMSIS. :) Мегабайт у stm32f407! Это не самый простой процессор для мигания светодиодом. А ещё есть ST-Periphery (не помню, как пишется). А ещё есть HAL. И всё это сваливается в кашу — друг с другом не стыкуется.

                    Отдельной строкой идёт Keil. Может, я чего не понимаю, но обычно среда разработки должна предлагать включать в проект библиотеки без их компиляции (файлы lib должны быть — и подключаться к проекту либо ручками, либо для стандартных библиотек lib должны лежать в стандартных папках. А у STM библиотеки в *c-файлах — компилируются вместе с программой (при этом в файлах проекта они не отображаются)). А где ищет библиотеку Keil — загадка природы. Если я ставлю пакеты разных версий, они все там свалены в разных каталогах. И что при подключении компилирует Keil я до сих пор в неведении.

                    от хорошо документированного STM32


                    Я тут USB-Host для тепловизора запускал на STM32F407 с помощью CubeMX (а без него вообще не понятно, что делать — примеры из инета не компилируются, так как используют совершенно разные библиотеки, которые ещё как-то надо к проекту прицепить (а после прицепления — откомпилировать)). Так вот, документации как это правильно делать фиг найдёшь.
                  • +2
                    Никто не запрещает все писать самому.

                    При чём тут тогда Arduino?
                    • 0
                      Не понятно))) Парадигма Arduino построена на использовании готовых библиотек и отчасти кода из семплов с последующей переадаптацией
                      • +2
                        В том-то и дело, Arduino — просто огромный фреймворк, который либо используем, либо делаем всё сами. В последнем случае всё это превращается в обычное программирование под AVR8, которое, кстати, тоже довольно увлекательно.
                        • 0
                          Возьмите от ардуины только железную часть. Т.е. экстремально дешевые готовые для втыкания в бредборду платы от наших азиатских друзей. А программную часть… Выбросить и забыть. Взять AtmelStudio (которая есть удобнейшая Visual Studio) и пишите на правоверной и удобной сишечке без всех этих ужасных digitalOutput и прочих макросов поверх коллбеком обернутых в макросы.

                          И нет. Не подумайте что я защищаю ардуину и/или протестую против стм.

                          Просто каждому инструменту свое место. И чем шире ваш опыт в инструменте как разработчика — тем больше вам цена.
                          А т.к. вы позиционируете себя как преподавателя — тем больше к вам требования в плане обширности кругозора.
                          • 0
                            Хочу добавить еще один + в пользу STM.
                            Сам начинал с AVR и именно голых чипов — так пока разбирался с их фьюзами пару чипов залочил.
                            С STM же никаких проблем, залочить нереально, убить чип — тоже нужно постараться.
                            • 0
                              Я тоже так думал, но у STM есть защитные биты которые действуют ещё хуже — чип зашивается намертво и его нельзя будет ни прошить ни прочитать и даже очистить нельзя будет.
                              • +1
                                Да, но они не являются одним из главных инструментов настройки. Короче — не трогай их и всё будет хорошо.
                                • 0
                                  А как же переключение с HSI на HSE? Там же фьюз битами всё делается. Я по неопытности две тиньки залочил как-то раз)))
                                  • +1
                                    Я про защитные механизмы STM :)
                                    С AVR с этими фьюзами разработчиков, похоже, икота до сих пор не отпускает.
                                • 0
                                  Боюсь что до манипулирования этими вещами в прикладных задачах вряд ли руки доходит. А вот до Fuse-битов в ATMega/Tiny…
                                  • 0
                                    То же самое, фузы тоже надо трогать только один раз. И тем не менее…
                          • 0
                            Вы наверное изолентой только провода изолируете?
                        • 0
                          Лучшая закладка, чем ссылка на страницу DiHALT я не знаю.
                          • 0
                            не там отобразился, речь про «закладку базиса»
                            • 0
                              Согласен. DiHALT очень хороший базис даёт. Просто о сложном — это про него.
                          • +1
                            Под фундаментальностью я подразумевал плотную закладку базиса в освещаемом вопросе.

                            А я — профессиональный программист и потому отношусь к рассуждениям о базисах весьма скептически. Ниже в комментариях shell4692 рассказывает про многопоточные задачи. Это действительно интересная тема и в ней наверняка есть некоторые нюансы, которые следуют непосредственно из железа. А для мигания светодиодом (или IR/RF передатчиком) никакие базисы не нужны, это тривиальные задачи.

                            Дальше функций из библиотек не уползёшь.

                            Разве что в том смысле, что уже существуют тысячи библиотек и есть библиотека (а то и несколько) для практически любой железки или протокола. Но в целом, не вижу никаких проблем с написанием своих библиотек.
                            • 0
                              До проф. программистов мне явно далеко, и пока я возможно кому-то помогу понять базовые стартовые вещи поняв которые человек уже сможет отправиться в обучение самостоятельно. Я, к примеру, когда только взял в руки Discovery понятия не имел как ее запрограммировать и как поморгать светодиодами — мои статьи скорее для зеленых новичков нежели для проф. программистов. Нужно понимать на какую аудиторию нацелены мои материалы.
                        • +1
                          «ESP32S/NodeMCU из Китая 14.5$» — где вы такие цены находите?
                          Неделю-две назад заказал на BangGood ESP32 DevBoard за 4.07$ (это была акционная цена, сейчас 6.79$ стоит)
                    • 0
                      А Keil по-прежнему платный? Лет 10 назад писал на нем для Atmel'овскоко 51-го микроконтроллера и лицензия, ЕМНИП, стоила 8000 EUR. Хотя, не то, чтобы я ее покупал…
                      • 0
                        Сейчас есть бесплатная лицензия на Cortex-M0 но ее установка блокирует возможность работы с другими типами ядер (M4, M7, etc.)
                      • +4
                        Процесс выбора МК не описан. Из таблички можно сделать и совсем другие выводы.
                        Мне например сложно представить зачем нужны пять таймеров. Для просыпаться и что то делать достаточно одного, ну пусть нужен ШИМ, под него ещё один, итого, для 90% задач достаточно 2 таймера. Более точный АЦП тоже нужен редко. Под 5 вольт проще и дешевле найти обвязку (хотя это спорно). У 328 большое количество вариантов корпусов, от DIP (проще макетировать) до BGA (меньше места), у stm только LQFP/SSOP что для начинающих большая трудность. Ну и наконец, флеша одинаково, но один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд.
                        Ничего против stm32 не имею, просто не понятны критерии выбора, и мне кажется что это важный момент для начинающих, ведь это статья для них.
                        • 0
                          Я думаю что, этот вопрос необходимо раскрывать ориентируясь на конкретное ТЗ и на основании определенного перечня требований. Этот вопрос я раскрою когда буду раскрывать выбор МК для своего устройства.
                          Насчёт DIP — полностью согласен, жаль что ST не потрудились сделать такой корпус для начинающих.
                          • 0

                            Когда я начинал, у меня плату для LQFP с помощью принтера и утюга с первого раза получилось изготовить. А это главная сложность. Пайка вообще проблем не представляет. А для макеток есть дешёвые отладочные платы с минимальной обвязкой. У них проблем с макетками нет, и даже удобнее получается.


                            На мой взгляд реальный минус тут не в макетировании, а в том, что если самому плату проектировать, то у LQFP между ногами дорожку не протащишь, что сильно усложняет трассировку дорожек с питанием и землёй (которых нужно четыре пары). Особенно на односторонней плате. Можно, конечно, делать Gerber и заказывать платы, но для меня это хобби. А что это за хобби, когда его за тебя кто-то другой делает? :)

                            • 0
                              Я юзаю QFN-корпуса и платы делаются относительно не плохо. Тем более, если учитывать тот факт, что габариты встраиваемого устройства порой сильно ограничены.
                              • 0

                                Это интересно. А как там к выводам подпаиваться в домашних условиях? Фен и паяльная паста? И где берёте STM32 в таком корпусе? На Aliexpress сходу не нашёл.

                                • +1
                                  Всё ношу в голове мысль попробовать паяльную пасту. Но пока только флюс, фен, паяльник.
                                  Последовательность проста:
                                  1. Залуживаем после вытравки дорожки
                                  2. Наносим флюс
                                  3. Позиционируем МК
                                  4. Нагреваем феном удерживая МК пинцетом
                                  5. Ждём пока усядется МК.
                                  6. Чистим плату от флюса, проверяем пропайку через микроскоп.
                                  7. Допаиваем ноги острым жалом, если где-то есть подозрения на непропай.

                                  Закупки все осуществляю у местного (г.Екатеринбург) поставщика, в Промэлектронике.

                                  Если интересно — загуглите STM32F051K8U6, на Али они тоже есть в продаже. Ценник особо не отличается от «Промки», мне лично время дороже, не люблю ждать. Либо обычно заказываю заранее.
                            • +1
                              Да не бойтесь вы LQFP, паяются они с закрытыми глазами. Плату изготовить сложнее, но есть вариант развести и заказать у китайцев, только подождать доставку придётся. Но зато девайс будет выглядеть как заводской. Плюс вы не ограничены одним слоем и имеется возможность сделать металлизированные переходы, а при разводке это просто кайф, в отличии от разводки под утюг.
                              • 0
                                после ssop32 я ничего выводного не боюсь )) Но до этого надо дойти. Естественно использовать DIP в готовом устройстве уже выглядит немного странным, но возможность по быстрому натыкать их в бредборд, накидать перемычек и убедиться что белый дым не выходит — бесценно. А потом, когда уже все работает и отлажено можно делать разводку платы под любые корпуса.
                            • 0
                              один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд

                              Прямо скажем, такой подсчёт некорректен; более того — лукав. 1) В ядре AVR регистры данных 8-битные; но слова программы 16-битные. 2) Ядро CortexM0 в STM32 использует 16-разрядный набор инструкций Thumb.
                              • 0
                                «совсем грубо» же. Ок, в два раза меньше команд. Но что то мне подсказывает, что у ARM на настройку периферии уйдет больше команд чем в AVR, и в итоге в AVR все рано поместится больше полезного кода.
                              • 0
                                один 8 битный, второй 32, совсем грубо во втором поместится в 4 раза меньше команд

                                Прямо скажем, такой подсчёт некорректен; более того — лукав. 1) В ядре AVR регистры данных 8-битные; но слова программы 16-битные. 2) Ядро CortexM0 в STM32 использует 16-разрядный набор инструкций Thumb.
                                • 0
                                  У стм есть скорость и довольно развитая периферия, у авр есть прецизионный ногодрыг. Каждому молотку свое применение. Вы ведь не будете кувалдой забивать какойнить гвоздик в часовую оправу? Вот здесь точно так же.

                                  Я, признаться, довольно часто использую связку стм+авр причем даже нередко в виде +ардуина(как железка-плата, а не фремворк) именно по этой причине — когда требуется именно прецизионный ногодрыг когда нужно высчитать все задержки с точностью до такта. А стм это не всегда позволяет — см RMxxxx
                                  • 0
                                    Зато в стм32 можно писать из памяти в порт через DMA. Очень даже прецизионно и плюс проц не занят.
                                    • 0
                                      И как в посылке между битами обработать условия при использовании DMA?
                                      Вопрос риторический. Не отвечайте — никак.

                                      Ситуация экзотическая, не спорю. Но иногда все таки бывает и вот такой вывих.
                                • 0
                                  То есть вот это всё только ради изготовления выносного выключателя из за того что " выключатель света в основной комнате оказался за шкафом-стенкой"?
                                  Да это даже не из пушки по воробьям, это атомной бомбой по комару.

                                  А если не для этого, то напишите для чего. В какой реальной вашей задаче оно покажет преимущество перед *Дуинами несмотря на заметно более высокую сложность и цену?
                                  • 0
                                    Простите, ответил не под Вашим комментарием. См. ниже.
                                    • 0

                                      Для решения именно этой задачи, да, перебор, но для обучения — почему бы и нет?

                                    • 0
                                      Тема насчёт дистанционного выключателя была взята в качестве отправной точки. В сущности я не планирую останавливаться только на выносном выключателе. На текущий момент я работаю над цельной централизованной экосистемой устройств а-ля «Умный дом», в т.ч. для управления освещением/нагрузками (тех которые действительно требуют управления, например электронагреватель, теплый пол и др.), системой датчиков качества воздуха, приточной вентиляцией, датчиками температуры и т.д.
                                      Ну и попутно ставилась цель научиться. Понимание того, что знания по теме достаточно фрагментированы — я решил поделиться своим опытом и наработками с начинающими, т.е. ровно тем, чего мне не хватало когда я сам начинал учиться.
                                      • +1
                                        Сразу подскажу куда ковырять эту тему. К сожалению, многие тяготеют к топологии «звезда». А ведь в быту это крайне неудобно. КМК, самое разумное примерно следующее: «полуумные» устройства. Т.е. «выключатель» логически вяжется с «лампочкой». Смысл в чем. выключатель напрямую говорит лампочке включиться или выключиться. БЕЗ участия центрального контроллера. Он, конечно, тоже слушает весь этот трафик и послушно рисует во всех этих веб-интерфейсах красивые анимированные иконки состояния. Но на этапе управления его роль маленькая — задает связи выключатель-лампочка, и… и ВСЁ! дальше выключатель и лампочка общаются между собой.
                                        Это дает огромное преимущество — можно просто выдернуть из розетки центральный контроллер, но свет в туалете/ванной буде включаться.
                                        Домашние это оценят особенно высоко.
                                        • 0
                                          Завтра как раз буду растягивать провода в доме под схожую архитектуру — отдельный кабель до каждого источника света и каждого выключателя. В щитке будет сменный блок коммутации, позволяющий либо управлять всем барахлом с ардуины, либо на чистом аналоге. Хотя по здравому размышлению баловство все это — проще держать в запасе прям в щитке пяток ардуин на смену, чем перекоммутировать.
                                          • 0
                                            Что за кабели решили использовать? У меня пока ремонта нет — над тем же думаю. Склоняюсь к витухе.
                                            • 0
                                              Ээээ… ВВГнгЛС. Смысл в том, что сигнальный кабель параллельно силовому тянуть не буду — вся коммутация только в щитке. Вместо обычной схемы, когда от щитка идет провод до коробки, оттуда фаза ответвляется до выключателя, возвращается и с нулем идет до светильника — и выключатель, и светильник имеют свой выделенный трехпроводной кабель. Если захочу — в щитке организую классическое подключение, а захочу — приведу проводник с выключателя на дигитал.ин, а фазу возьму с дергаемого той же ардуиной реле. Благодаря трем проводникам до каждого выключателя есть возможность использовать трехклавишные выключатели, обеспечивая управление тремя источниками. Благодаря ардуине (в отличие от бистабильных реле) можно использовать традиционные выключатели, а не «кнопки», которые дороже и реже в наличии — сигнал на включение/выключение можно кодировать изменением статуса клавиши, а не кратковременным нажатием.
                                              • 0
                                                А, вон как. Я думал, вы про сигнальные.
                                                На самом деле я тоже думал тянуть от каждой розетки/выключателя отдельно, но получается слишком затратно/геморно. К примеру, есть блок розеток 4-6 штук, уже жгут силовых проводов, что их непросто проложить, а в комнате таких блоков может быть 2-3, это пучок в руку толщиной.

                                                Пришел к выводу протянуть к каждому такому блоку/розетке сигнальный провод, оставить место под управляющую плату, и подключить всё по старинке.
                                                • 0
                                                  С розетками — скорее всего так и сделаю (хотя не очень понятно, нахрена рулить каждой розеткой), даже если не понадобится для автоматики, витая пара в каждом блоке не помешает. Со светом это смысла не имеет — одна/две нагрузка на точку, дешевле и проще дотянуть до каждой кабель.
                                                  • 0
                                                    Со светом конечно, при том сечение провода будет гораздо меньше.
                                                    На счёт розеток: в идеале видеть нагрузку на каждую из них и рулить соответственно. Банальный пример — воткнули в один блок ноут на зарядку и утюг, и ушли из дома. Как погасить одно, не трогая другое?

                                                    Ещё выбор витухи вызван тем, что может понадобиться розетка для LAN, при этом можно задействовать 2 пары на своё усмотрение. То есть растянуть их везде во время ремонта, а потом делать/не делать по мере появления желания.
                                                    • 0
                                                      Гигабит становится обыденностью, двумя парами уже не обойтись… темболее еще и неэкранированными.
                                                      • 0
                                                        Знаете, я ретроград. Я дома удаленно не рендерю и кластеров из холодильника и торшера делать не собираюсь. 100 МБит хватит всем, почти как 64к памяти.
                                                        • 0
                                                          Разве что если цель сети — только доставка интернета. А когда бэкап при полностью свободной сети заливается на NAS больше 40 минут… это очень уныло.
                                                          • 0
                                                            Бэкап чего? Всех фоточе и фильмов с диска + образ системы? А нафига? Я конструктор, у меня рабочие файлы мелкие, за месяц может гиг-другой генерирую, так что быкапы небольшие. И они на работе, естественно — нафиг не надо дома рабочие файлы держать.
                                                            • 0
                                                              За год, у вас стало быть 12Гб генерируется, и с каждым годом объём растёт…
                                                              Образ системы — для того чтобы быстро восстановить работоспособность в случае глобальных и серьезных проблем, даже если нет ничего ценного восстановить из бэкапа всегда быстрее чем переустанавливать систему с нуля и ставить весь нужный софт. Пару раз эта функция пригодилась.
                                                              Бесконечный инкрементальный бэкап плох тем что при повреждении где-то в середине цепочки весь «хвост» становится протухшим. Поэтому инкрементальный бэкап захватывает максимум две последние недели. И копии всех бэкапов храняться как локально так и на NAS-е. Вот этот перенос копии бэкапов на NAS и занимает существенное время.
                                                              Фотографии тоже надо бэкапить как особо ценные файлы которые не с чего восстановить. А их накопилось пожалуй даже больше чем образ системы.
                                                              • 0
                                                                NAS, инкрементальный бекап… Что-то круто для дома. Если такое количество информации дома генерировать, то когда работать?
                                                                А несколько фоток + домашние проекты заливаются в облако по мере их появления, и всё.
                                                                • 0
                                                                  Я работаю когда хочу и где хочу. Если приспичило дома — то и дома можно. Другое дело, что один фиг даже в самом запущенном случае пару раз в неделю появляюсь в офисе.

                                                                  Но в общем по поводу домашних проектов согласен.
                                                                  • 0
                                                                    Не круто а обыденно. Информация генерируется постепенно, но в итоге накапливается её много — и это надо периодически бэкапить и обновлять чтобы не потерять ВСЁ.
                                                                    Облака это пока ещё ненадёжная игрушка. Заблочат аккаунт по каким-то своим соображениям и прощай данные, к тому же где взять бесплатно 50-100-200Гб места в облаке? Пожалуй, съёмный винт(даже два винта) в перспективе и меньше рисков и дешевле обойдётся. А облако… разве что для оперативного бэкапа и синхронизации между несколькими локациями. На надёжное хранилище бесценных данных оно не катит, только как очень временное или дополнительное.
                                                                  • 0
                                                                    Не, у меня не массив рабочий растет, а архив — он остается неизменным, его нет смысла бэкапить. Ну и как бы трех бэкапов (на работе, на ноуте и на станках) хватает за глаза, дома нафиг не надо.
                                                          • 0
                                                            Ну вот как раз я долго и упорно думал — может ли у меня быть ситуация втыкания в один блок ноута и утюга… Пожалуй, нет — у меня утюг будет только в гардеробе. Ну и так далее: отдельный «всегда вкл» блок для мультимедиа, блок с резервированием под сервер, некоторое количество управляемых блоков. На кухне тоже: управляемые (розетки для кухонной фиготы типа блендеров/кофемолок), «всегда вкл» (для девайсов с таймером) и резервированные (для холодильника).
                                                            А так чтобы смешивать… очень редко когда пригодится.
                                                            Так что витуха скорее всего именно под ЛАН.
                                            • 0
                                              Товарищ, пишите ищо!
                                              Материал для новичков на эти чипы в основном напоминает майкросовтовские курсы. Нифига никто ничего не объясняет, просто дают методичку для достижения конкретной цели. Если Ваша цель отличается — фигово быть вами. Без фундаментальных знаний можно только быдлокодить.
                                              Обратите внимание на библиотеку HAL — это куча всякой полезности для микроконтроллера, инициализаторы всего и вся… не, не смогу кратко описать всю ее полезность (вот щас некоторые начнут рассказывать что всё должно быть без библиотек… а то развели..)
                                              Другая тема — CubeMX. Тоже на сайте производителя можно найти, программка для конфигурирования камня. Там например в настройках частоты такой бардак, что сами микроэлектроники за голову хватаются, вот и сделали программку. Частота процессора одна, шин другая, периферии третья… и это далеко не все… Ну плюс настройка ввода вывода, интерфейсов и многого другого тоже там есть.
                                              • –2
                                                Я считаю HAL очень мусорным, нечитабельным. Дебаг в нем превращается в сущий ад.
                                                CubeMX смотрю, как правило, только для того чтобы сформировать значения по тактированию, возможно глазком заглянуть в генерацию таймингов. Но генерируемый им код считаю не юзабельным. Глубоко не копнешь, всё разбросано по куче файлов в проекте. Словом возмутительный бардак.
                                                От использования HAL и CubeMX напрямую я отказался.
                                                Со своей формой библиотек я так же ознакомлю в последующих материалах.
                                                • +2
                                                  HAL, конечно, перегружен и сгенерирован, со всеми вытекающими, но зато довольно богат и серьезно упрощает жизнь, если проект не слишком заморочен.
                                                  • 0
                                                    и серьезно упрощает жизнь, если проект не слишком заморочен.

                                                    то в таком юзкейсе ардуина — божья роса.
                                                    • 0
                                                      А ардуина не всегда достаточна, не всегда подходит, и все-таки не industrial grade. А вот взять камень, развести под него плату какого надо функционала, размера и типа, и быстренько, не заморачиваясь, накидать несложный функционал, без необходимости изобретать велосипеды — бесецнно.
                                              • +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 поточное приложение, которое будет иметь некую структуру драйверов и сервисов.
                                                • 0
                                                  1. Насчёт использования AVR/Arduino/ATTiny — по секрету говоря, я с них как раз таки начинал, но STM32 мне показался более перспективным в плане моего развития, да и коллеги могли помочь в значительной степени на начальном этапе. Я не говорю что мой вариант и способ решения единственно правильный или сообразный — я говорю о том, что мне он показался наиболее интересным. Согласен, тут свои плюсы и минусы.

                                                  2. Использование CMSIS было использовано с целью максимально быстро организовать сборку проекта для того, чтобы увидеть вожделенное моргание светодиодами. А приучать себя заранее работать с битовыми операциями, картами регистров, изучая работу низкоуровневой части, если это подано в доступной и понятной форме, ничего сложного не вижу. Сам именно с этого начинал. Разбирался и прокачивал скилл с нуля. Смог. Справился.
                                                  • Это позволяет делать на нём многопоточные приложения, чего AVR8 лишён в принципе (я имею ввиду mega328p/mega16/mega32 и вообще AVR ядрёные версии). Для однопоточной задачки вполне себе подошёл бы и Ардуино, ничего такого ужасного в нём нет.

                                                    scmRTOS — считается? Я запускал её и использовал на Arduino (в одном из журналов Хакер есть статья как это сделать). Нормально вроде работает, процессы переключает.
                                                    • 0
                                                      Несомненно считается. Автор scmRTOS делал её для не только для AVR, а вообще для МК и делал её на C++. И это наложило отпчаток на системные требования scmRTOS — 512 байт ОЗУ минимум. Однако, простой кооперативной многозадачности было бы достаточно для небольшого (по сравнению с stm32) ресурса этих контроллеров. Честно говоря, не хочется превращать беседу в holywar типа stm32 vs avr. Я много лет назад начинал на AVR и до сих пор их использую. Также, как и stm32.
                                                  • 0
                                                    Вот насчёт контроллера «умного дома» на stm32Discovery у меня возникают сомнения. Тридцатка слабовата, чтобы тянуть на себе RTOS на целый умный дом, для таких целей, наверное, могли бы подойти модули Maple-Mini, на stm32f103c8, у которых 72Мгц с внешним кварцем. Да и они тоже как-то слабоваты.
                                                    • 0
                                                      Да не на Discovery же, я их беру в поле рассмотрения только для обучения же, ну!
                                                      Целевой девайс будет полностью кастомным на отдельном МК. А центральный контроллер будет на ARM Cortex-A53.
                                                      • 0
                                                        Вы понимаете всю пропасть в схемотехнике и проектирование ПП? Это иная область. Я мало знаю людей, которые одновременно могут это делать еще и разрабатывать ПО.
                                                        Имхо, ядро вашей системы должно быть на одноплатнике. Проще и удобнее решение.
                                                        • 0
                                                          Именно так и есть: под ARM Cortex-A53 я подразумевал Raspberry Pi 3.
                                                          Там уже предстоит командная разработка. С вами не поспоришь.
                                                          Невозможно быть экспертом-профессионалом во всех областях IT.
                                                          • 0
                                                            Тогда не понятно, зачем вам нужен stm32. Делать на нем периферию?
                                                            Вы же не будете писать свою ОС под RPi3.
                                                            • 0
                                                              1. Одноранговые устройства сети: датчики, управлялки, модули, драйверы и др. — это всё на STM32 + LoRa.
                                                              2. Центральный контроллер на RPi3 + LoRa.
                                                              • 0
                                                                а почему LoRa?
                                                                Дальность большая нужна?
                                                                • 0
                                                                  Вообще, на самом деле, прежде чем выбрать LoRa я опробовал целую кучу решений для радиосвязи прежде чем остановился на LoRa.
                                                                  1. ESP8266 — глючил, не оживал после резкой перезагрузки. Прожорлив по питанию. В целом не очень решение для организации низкопотребляющего автономного устройства.
                                                                  2. RF-433 модули — примитивные, ASK-модуляция, никакого протокола и механизма обработки пакетов, полностью ручное управление.
                                                                  3. NRF24L01+ — хорошие модули НО: криво работающая система адресации, ограничение на количество сетевых адресов в сети (7 по-моему). Бывает такое что одному модулю прилетает не предназначенный для него пакет, он шлёт ACK на передатчик и целевое устройство не получает то что должно было придти к нему.
                                                                  4. SPIRIT1 — богатые по функционалу и возможностям устройства, но требуют разработки радиотракта (лежит за пределами моих текущих компетенций) и настройки согласования антенны. Готовые модули SPSGRF-XXX дорогие и имеют малый радиус покрытия даже с антенной.
                                                                  5. LoRa — низкое потребление, большая дальность. Настраиваемые прерывания на ноги GPIO самого модуля, RSSI, пакетный конвейер, и много других фишек (которые к слову есть и в SPIRIT1). Предстоит еще обкатать чтобы сделать выводы об этом модуле. Ну и много хороших отзывов.
                                                                  • 0
                                                                    Мне нравятся всех больше si4432 (si4463). Дешевле чем LoRa.
                                                                    Для дома (+ около дома) помоему самое то.
                                                                    • 0
                                                                      RTL8710 — типа ESP8266, но лучше.
                                                                      • 0
                                                                        А как же 802.15.4 — ZigBee или Thread?
                                                                        У NXP есть очень интересная серия — KW41Z (с Bluetooth и без него), у Atmel — Mega RF, SAMR и множество других.
                                                                        • +1
                                                                          ESP8266 — глючил, не оживал после резкой перезагрузки
                                                                          Типичная проблема неправильного питания. Такое часто случается если кто-то после дешевого стабилизатора не поставит нужный конденсатор для выравнивания ряби и/или не поставит достаточно емкий конденсатор для сглаживания скачка питания, возникающего при включении радиомодуля. Если все сделать по даташиту (я знаю, это кажется нелепым, но все же), то ESP работает без малейших проблем и сбоев.

                                                                • +1
                                                                  Я мало знаю людей, которые одновременно могут это делать еще и разрабатывать ПО.

                                                                  Зайдите на любой радиолюбительский форум. Таких людей масса, но они больше ориентированы на низкоуровневое программирование, «ближе к железу».
                                                                  • +1
                                                                    Реально сильных программистов, которые делают правильно не так-то и много. Просто кодить это вот ардуино доказало, что может каждый. Вы ещё скажите, что любой из них под плис напишет.
                                                                    • +1
                                                                      И под плис пишут, и в связке с МК, и в сочетании с нехилой схемотехникой. Но таких конечно мало, а составить схему и написать код (не идеальный, но рабочий) — очень многие. При том ардуино не жалуют.
                                                            • +1
                                                              Последнее, о чем нужно думать новичку при выборе первого контроллера — это сравнение производительности, наличие DMA и пр. Простота входа — вот первый шаг — тут и лёгкий старт, наличие простых обучающих материалов, а не копание в даташитах. А дальше, после первых проб и проектов, уже будет понятно, что надо, а что не надо. И можно будет выбрать соответствующий МК.
                                                              • 0
                                                                Если вообще -то нужно предварительно разобраться в вопросе прежде чем принимать то или иное решение в пользу того или иного контроллера. И всё очень сильно зависит от целей и возможностей конечного пользователя.

                                                                В свете данного комментария я могу сказать что я стал очень необычным новичком. И своими статьями хочу снизить порог вхождения в кодинг МК на STM32, ну или сделать процесс вхождения более просты путём изложения накопленного мною опыта.
                                                                • +1
                                                                  > снизить порог вхождения в кодинг МК на STM32, ну или сделать процесс вхождения более просты путём изложения накопленного мною опыта

                                                                  Вот и не слушайте никого, пишите.
                                                                  Сам в свое время к STM32 присматривался, но так скажем эко-среда — не впечатлила.
                                                                  Я считаю что чем больше будет доступным языком написано про STM32 — тем лучше. А у вас получается довольно неплохо.
                                                                  • +1
                                                                    Спасибо за добрые слова!) Постараюсь регулярно радовать Вас своими материалами.
                                                                • 0
                                                                  Я вас правильно понимаю что в качестве первого шага ардуина — лучший выбор?
                                                                  вопрос с подвохом, на самом деле.
                                                                  • 0

                                                                    Смотря в каком направлении нужно шагать ;)

                                                                    • 0
                                                                      Точнее смотря кто будет шагать. Вот недавно была просто феерическая статья от строителя квеструмов — ярчайший пример, как ардуину применять ненадо. Вместо того чтобы разобраться что не так — тупо перебирались библиотеки и совершались прочие шаманские действия с неясным результатом. Я когда читал тот опус — рука от лица не отрывалась просто.
                                                                      • 0

                                                                        Когда управление проектом в стиле "не заводится? поехали, потом заведешь" — странно ожидать другого ;). А так,


                                                                        • задача выполнена? Да.
                                                                        • возьми бы авторы вместо ардуин STM32 Discovery, было бы иначе? Вряд ли.
                                                                • +1
                                                                  Еще один туториал по STM32? А зачем?
                                                                  • 0
                                                                    Вся проблема в том, что информация по вопросу достаточно фрагментарна и приходится её аккумулировать, ползая по огромному количеству ресурсов и складывая общую картину из пазлла. Ну и некоторые вещи которые я собираюсь рассмотреть взяты из англоязычных источников. А начинающие, как правило, не отягощены знанием тех. английского и порой передовой опыт зарубежных коллег обходит новичков стороной.

                                                                    Цель моего материала — наиболее широкое освещение спектра базовых вопросов и изложение аккумулированного мною опыта. То есть создание такого материала, которого мне так не хватало на момент когда я начинал изучать STM32.
                                                                    • 0
                                                                      Ну не знаю. Статей про светодиод и его мигание очень много. А вот статей про какие-нибудь редкие функции периферии, навроде режима захвата у таймера или про использование MAC контроллера, явно недостаточно, даже из референс мануала информации вытянуть получается немного. Поэтому, если начинать такую обширную тему с основ, которые разжёваны тысячу раз другими, до настоящих интересных задач вы не доберетесь, т.к. просто надоест писать столько статей.
                                                                      • 0
                                                                        Рассчёт был именно на «писать столько статей». Т.к. когда готовишь подобного рода материал для публикации — как минимум систематизируешь свои знания и иногда можно даже узнать что-то новое. Поэтому мотивация продолжать написание разного рода статей — железная! =)
                                                                        • 0
                                                                          В таком случае я бы вам посоветовал использовать CubeMX+какую-нибудь бесплатную IDE, например, Atollic, Coocox (кажется он уже всё), SW4STM32 или же чистый Eclipse с плагинами, т.к. размеры кода со временем вырастут за 32кб. CubeMX и библиотеку HAL многие ругают (возможно есть за что), но если при объяснении функционала микроконтроллера использовать и её, и чистый CMSIS, то статьи только выиграют. Удачи вам в ваших начинаниях!
                                                                          • 0
                                                                            В моих библиотеках получилась смесь CMSIS + HAL + плюшки CubeMX (в плане удобного интерфейса для рассчёта схемы тактирования и справочной составляющей этой программы) завёрнутая в удобные иерархически выстроенные и отлично откомментированные библиотеки.
                                                                            Спасибо Вам за добрые слова! Именно хорошие отзывы больше всего вдохновляют! =)
                                                                  • 0
                                                                    • +1
                                                                      Я думаю при изучении STM32 стоит ещё обратить внимание на wiki.stm32duino.com/index.php?title=Blue_Pill стоит копейки, но достаточно удобна для мелких проектов.
                                                                      • –1
                                                                        Да, это самое дешевое предложение из имеющихся на базе STM32 — около 100р. из Китая.
                                                                        Но т.к. серия STM32F103 была пилотной серией 32-разрядных МК от ST — всё получилось по принципу «первый блин комом». И есть ряд различий по картам регистров и проблемы с совместимостью с текущим предложением в аналогичной линейке продуктов от ST.
                                                                        • +1
                                                                          Я использую HAL и про регистры не знаю, в целом спокойно перешел с 103 на L433 когда понадобилось, и всё работает.
                                                                          • 0
                                                                            Не рискну делать каких-либо выводов но мне кажется что портируемый код был достаточно прост чтобы плавно переехать с F103 на L433. Я люблю абстракции но с условием полного понимания что за этими абстракциями происходит.
                                                                      • 0
                                                                        А ещё можно было извернуться и воспользоваться проектом Stm32Duino: Получить мощь и функционал STM32 и обилие библиотек, готового кода, мануалов и прочих нищтяков от Arduino.
                                                                        • 0
                                                                          Так или иначе данный подход не реализует весь потенциал STM32 во всей широте и не даст ощутимой прокачки скилла и опыта т.к. всё будет уже готовое.
                                                                          • 0
                                                                            Почему не дает, поясните? Фреймворк ардуины только лишь берет на себя рутину, но ничуть не бьет по рукам желающим напрямую обращаться к регистрам и писать наиболее эффективный код. Поправьте если ошибаюсь.
                                                                            Сам юзаю visual studio+visual micro и счастлив, хотя работать с широкой периферией задач не возникало.

                                                                            P.S. С нетерпением жду от Вас статьи в которой будет расжевана работа с каналом DMA.
                                                                            Спасибо за Ваш труд, он нужен нам.
                                                                            • 0
                                                                              Я имел ввиду традиционный подход к программированию Arduino в Arduino IDE
                                                                        • 0
                                                                          Рекомендую для начала всё же ардуино, чтобы не заморачиваться наперво по поводу железных вещей и сосредоточиться на качестве кода. Ну о каких циклах для задержки может идти речь? Гуглю давно пора забанить за такие костыли.
                                                                          learn.adafruit.com/multi-tasking-the-arduino-part-1/a-classy-solution
                                                                          Т.к. я и сам новичок, то хочется услышать от более зрелых коллег по поводу реализации т.н. задержек по ссылке. ИМХО — как раз там всё описано очень хорошо, и код мне люб.
                                                                          • 0
                                                                            Это HelloWorld в мире МК, минимально работающая программа, результаты которой видны. В реальной программе никто задержки циклами не делает, если это не считанные такты.
                                                                            По ссылке — ардуино, что не имеет никакого отношения к теме.
                                                                            • 0
                                                                              Предложите лучший вариант без использования дополнительной периферии для организации задержки. Очень интересно было бы увидеть оригинальное и простое решение! =)
                                                                              • 0

                                                                                Я в этих STM32 не разбираюсь, но, чорт побери… Есть же usleep() (гуглится).

                                                                                • 0
                                                                                  Вы про это что-ли? Обратите внимание на тело функции пожалуйста :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;
                                                                                  }
                                                                                  
                                                                                  • +1

                                                                                    И? Стандартная функция, существующая почти на любой платформе.
                                                                                    Если сравнить это


                                                                                    for (int i=0; i<500000; i++){}  // Искусственная задержка

                                                                                    и это


                                                                                    usleep(500000)
                                                                                    

                                                                                    , что более наглядно?

                                                                                    • 0
                                                                                      Я не преследовал цели сделать максимально красиво и наглядно.
                                                                                      Мне надо было только сделать простейшую моргалку светодиодом при минимуме усилиий со стороны читающего статью. Вводить функции и прочее в мои планы не входило. Если нужны были бы задержки — я бы сделал их средствами периферии.
                                                                                      • +1
                                                                                        Я не преследовал цели сделать максимально красиво

                                                                                        при минимуме усилиий со стороны читающего статью

                                                                                        Эти 2 предложения конфликтуют, или мне показалось? ;)
                                                                                        Проехали, смысл helloworld от этого никак не страдает, и подобных мигалок светодиодом гуглятся десятки, и у всех в нутре for(). Хотя как-то странно, для демонстрации очень простого алгоритма на супер-пупер-мощном кристалле все делают helloworld в том самом Arduino-style, на который с таким пренебрежением кивают ;)

                                                                                • 0
                                                                                  Без использования периферии можно использовать счётчик, но не определено время инкрементирования (зависит от времени цикла) — это решение тоже не будет годиться для критичных к точному времени задач, но оно не будет блокировать остальной код во время между включением и выключением диода.
                                                                                  • 0
                                                                                    Вы про SysTick?
                                                                                    • 0
                                                                                      SysTick is an ARM core peripheral (с), следовательно — нет, я не про него. C ним как раз всё будет более-менее детерминированным. Но Ploop говорит, что это ардуино, а значит — плохо.
                                                                                      Без периферии просто uint32 счётчик, инкрементить раз в цикл.
                                                                                      • 0
                                                                                        Я не говорю, что это плохо, я говорю, что это не тема данной статьи.
                                                                                        А так всё вы верно сказали, без использования периферии не сделать чётких таймингов (если, конечно, основной цикл занимается хоть чем-то ещё).
                                                                                • +1
                                                                                  Ардуино и качество кода. Вы это серьезно?
                                                                                  • 0
                                                                                    Расскажите, пожалуйста, что не так в примере по ссылке. Что не нравится, что нужно сделать по-другому. А мы с удовольствием почитаем комментарии специалистов в этой области.
                                                                                    • 0
                                                                                      Я про среднюю температуру по больнице.
                                                                                • +3

                                                                                  STM32CubeMX — лучший инструмент. Он генерирует код под ВСЮ переферию МК. Я лично перешел с PIC -> AVR-> STM32 только ради HAL и STM32CubeMX. А корпуса то какие удобные! Малеенькие даже на 48 ног.

                                                                                  • –3
                                                                                    Генерируемый код, на мой взгляд, очень не читабелен и трудно отследить его до низкоуровневой составляющей. Нет наглядности. Простота — да, скорость — да, удобство — несомненно. Но я прежде всего планирую научить и рассказать, а потом уже предлагать готовые решения и уровни абстракции, причем на начальном этапе я рассматривают CubeMX как абстракцию от понимания того что происходит на нижних уровнях и как это всё работает. Мне, как инженеру, интересно как там всё устроено и по какому принципу всё работает.
                                                                                  • +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.
                                                                                    • –2
                                                                                      1. Я не делаю вывод на основании того, что поморгав светодиодом мы можем сделать всё что угодно. Поморгать светодиодом это своеобразный ритуал вожделенного дрыганья ногой от нашего МК, первое что хотят новички от МК и я не отказал им в праве удовлетворить своё желание вдоволь надрыгаться.
                                                                                      2. Вы видимо не уловили из этой статьй информацию о том, что я собираюсь написать цикл статей по данному МК и его периферии.
                                                                                      3. Большая часть моих библиотек это переработанный и адаптированный HAL, с организацией под удобную мне форму. Это вы увидите когда я выложу первый проект.
                                                                                      4. Кто вам сказал что мне не интересен сам HAL? Мне не интересна та форма в котором её подаёт ST.
                                                                                      5. Насчёт переписывания — ее никто не переписывает/переделывает — я сменил форму не меняя содержания.
                                                                                      6. Когда упрёмся — тогда и поговорим о переходе. Пока в текущих рамках Keil более чем достаточно.

                                                                                      • +1
                                                                                        Вы делаете полезную и нужную работу своими статьями — популяризация STM32. Обеими руками поддерживаю. Я только хочу сказать, что неудачно расставленными акцентами можно отпугнуть новичков. STM32 сегодня уже имеет очень развитую и качественную экосистему — SW4STM, HAL, CubeMX. Все это реально работает из коробки, все примеры по миганию светодиодами для всех демо плат уже включены в SW4STM, и именно это и понижает порог вхождения в тему. Но от Вашего рассказа создается впечатление, что такой экосистемы нет и поэтому все сложно.

                                                                                        И еще про HAL. На мой взгляд, как функциональная библиотека он вполне уже работоспособен. Чего не хватает, так это удобной объектно-ориентированной библиотеки драйверов как самой переферии МК, так и внешних устройств. Я в этом направлении работаю: github.com/mkulesh/stm32DevelopmentBoards/tree/master/src/StmPlusPlus

                                                                                        Если Вы двигаетесь в похожем направлении, то мы могли бы скооперироваться.
                                                                                        • 0
                                                                                          Вспомогательные утилки типа ST-Studio, ST-LINK Utility, CubeMX и многие другие я хотел рассмотреть в отдельной статье, особенно показав возможность Real-TIme отладки.

                                                                                          Я планирую плавный переход с С на С++. Но пока что не достиг должно уровня компетенции в вопрос чтобы кооперироваться по вопросу. Спасибо за предложение.
                                                                                      • 0
                                                                                        Про HAL и размер.
                                                                                        Одно и тоже функционально приложение (USB девайс). Одно на SPL, второе на HAL.
                                                                                        12/28К соответственно
                                                                                        Что там было про размер?..
                                                                                        • 0
                                                                                          добавлю, на регистрах (правда с пуллингом) — 1.2кб
                                                                                      • 0
                                                                                        Но сделав вывод, что я не узнаю, что творится внутри микроконтроллера за рамками Arduino-скетчей я решил поискать более интересный вариант, который подразумевал глубокое изучение и погружение в дебри микроконтроллерной техники.
                                                                                        Откуда такие выводы? AVR можно наверно программировать и без использования скетчей, на чистом Си. Есть тут кстати матерые ардуинщики, может накидаете ссылок как перейти от скетчей к программированию на обычном Си для AVR?
                                                                                        • 0
                                                                                          Я имею ввиду не тех необычных ардуинщиков а в целом парадигму Arduino-программирования и то на что она ориентирована. Если интересно: начните отсюда blogs.msdn.microsoft.com/rucoding4fun/2012/01/14/visual-studio-20082010-arduino
                                                                                          • 0
                                                                                            Вас понял, но ничто не мешает взять ту же атмегу328 и запрограммировать ее на Си. Причем взять именно отдельный чип, программировать через отладочную ардуинку. А потом этот чип уже смонтировать на плате с необходимыми компонентами в готовое устройство (не превращая это устройство в ардуину).