Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Динамичный карточный батлер с PVE и PVP-боями онлайн! Собери коллекцию карточных героев, построй свою боевую колоду и вступай в бой с другими игроками.

Cards out!

Карточные, Ролевые, Стратегии

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Stm32 + Микроконтроллеры

С этим тегом используют

Электроника Arduino Программирование Своими руками Самоделки Радиолюбители Все
33 поста сначала свежее
18
kaper.su
4 года назад

Пытаюсь в CMSIS  на stm32⁠⁠

А вот и я )). Продолжаю Изучать stm32 .

В Общем как всегда работа отвлекает и времени катастрофически не хватает. Но тем не менее вот какие мысли у меня накопились.

Пытаюсь в CMSIS  на stm32 Stm32, Электроника, Длиннопост, Микроконтроллеры

Меня тут третировало пара человек дескать  я использую HAL для того чтобы дрыгать ножками , а ведь можно все это сделать и без этого. Если честно не понятно  мне это  маленько , ну типо HAL  и нужен  для того чтобы быстро сделать что то  не сильно вдаваясь в нюансы. наоборот что то сложное надо писать на cmsis чтобы быть ближе к железу. Это как рисование картин . Если тебе надо бил-борд ты используешь трафареты, если тебе нужна картина аля мишки в лесу воруют шишки то будь добр использую  краски кисточку талант и усердие (ИМХО)

Кароче  CMSIS  я в любом случае хотел изучить типо написать проект с 0 с минимум зависимостей. Но столкнулся с тем что непонимаю откуда берутся некоторые файлы.


Стандартный набор для разработки состоит из файлов cmsis (несколько штук), main.c, startup.c, flash.ld 

И вот как раз с последними файлами была прям трабла, я ни в какую не могу понять откуда и зачем эти файлы startup.c, flash.ld  Просто я привык что исходники всегда где то лежат их просто надо скачать с гитхаба и прицепить к друг другу . Здесь же был какой то хаус.  То-есть файлы обязательны но все начинали  разбирать  программирование с аля открываем ide  создаем проект и все поехали код писать.


После опроса некоторых разработчиков и чтение пары книжек я узнал что эти файлы не пишут их генерируют среды для разработки.  И в этом то и кроется этот хайсу и разнобой.

И все кого я спрашивал (а этих людей было очень много), говорили что они конфигурят эти файлы только если надо (что бывает очень редко) .



Если коротко то startup_**.s файл это набор привязок железа и их инструкций к тем или иным функциям в си, также выделяет место под стек, ну еще пару настроек о которых я скорее всего не знаю .


Файл FLASH.ld это линкер он собирает все в одну кучу и решает зависимости и конфликты. Как я понял FLASH.ld для всех stm32 практически одинаковый отличается только размер памяти, и опять же как я понял у некоторых камней есть плюшечки которые описываются в этом ld скрипте (например несколько ram не как обычно одна). Коротко об этом файле можно почитать здесь: http://themagicsmoke.ru/books/c_for_embedded_systems/text/linker.html



Так как файлы эти генерируются системами разработки. А я сижу на Debian и среды разработки keil (говорят что там более аккуратные файлы генерируются) мне было суждено использовать STM32cubeMX (я пытался сделать это с помощью среды segger но не осилил, было бы интересно узнать как это сделать, я бы с удовольствием посмотрел бы).


Я создал проект пустой без настроек . включил галочку чтобы мне вместе со всеми файлами сгенерировал make файл.

Пытаюсь в CMSIS  на stm32 Stm32, Электроника, Длиннопост, Микроконтроллеры

А потом просто вытащил нужные cmsis файлы ld-скрпит и стартап файл .


Stm32cubeMX генерирует system_stm32f1xx.c которая генерирует функцию SystemInit().

Функция которая вызывается при старте и описывается в файле startup_stm32f103xb.s в ней как правило описываются настройки микроконтроллера (тактовая частота и др), но в целом это не обязательно.

Также в это файле описывается переменная SystemCoreClock которая содержит в себе тактовую частоту. Еще в этом же файле лежит функция SystemCoreClockUpdate() которую надо вызывать всегда когда вы изменяете частоту работу камня. Этой функцией вы обновляете переменную SystemCoreClock.


В целом это было основное непонимание по файлам которое я разрешил для себя и решил этим поделится с вами.


Пока я изучал cmsis я написал небольшой набор функций пока тестировал разные штуки на STM32F103C8Tx.Основное что хотел запустить  это  UART но в примере  есть еще  MCU и обработка  кнопки.

Пытаюсь в CMSIS  на stm32 Stm32, Электроника, Длиннопост, Микроконтроллеры

Я руководствовался вот этими сайтами. пока писал код.

http://dimoon.ru/category/obuchalka/stm32f1

http://mypractic.ru/urok-20-interfejs-uart-v-stm32-rabota-s-nim-cherez-registry-cmsis-ispolzovanie-preryvaniya-uart.html


Если вас интересует uart с помощью HAL то вам сюда: https://istarik.ru/blog/stm32/120.html


Для отправки в uart можете воспользоваться скриптом на питоне который приложен к гиту python3 input.py


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


Но один прекрасный товарищ на ютубе уже рассказал как это можно сделать и сделал даже комментарии что почему и как:

https://pikabu.ru/story/razrabotka_skhemyi_i_pechatnoy_platyi_stm32_7277307


В следующей статье я постараюсь выложить проект розетки с реле таймером. Где будет возможность по дням недели настроить включение и выключение той или иной нагрузки. У меня уже есть одна реализации на HAL https://github.com/IzyI/timer_menu_lcd1602 Но реализация меня не совсем устраивает. Плюс у меня не хватает знаний по языку C. Я не знаю как реализовать те или иные структуры. Но постараюсь как то решить свое незнание.

Как то так.

Показать полностью 2
[моё] Stm32 Электроника Длиннопост Микроконтроллеры
3
8
kaper.su
4 года назад

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник⁠⁠

Кароч потерялся я из за работы. Но вот опять появилось времечко, и я тут же залез в микроконтроллеры stm32.



Изучение ковки начинается обычно с гвоздя, изучение столярного дела частенько начинается со стула или коробки, изучение языка программирования начинается с HELLO WORLD . В мире микроконтроллеров обычно все начинается с мигания светодиодом. Я наверно поступлю так же но чуть чуть по другому .


ТЗ мое примерно такое:

Я хочу с компьютера посылать команды, например 1-1,  а светодиод  на макетной плате соединенный с  ножкой 1 должен зажигался. А если отправить 1-0, то светодиод должен выключаться.

Где это можно Применить:

Например  можно подавать команды с компа на включение и выключение какого-нибудь реле.

В посте я распишу  то чего мне не хватало  , на что я потратил очень много времени чтобы разобраться, и какие бы ссылки бы я хотел получить если бы где то на форуме задал вопрос как  сделать uart на stm32.

Я скорее всего не буду расписывать что за что отвечает, потому-что не доконца компетентен в вопросах. И какие-то нюансы по коду тоже не напишу потому-что  в редакторе  пикабу нет возможности нормально редактировать его. . Проект пока-что будет написан на библиотеке HAL, он позволяет писать код как в ардуино. Сижу я из  под linux , поэтому некоторые ньюансы могут отличаться  от Windows.

Я еще экспериментирую с форматом.  Но если что предлагайте)) . Постараюсь  улучшить.


Предыдущий пост :https://pikabu.ru/story/stm32_ili_kak_ya_pokoryal_7982983


Юзать я буду микросхему STM32F103C8T6:

Ссылка на даташит https://www.st.com/en/microcontrollers-microprocessors/stm32...

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Для соединения с компом буду юзать переходник usb-uart на чипе PL-2303.

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Также нам нужен ST-link/v2 через который мы будем прошивать микроконтроллер

Соединить stm32 c ST-link/v2 нужно по этой схеме .

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Перед тем как начать собирать  схему и писать код нужно почитать инфу по регистрам.

STM32 имеет довольно богатую периферию и довольно сильно отличается от Arduino. Но концептуально логика управления микроконтроллером везде одинаковая. Ты просто обращаешься к регистрам и манипулируешь ими (включаешь выключаешь слушаешь.


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

1) Очень хорошо объясняет как управлять пинами с помощью библиотеки HAL .

http://mypractic.ru/urok-8-upravlenie-portami-vvoda-vyvoda-cherez-funkcii-biblioteki-hal.html

2) Вот неплохое объяснение что такое библиотека HAL :

https://istarik.ru/blog/stm32/119.html

3) По этой ссылке можно почитать про сами регистры на stm32 .На мой взгляд это лучшее объяснение по регистрам которое нашел.

http://mypractic.ru/urok-6-porty-vvoda-vyvoda-stm32.html

4) Здесь же объяснение как можно подергать ножкой через CMSIS

http://mypractic.ru/urok-7-upravlenie-portami-vvoda-vyvoda-cherez-registry-cmsis.html

В целом ознакомившись с этими ссылками можно уже иметь кое какое представление о регистрах.

5) Так как буду работать с uart . Я сошлюсь на статью про сам uart и как с ним работать через библиотеку HAL.

https://istarik.ru/blog/stm32/120.html

Проект можно посмотреть по ссылке на гитхабе :

https://github.com/IzyI/stm32_simple_examples/tree/master/simple_uart

Теперь же приступим к самой сборке Проекта.


Схема примерно такая

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

У меня на макетной плате это выглядит ка кто так :

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Теперь создадим в  CUBEMX  и настроим его тактирование

(про настройку тактирования можно почитать вот здесь http://mypractic.ru/urok-5-sistema-taktirovaniya-stm32.html):

Подключаем керамический резонатор.

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Настраиваем  тактирование:

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Незабываем подключать debag Serial Wire иначе второй раз  у нас микроконтроллер не  прошьется.

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Включаем UART  и включаем  прерывания

ПО прерываниям лучше всего почитать вот эти ссылки:

1) http://mypractic.ru/urok-15-parallelnye-processy-vypolnenie-zadach-v-fonovom-rezhime-pri-pomoshhi-preryvaniya-ot-tajmera.html

2) http://mypractic.ru/urok-18-sistema-preryvanij-stm32-organizaciya-i-upravlenie-preryvaniyami.html

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Настраиваем пины:

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

И генерируем проект.

Осталось  только  скопипасть код с main.c  в ваш проект.


Также надо не забыть зарегестировать функцию HAL_UART_IDLE_Callback. добавив в stm32f1xx_hal_uart.h про это  я расписал в  этой ссылке.  В этой функции мы регистрируем  обработку  флага IDLE .

Этот флаг устанавливается аппаратно при обнаружении незанятой линии. То есть, если в приёмник поступает несколько байт подряд, а потом возникает пауза (линия находиться в состоянии HIGH некоторое время), то взводится флаг IDLE генерирующий прерывание, а мы по этому прерыванию определяем что данные перестали поступать.


Дальше компилируем и собираем, заливаем и радуемся. Ну или не радуемся))

make

st-flash write ./simple_uart.bin  0x08000000

Также для отправки сообщений я написал простенький скрипт на python используя библеотеку pyserial, С помощью  него можно отправить  команду в микроконтроллер:

python3 send.py 1-1

З.Ы. В следущем моем практикуме )). Я соберу  свою отладочную плату на подобие bluePill  с распаянным usb-uart. Код я напишу на  CMSIS, выполнять он будет  тоже самое ,  постараюсь максимально все  покрыть комментариями и все залью на githab.  И наверно я все  же сделаю большую  часть в виде видео.


З.Ы. з.ы. Я не последняя инстанция. Но если что пишите.) 

Показать полностью 10
[моё] Stm32 Stm32f103 Длиннопост Микроконтроллеры
15
102
azhel
4 года назад

Шаблоны C++ для микроконтроллеров⁠⁠

Писать на хабр я не умею и боюсь, а Пикабу - это развлекательно-познавательный портал, так что начну с него:)


В 2019 году в качестве хобби решил попробовать микроконтроллеры, чтение форумов и тематических ресурсов определили, что за основу возьму STM32. Arduino за единицу ресурсов дороже, и в принципе на нее есть всё, что только можно придумать, конкретных задач и проектов у меня не было, поэтому с Arduino делать мне было, по сути, нечего.


Как и многие, первые программы создавались через CubeMX (ныне CubeIDE), светодиодами моргать научился, по UART с компьютером связался, даже USB-HID из примера сделать получилось. Но снова уперся в тот факт, что нет конкретной задачи, так что начал разбираться в вопросе непосредственно программирования: какие есть фреймворки, почему HAL так не любят и т.д. В процессе чтения статей наткнулся на очень интересный подход, связанный с применением шаблонов языка C++. Вот ссылка на оригинальную статью, очень рекомендую к прочтению http://easyelectronics.ru/rabota-s-portami-vvoda-vyvoda-mikr....


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


Например, класс-драйвер дисплея LCD1602 требует указания ему шести ножек GPIO + ширину и длину. Тогда соответствующий шаблонный класс определяется следующим образом

Шаблоны C++ для микроконтроллеров Микроконтроллеры, Stm32, Программирование, C++, Длиннопост

Создание "объектов" (в кавычках) заменяется объявлением нового типа данных:

Шаблоны C++ для микроконтроллеров Микроконтроллеры, Stm32, Программирование, C++, Длиннопост

Все методы классов при шаблонном подходе являются статическими, соответственно вызов осуществляется через оператор разрешения контекста:

Шаблоны C++ для микроконтроллеров Микроконтроллеры, Stm32, Программирование, C++, Длиннопост

Итого, основным отличием от классического объектно-ориентированного подхода является замена создания объекта класса объявлением нового типа (путем инстанцирования некоторого шаблона). Недостатком является тот факт, что каждое такое объявление порождает новый тип данных, все методы дублируются. Однако при программировании микроконтроллеров это несущественно, поскольку вся количество таких типов ограничено количеством используемой периферии (и внешних устройств), а большая часть методов - это запись значения в регистр. Поэтому при включенной оптимизации вызов методов класса вообще сворачивается в inline, что повышает быстродействие. Также использование шаблонов дает возможность существенно ускорить инициализацию периферии путем передачи параметров в качестве шаблонных (если она известна заранее, что весьма логично). В таком случае значения регистров становятся известны еще на этапе компиляции, так что в прошивке можно обнаружить просто запись соответствующего значения в регистр.


Автор указанной статьи разработал и поддерживает библиотеку "mcucpp" (github.com/KonstantinChizhov/Mcucpp), однако ее сложно использовать "из коробки". Сам подход мне очень понравился, поэтому я решил попытаться "прибраться" в том, что сделал и делает Константин, применить нововведения стандарта c++ 17 (а их много как раз в части метапрограммирования), написать документацию и примеры, которые снизят порог вхождения. В результате медленно, но развивается проект Zhele (github.com/azhel12/Zhele), где я неторопливо собираю великолепные идеи Константина Чижова (автором перенятого кода указываю его, если вдруг у кого-то появится вопрос), пытаюсь покрыть различные МК (сейчас у меня в арсенале f030f4, f072rbt, f103c8, f401cc), написать Doxy-документацию, написать примеры и проверить их.


Если вдруг у кого-то будут силы и желание посмотреть примеры и выразить замечания и предложения, буду рад. Пока энтузиазм, к счастью, не пропал. На работе преподаю помимо прочего C++, так что развитие проекта для меня - это в первую очередь упражнения в новых фишках языка.


В планах дописать классы основных интерфейсов (хотя бы i2c, который меня пока пугает), начать реализовывать драйверы популярных устройств (возможно, некоторым студентам будет интересно попробовать). Также очень хочу разобраться в языке шаблонов CubeMX (CubeIDE), чтобы из куба генерировался проект сразу на разрабатываемой библиотеке.


UPD: нашел результаты эксперимента годичной давности (с тех пор я что-то все-таки улучшил + новые версии компиляторов, возможно, еще сильнее оптимизируют). На разных фреймворках сделал одну и ту же задачу для Stm32F103: сконфигурировать тактивание (на частоту 72 Мгц), настроить выход GPIO для управления светодиодом, настроить таймер на ежесекундное прерывание, в обработчике прерывания от таймера переключить светодиод. Допускаю, что написал не идеальные решения, но задача простая, что позволяет предполагать небольшое влияние этого факта.

Шаблоны C++ для микроконтроллеров Микроконтроллеры, Stm32, Программирование, C++, Длиннопост
Показать полностью 4
[моё] Микроконтроллеры Stm32 Программирование C++ Длиннопост
60
52
RamzessII
4 года назад

Одна голова хорошо, две лучше. Программирование микроконтроллеров⁠⁠

Всем привет. Вот уже чуть больше года я занимаюсь программированием микроконтроллеров. Начинал как и все школьники с ардуино а потом уже перешёл на чистые АВР. Скажу вам следующие придумывать и реализовывать свои проекты то ещё занятие. Так как времени этому уделяешь крайне мало.
Бывает прийдешь вечером с работы с мыслью что нибудь покодить а пока поел, залип в Ютубе уже и спать пора. Вообщем нужна была какая нибудь мотивация.
И вот я пишу этот пост. Тут хочу найти человека который тоже хочет более серьезно углубить свои познания в микроконтроллерах. Предлагаю изучать вместе. Как я себе это вижу: сидят два три чувака в дискорде и курят даташит на микросхему, паралельно пишут код и просто приятно общаются. Если среди читающих есть такие люди, прошу отписаться в комментах.
В идеале начать изучать стм32.
Спасибо за внимание)

Одна голова хорошо, две лучше. Программирование микроконтроллеров Микроконтроллеры, Программирование, Atmega, Stm32
Показать полностью 1
Микроконтроллеры Программирование Atmega Stm32
76
17
DeDLINe
DeDLINe
4 года назад

Моё первое знакомство с stm32⁠⁠

Доброго времени суток всем!
Решил начать освоение микроконтроллеров семейства stm32, да не с отладочных плат типо ардуины, а с "голого" камня.
Выбор пал на STM32F030* т.к. этот камень достаточно производительный для моих нужд, да и цена довольно приятная...
Первым делом сделал небольшую плату, чтобы удобнее было работать с МК. Подвёл питание через 1117, сделал отдельные выводы для прошивки и т.п.
Для написания прошивки (как же громко сказано ;) ) использовал фирменную среду разработки CubeMX.
В общем спустя пару часов лежит на столе платка, моргает светодиодом, на осциллографе красивый "сердечный" ритм, а у меня улыбка от уха до уха. Как будто узнал, что стал папой =)

[моё] Stm32 Микроконтроллеры Своими руками Без рейтинга Текст
43
4
DeDLINe
DeDLINe
4 года назад

Ищу помощи со схемой на микроконтроллере⁠⁠

Доброго времени суток!
Ищу кого-нибудь, кто поможет разобраться с микроконтроллерами семейства stm32.
Хочу реализовать небольшой проект, но т.к. ни разу не работал с микроконтроллерами (готовые схемы не в счёт), ищу того, кто поможет разобраться. Хотя бы в азах...
Желательно для связи ВК. (ID как ник тут)

[моё] Микроконтроллеры Stm32 Текст Без рейтинга
35
14
AncientGoo
5 лет назад
Arduino & Pi

Нужен совет по настройке STM32F401 и USART в частности⁠⁠

Пытаюсь разобраться в программировании этого контроллера и при попытке настроить USART для приема/передачи данных возникла проблема:
Пытаюсь принять байт и после нажатия кнопки отправить его обратно, но на выходе получается совсем не то что ожидаю.


При отправке 0 должно вернуть 0, но возвращает вот это. В чем может быть проблема?


ASCII  BIN  DEC  HEX

Нужен совет по настройке STM32F401 и USART в частности Stm32, Си, Микроконтроллеры, Без рейтинга, Длиннопост

Подозрения падают на настройку baud rate, но вроде всё как в мануалах.

Полный код:#include "stm32f4xx.h"

#include "stm32f4xx_hal_gpio.h"

#include "stm32f4xx_hal_rcc.h"

#include "stm32f4xx_hal_cortex.h"

#include "stdint.h"

#include "math.h"


//define Internal RC frequencies

#define XTAL 16000000UL


//define busses prescalers

#define AHB_PRE 1

#define APB1_PRE 2

#define APB2_PRE 1

#define SysTicksClk 10000


//calculate peripheral frequencies

#define SYSCLK 84000000

#define AHB SYSCLK/AHB_PRE

#define APB1 AHB/APB1_PRE

#define APB1_TIM APB1*2

#define APB2 AHB/APB2_PRE

#define APB2_TIM APB2*1

#define SysTicks AHB/SysTicksClk

#define USART_BAUDRATE 19200

#define BUF_LEN 1


struct Data

{

char Msg[BUF_LEN];

} Message;


void USART2_IRQHandler(void)

{

if (!(USART2->SR & USART_SR_TXE))

{

if (Message.Msg[0] == (char)0x00)

GPIOA->ODR |= 1 << 1;

if (Message.Msg[0] == (char)0x01)

GPIOA->ODR |= 0 << 1;

}

if (USART2->SR & USART_SR_RXNE)

{

Message.Msg[0] = USART2->DR;

}}


int main()

{

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |

RCC_AHB1ENR_GPIOBEN;

GPIOA->MODER |= 1 << 1*2; //Set GPIOA pins output mode

GPIOB->MODER |= 0 << 0*2;

GPIOA->MODER |= 0xA0;

GPIOA->AFR[0] |= 0x7700;


RCC->APB1ENR |= RCC_APB1ENR_USART2EN;


USART2->CR1 |= USART_CR1_UE; //usart enable

USART2->CR1 |= USART_CR1_TE; //transmitter enable

USART2->CR1 |= USART_CR1_RE; //receiver enable


float div = (float)APB1 /(16*(float)USART_BAUDRATE);

int integer = APB1 / (16*USART_BAUDRATE);

float flo = (div - (float)integer)*16;

int floatt = round(flo);

USART2->BRR = (( integer << 4 ) + floatt);


NVIC_EnableIRQ(USART2_IRQn);

USART2->CR1 |= USART_CR1_TXEIE;

USART2->CR1 |= USART_CR1_RXNEIE;


int i;


while(1)

{

if (!(GPIOB->IDR & GPIO_IDR_ID0))

{

i = 1;

}

else

{

if(i == 1)

{

USART2->DR &= Message.Msg[0];

while(!(USART2->SR & USART_SR_TC));

i = 0;

}}}}


Сама схема:

Нужен совет по настройке STM32F401 и USART в частности Stm32, Си, Микроконтроллеры, Без рейтинга, Длиннопост
Показать полностью 1
[моё] Stm32 Си Микроконтроллеры Без рейтинга Длиннопост
26
10
Mrtrol2018
5 лет назад

AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать⁠⁠

AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать Stm32, Аудиофилия, Схемотехника, Печатная плата, Микроконтроллеры, Радиолюбители, Электроника, Длиннопост

Предисловие

У меня дома есть пара комплектов хороших советских акустических систем. Но техника эта довольно старая и просто не может включаться с пульта или автоматически, а постоянно подходить к усилителю звука и включать/выключать его просто лень. Это проблему я и решил. Сначала была куплена ардуино и проект был сделан на ней, но качество работы меня не устроило и проект был переделан под STM32F103C8. В итоге у меня получилось устройство, которое имеет 4 аудио-входа, 1 аудио-выход, вход 220В и выход 220В. При наличии хотя бы одного активного аудио-входа на выходе 220В появляется напряжение, тем самым включая усилитель звука, и активный аудио-канал передается на выход.

Сложности при разработке

Казалось бы все просто: если АЦП получает не 0, тогда считать канал активным. Все почти так, но это работает только если включить источник аудио-сигнала и выключить на нем звук. При выключенном состоянии разные устройства дают разные помехи, тк они не полностью обесточены. Да и у плохих источников звука микроконтроллер мог улавливать помехи при выключенном звуке, причем довольно сильные. И это именно помехи источника, помехи на моей внешней аудиокарте STMка не видит, более того тихий звук с нее — 0.

Как сделать себе такое?

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

Что нам понадобится:

печатная плата
программатор ST-Link v2
1 чип STM32f103C8
4 реле для коммутации входного аудио-канала на выход
1 реле для коммутации 220В для включения усилителя
AC-DC понижающий преобразователь 220В — 5В(можно взять со старой зарядки телефона)
сетевой провод и разъем для подачи тока нашему устройству и усилителю
розетка
резисторы, конденсаторы и другая мелочь

Естественно нам понадобятся аудио-провода и minijack штекера с гнездами.

Хотелось бы заострить внимание на выборе реле… Если с выбором 220В реле все предельно понятно: оно должно «уметь» коммутировать 220В переменное напряжение и управляться 3.3В. То с выбором звуковых реле не все так просто. Далеко не каждое реле, даже твердотельное, не будет давать помехи на выходе, а нам это очень важно. Я живу в Минске и не смог ничего найти подходящего и по адекватной цене, поэтому были заказаны с известного китайского магазина 4 реле PVT322A. Возможно в вашем регионе вы сможете найти что-то подешевле.
Схема и разводка печатной платы :

AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать Stm32, Аудиофилия, Схемотехника, Печатная плата, Микроконтроллеры, Радиолюбители, Электроника, Длиннопост
AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать Stm32, Аудиофилия, Схемотехника, Печатная плата, Микроконтроллеры, Радиолюбители, Электроника, Длиннопост

Раз уж начали, то продолжим изучать аппаратные особенности. На схеме, которую вы можете найти в репозитории в папке Eagle нужно подобрать токоограничительные резисторы(R4-7) под ваши реле. В моем случае это 30 Ом. Так же есть катушка L1: выбирайте любой фильтр, сглаживающий высокочастотные помехи.

Заказать печатную плату вы можете на PCBWAY или JLCPCB. Цены у них низкие, я заказывал у JLCPCB и они выставили мне счет всего в 2$. При заказе печатной платы вам нужны будут гербер файлы, вы из сможете найти все в той же папке или сами сгенерировать.

Перейдем к программной части


Рассказывать как подключить программатор к компьютеру, установить среду программирования и драйвер я не буду, т.к. этих инструкций очень много и они предельно доступные. На моей схеме предусмотрены выходы для программаторы. Я использовал Visual Studio 2017 + VisualGDB. Скачав проект из того же репозитория мы сможем открыть проект. Сразу же обратим на файл Settings.cpp.

#define DEBUG0 0//init USART and send all measurement values
#define DEBUG1 1//init USART and send information about recognition music or not
#define DEBUG2 0//just init USART
#define MaxEqualToZeroValue 3 //the value which equal or less is equated to zero
#define MaxAvarageForNoise (float)0.4//this is max avarage of measurement values so that the sound is considered noise for NOT active channel
#define MaxAvarageForActiveNoise (float)0.06//this is max avarage of measurement values so that the sound is considered noise for active channel
#define CountOfConsecutiveZeroValueForNoise 250//if count of consecutive zero values bugger it that sound is equated to noise
#define MinCountOfZeroValue 550//it's minimum count of zero values to equate to music(not consecutive)
#define USE_LED 1
#define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC
#define LED_GPIO_GROUP GPIOC
#define LED_GPIO_PIN GPIO_Pin_13
#define USE_AMP 1
#define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB
#define AMP_GPIO_GROUP GPIOB
#define AMP_GPIO_PIN GPIO_Pin_12

Все настройки в этом файле задокументированы, но мы все равно остановимся на каждой настройке.
#define DEBUG0 0
#define DEBUG1 1
#define DEBUG2 0

Если присвоить дефайну DEBUG0 единицу, то наше устройство перестанет что либо делать, кроме того, что выводить по UARTу значения, которые он получает с аудио-входов в формате, который может «переварить» SerialPortPlotter. 

Если же присвоить единицу DEBUG1, то устройство уже будет полностью функционировать, но будет выводить немного информации о работе по UARTу. Это все нужно исключительно для отладки.

Присвоение DEBUG2 даст всего лишь инициализацию UARTа. Если вы не понимаете, зачем это, то и не надо :-)
#define MaxEqualToZeroValue 3

Далее у нас параметр отвечающий значение которого или менее будет считать нулем. Как уже было ранее сказано некоторые источники звука плохого качества и сильно зашумлены.
#define MaxAvarageForNoise (float)0.4

Если аудио-канал сейчас не активен(т.е. канал, который сейчас не коммутируется на выход) и среднее значение измерений за один цикл измерений по этому каналу меньше значения этого параметра, то канал считается без звука.
#define MaxAvarageForActiveNoise (float)0.06

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

#define CountOfConsecutiveZeroValueForNoise 250

Этот параметр исключительно для оптимизации расхода процессорного времени. Если устройство встречает подряд заданное количество нулей, то оно считает, что это сигнал не звук.

#define MinCountOfZeroValue 550

А это уже важная настройка. Некоторые устройства, когда выключены создают странные помехи, но я выделил один общий фактор среди них: они очень редко опускаются до нулевых значения. Именно поэтому пришлось ввести этот параметр. Если количество нулевых значений за один цикл измерений меньше заданного, то сигнал считается шумом.

#define USE_LED 1
#define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC
#define LED_GPIO_GROUP GPIOC
#define LED_GPIO_PIN GPIO_Pin_13 #define USE_AMP 1
#define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB
#define AMP_GPIO_GROUP GPIOB
#define AMP_GPIO_PIN GPIO_Pin_12

Данный блок предельно понятен для тех, кто уже программировал микроконтроллеры. Он выбирает пин на котором будет расположен светодиод и выход на реле управления усилителем. Если Вы не будете изменять мою схему, то эти параметры Вам не нужны.

Перейдем к следующим настройкам:

Открыв файл main.cpp, в самом начале функции
int main()

вы найдете определение кучи переменных.

Остановимся на этом поподробней. Там достаточно много параметров, отвечающих за аппаратую настройку микроконтроллера. Их мы затрагивать не будем.
const uint8_t channelsCount = 2;


Это количество входных аудиоканалов, которые будут использоваться.

const uint8_t countOfIterationsForSwitch = 5;


Количество циклов измерения, необходимое для изменения состояния активное/пассивное.

const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;


Этот параметр отвечает за качество измерения. Оно установлена максимальное, не рекомендую его менять
const uint16_t measurementsDuration = 2000;


Это время в ms, в течение которого будет производится один цикл измерений.

const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };


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

Заключение


Ну вот и все. Все необходимые настройки я описал. Осталось только собрать схему, скомпилировать проект, залить прошивку в микроконтроллер и радоваться.

В заключении хотелось бы сказать, что нельзя просто так оставить входной аудио-провод «не воткнутым» ни во что, нужно его вставить в какое либо устройство или заглушку в виде гнезда minijack, в котором все контакты соединены между собой. 

AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать Stm32, Аудиофилия, Схемотехника, Печатная плата, Микроконтроллеры, Радиолюбители, Электроника, Длиннопост

Если у вас источники звука довольно хорошие, то вы можете поставить низкие параметры настроек, но для переключения состояния звука может потребоваться его выключение (не из розетки). Возможно когда нибудь я добавлю ссылку на 3D модель корпуса, но пока у меня нет 3D принтера и корпус на данный момент такой. Но это только пока: 3D принтер уже собирается :-)

AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать Stm32, Аудиофилия, Схемотехника, Печатная плата, Микроконтроллеры, Радиолюбители, Электроника, Длиннопост

Спасибо за прочтение.
Статья на хабре

Показать полностью 4
[моё] Stm32 Аудиофилия Схемотехника Печатная плата Микроконтроллеры Радиолюбители Электроника Длиннопост
7
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии