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

Головоломка. Болты и Гайки

Казуальные, Гиперказуальные, Головоломки

Играть

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

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

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

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

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

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

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

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

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

Электроника Arduino Программирование Своими руками Самоделки Радиолюбители Все
33 поста сначала свежее
9
sparsw
3 месяца назад

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6⁠⁠

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Недавно узнал о простейшей схеме с названием R2R-ЦАП, а поскольку являюсь совсем уж начинающим радиолюбителем, то решил ее реализовать. С одной стороны это вполне себе цифровая схема, а с другой стороны на выходе получается аналоговый сигнал. Вполне себе учебная "задачка" из разряда "помигать светодиодом". Ну а в заметке опишу, что же в итоге удалось получить - вдруг опытные и знающие люди подскажут и помогут теми или иными ценными советами :), которые будут также полезны и всем другим начинающим радиолюбителям.

Для начала на макетной платке припаял резисторы. В качестве номинала взял 100 Ом и 200 Ом. Почему такие номиналы? Ну какие-то надо было взять. Так что выбор номиналов был по сути случайный. Изначально сделал в ЦАПе 12 бит, но в последствии использовал из них только 10 бит. Дело в том, что smd-резисторы с типоразмером 0805 брал самые простые. Точность номинала на них указана в 5%, что изначально должно ограничить характеристики схемы. Поэтому сразу возникла идея провести для получившейся схемы минимальную калибровку, поскольку правильные значения на выходе R2R-ЦАПе получаются только при "идеальном" значении резисторов. На плате STM32F103C6T6 в наличии имеется 12-битный АЦП, при этом пишут, что такой ЦАП имеет внутренние шумы, а значит делать калибровку для ЦАПа, работающего в режиме 12-бит, вряд ли имело смысл. Вот и ограничился в итоге для ЦАПа 10-битами.

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Тот самый R2R-ЦАП на 12 бит

Итак, самый первый сигнал который стал формироваться с помощью получившегося ЦАПа - это пила, то есть повторяющиеся кусочки простой линейной функции.

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

простой линейный сигнал

Здесь сделаю небольшое отступление про осциллограф. Чтобы в целом придерживаться формата "Опыт начинающего радиолюбителя". Когда выбирал свой первый и на данный момент единственный осциллограф, то самым главным критерием для меня была ... Угадали? Да, конечно это была цена. В ситуации, когда не было никакого опыта выбора осциллографов, брал самый дешевый. И это оказался Fnirsi 1014D, который обошелся мне в 11'625 рублей. Возможно "цифровой" Hantek обошелся бы дешевле, причем с лучшими характеристиками, но хотелось получить осциллограф именно с экранчиком, все как у настоящих осциллографов, чтобы все было по "взрослому". Покупал естественно на aliexpress. И еще наверное меня очень сильно подкупило, что доставка была всего 5 дней, видимо сразу со склада в России. Иногда, особенно по началу так тягостно ждать очередной посылки с aliexpress. И как это обычно бывает самые "полезные" обзоры, в которых был полный разгром данной модели, попались уже после покупки. Но лично мне данный осциллограф тем не менее помог очень сильно и не раз. Например, без него в принципе не смог бы разобрать свои ошибки в программировании SPI-обмена с платой WizNet 5500. Ну и еще такой момент. Когда в старших классах был физический практикум (привет "Трем Кубикам" :)), то пару занятий были посвящены работе с осциллографами. А это были еще старые советские осциллографы, с люминофорными экранами. Это было волшебно! Щелкать тумблерами, ждать пока осциллограф немного прогреется. Но занятий было всего пару штук. И наиграться тогда вдоволь не получилось. Но это удалось сделать с Fnirsi :). Закрыть так сказать гельштат.

Напишу также пару слов и про плату WizNet 5500 и плату STM32F103C6T6 со всеми ее "коварствами" после STM32F103C8T6. Плата WizNet 5500 позволяет, где-то за 300-350 рублей (последние цены не смотрел) снабдить bluepill-плату ethernet-интерфейсом, при этом сразу с UDP и TCP соединениями на уровне wiznet-библиотеки для микроконтроллера, реализованными в wiznet-чипе аппаратно. Мне разобраться в примерах было не просто, но так или иначе установить tcp-соединение с компьютером в итоге получилось. Естественно изначально хочется зарезервировать скорость обмена по-больше, про запас, а то вдруг потом не хватит! Поэтому настроил SPI на stm'ке на 36 МГц. Но реализовав обмен по tcp-сокетам заметил, что часть пакетов иногда теряется. И этого в tcp!!! Без разрыва сокетного-соединения!!! Да как такое вообще возможно!!! Но тут скорее все дело в том, что максимальная заявленная скорость для Wiznet 5500 по SPI - это 33 МГц (как обычно совершенно случайно где-то на просторах интернета встретил такие строки). Снижать скорость на SPI до 18 МГц еще не пробовал. Но с микроконтроллерами постоянно какие-то "обломы". Вот только что все работало. Добавил пару строк в прошивку - и вот уже не работает ничего, а самое главное не получается вернуться на работающие состояние :(((. Но зато как приятно и спокойно становиться, когда разбираешься в причинах очередного "косяка".

Теперь, чем же надо мной так "подшутила" плата STM32F103C6T6. И дело тут, не подумайте плохого, вовсе не в жадности, а дело тут в самой что ни на есть, мать ее, экономии, потому что "гадость", но зато на свои. Платы STM32F103C8T6 продаются за 130-150 рублей. (Возможно это все нелицензионные копии, но мне на неработающие платы попадать не приходилось, тут стараюсь смотреть на рейтинг магазина.) Немного добавишь, и уже blackpill на 84 МГц заместо 72МГц от 180 рублей можно найти. А вот STM32F103C6T6 находятся за 90-100 рублей (и это если не сильно долго искать). В общем жаба начинает душить во всю мочь. Ну подумаешь там 10Kb и 32Kb флеш-памяти заместо 20Kb и 64Kb. Мне вполне вроде бы этого хватает. Короче так я подумал, заказал и забыл. Совсем забыл, что заказал STM32F103C6T6. А когда стал заливать прошивку - бац, и ничего не работает. Диодики не мигают. Что делать? Неужели платка превратилась в кирпич. А за ней еще одна. А за ней еще одна. Ужас охватил меня... Так что пришлось тут научиться подключать отладчик gdb с помощью st-util (спасибо, добрым товарищам написавшим посты про это на форумах). И затем вслед за микроконтроллером впадать в ступор, когда самая обычная, самая первая операция ST выводит микроконтроллер в астрал. И только потом обратить внимание на эти самые 10Kb, которые как в ничем не бывало оказывается печатает программа прошивки в консоль, и что надо править ld-скрипт для изменения установки начального адреса стека. А еще таймеров там меньше, и SPI'ев меньше, а самое неожиданное - там еще и GPIO-портов меньше доступно, что уже совсем подло, с учетом того, что внешне платы ну ничем не отличаются. Но пенять тут надо конечно только на себя самого.

00111111b -> 01000000b

Вот в такие моменты результирующие значения напряжения и могут "проседать". Но то что без использования (безумно дорогих) прецензионных резисторов в ЦАПе будут искаженные выходные значения вполне допускалось. При измерении итоговых значений на выходе ЦАПа для каждого 10-битного значения делалось усреднение по 32 измерениями. При повторном проходе все средние значения в целом подтвердились, однако чувствительная дисперсия все-таки наблюдается. Но тут и собрано все на коленках, и проводки не экранированы (подсмотрел такое оправдание в интернете), и шумы в АЦП есть, так что танцоры если что мы хорошие, а это все они - те самые шумы. Еще тут конечно можно задаться вопросом, а насколько постоянный уровень напряжения на ножках микроконтроллера (использование powerbank'а в качестве источника напряжения видимого эффекта не дало). Но для проверки нужна видимо аппаратура совсем другого класса и стоимости. А откуда все это у простого начинающего радиолюбителя? Тем не менее приведу график построенный из измеренных значений:

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

График измерений реальных значений ЦАПа

Как видно значения ЦАПа вместо линейной функции выдают почти "линейную" функцию со скачками. Но раз таблица получена, то можно для каждого значения, которое нужно получить на выходе из ЦАПа найти такую комбинацию из 10 битов, которые дадут наиболее близкое значение к требуемому. И тогда простой сортировкой для конкретной платы ЦАПа получается таблица обратного поиска, по которой для требуемого значения находится оптимальная комбинация битов. И вуаля, у нас получается второй график, на котором все возможные значения на выходе из ЦАПа, уже выстроены в монотонную функцию:

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Линейная функция и ее аппроксимация табличными значениями

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

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Линейная функция и ее аппроксимация табличными значениями (увеличен масштаб)

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

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

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Синусоида из 32 значений не период

В целом удалось получить гармонический сигнал с частотой в 204 КГц, ну или почти гармонический сигнал :). Как писать оптимальные циклы для микроконтроллера не знаю, я сделал (на Си) простой бесконечный цикл из LD, ST, ADD и AND, где операция AND обрезает индекс после инкремента и тем самым зацикливает чтение. С этой точки зрения цикл для сигнала с длиной равной степени двойки будет наиболее быстрым. А потому будет давать более высокую частоту сигнала. По моим прикидкам длительность одной итерации цикла составляет 6МГц, то есть с такой частотой можно менять значения сигнала, длина которого есть степень двойки (32*204КГц = 6.528МГц).

Теперь попробуем увеличить частоту гармонического сигнала, для чего возьмем всего 6 точек на один период синусоиды и не будем при этом слишком строги к результату :)

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Синусоида из 6 точек на период

Да, это тоже синусоида. Ну и что не синусоидная. Зато частота в 857КГц. И потом все очень сильно зависит от масштаба и точки взгляда :). Возьмем, например, предыдущую синусоиду и сделаем из нее конфетку простым изменением масштаба по времени и амплитуде. При подходящем масштабе для 32-точечной синусоиды все ОЧЕНЬ ГЛАДКИМ становится и "шершавости" совсем незаметны:

Быстро сказка сказывается, да не скоро дело делается. А как же фильтры нижних частот спросите Вы. А как же, слыхали и про них, слыхали. И даже такое страшное название как ФНЧ-Баттервота 7-ого порядка встречать доводилось. В интернете и не такое можно встретить. Благо найти и онлайн ФНЧ-калькулятор не сложно. Но есть две загвоздки. Опять не очень понятно как правильно выбирать сопротивление (согласование каскадов, входное и выходное сопротивление, импеданс - все это пока страшные заклинания). А вторая загвоздка более серьезная - в наличии у меня были индуктивности только на десятки и сотни нГн, а вот на десятки и единицы мкГн - увы, не ма. И приедут они только через несколько недель. А именно такие значения индуктивностей выдает онлайн калькулятор для частоты среза в 2-3 МГц. Единственное, что оставалось так это допаять RC-фильтр (первого порядка?). Снова берем значение резистора наобум и выбираем 560 Ом. Подбираем значение конденсатора в 180пФ, чтобы частота среза была примерно 1.6МГц.

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

R2R-ЦАП после добавления RC-фильтра (то есть резистора и конденсатора)

И в принципе для 32-точечной синусоиды даже RC-фильтр заметно помогает. Она действительно становится практически гладкой, ну насколько об этом можно судить из осциллографа:

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

Животворящий ФНЧ для 32-точечной синусоиды, пусть он всего лишь и RC

Кое-что RC-фильтр делает и для 6-точечной синусоиды, хотя уже и не так много:

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6 Микроконтроллеры, Stm32, Самоделки, Обучение, Видео, Короткие видео, Длиннопост

RC-фильтр пытается помочь 6-точечной синусоиде стать более гармоничной

К сожалению попробовать что-нибудь по-солиднее, чем RC-фильтр пока нет возможности. Поэтому вопрос, а можно ли получить приличную синусоиду на 1МГц с помощью STM32F103C6T6 (работающей на частоте 72МГц) и R2R-ЦАПа лично для меня пока остается открытым.

Итого подведем небольшой итог. Стоимость STM32F103C6T6 составляет порядка 100 рублей. Кусочек текстолита с набором SMD-компонент в лице резисторов, конденсаторов и индуктивностей (для Баттерворта 7-ого порядка) оценим также в 100 рублей. Соответственно получаем ЦАП за 200 рублей для сигнала с частотой на 200КГц, возможно с достаточно произвольной формой по частоте и амплитуде. А вот можно ли выправить фильтрами синусоиду с частотой в 1 МГц из 6 точек на период пока не понятно.

Есть конечно AD9834, который выдает синусоиду аж на целых 37.5МГц, но стоимость готовой платки, если не ошибаюсь, начинается уже от 1800 рублей. Сам чип возможно получиться и за 700-800 рублей найти (а то и 500 рублей), но тогда надо самому делать плату. А сны про черную и белую магию уровня "развести плату" пока только сами снятся в других снах :). Да и 37.5МГц тоже как бы не предел мечтаний. Но самое главное, что хотя на плате два выхода, на самом деле это один сигнал. Дифференциальный это сигнал или нет, да и что такое это самое дифференциальный сигнал и как с ним работать для меня сплошная тайна.

Есть AD9851, у которого вроде бы две синусоиды и максимальная частота уже 70МГц. Это уже почти хорошо, но это надо проверять. Можно ли эти синусоиды синхронно сдвинуть ровно на четверть периода и действительно ли их две независимых. Цена у AD9851 при этом уже более комфортная. Тем не менее пишут, что шумов много, а реальная максимальная частота скорее 50МГц - 60МГц. Малова-то.

Есть еще конечно и AD9959 с ценой готовой платы от 6000 рублей. Там сразу 4 выхода и частота синусоиды уже вроде как 200МГц, а это уже предел (текущих) мечтаний. Но 6000 это 6000. Кроме того, странно что выхода на плате 4, а вот сигналы у самого чипа вроде как тоже сдвоенные (дифференциальные?), а значит выходов должно быть 8. Не понятно. В общем цена у AD9959 пока совсем не "симпатичная".

С другой стороны продаются платы с ADF4351, который уже не DDS, а именно, что генератор частоты, если конечно правильно все понял. Там цена готовой платы уже где-то в районе 1700 рублей (видимо недавно цена на них снизилась, может быть много их наклепали). И частоты от 35МГц до каких-то сказочных и фантастически-невозможных 4.4ГГц, и вроде бы два выходных сигнала. Но опять это похоже сдвоенные выходы одного сигнала. Есть у ADF4351 и вход для внешней clock-частоты. Но что это за частота, какая форма сигнала допустима и как она влияет на выходной сигнал. Что-то вроде бы написано про задержку фазы, и если задержку фазу действительно можно настраивать, то на первый взгляд из двух ADF4351 при общем источнике внешней частоты можно собрать две синхронных синусоиды. Да еще с практически с любой частотой, хоть 1ГГц. Но так ли это на самом деле.

Если все-таки немного еще пофантазировать и помечтать, то для повышения частоты R2R-ЦАПа напрашивается использование ПЛИС. И есть даже OMDAZZ с его частой в 50МГц. Лежит, пылится, все по принципу как знал, как знал, что "пригодится". Наверное, можно с OMDAZZ вытянуть частоту синусоиды до ~10МГц, если выход действительно можно сгладить фильтрами. Осталось только чуть-чуть освоить verilog и сделать первую самую простенькую прошивку - делов-то (впрочем, если серьезно, то осваивать verilog по принципу google/yandex-поиск и копи-паст все равно наверное придется). Если гипотетически рассмотреть условно восемь параллельных выходов, которые соединяются электронными ключами, то тем самым получается буферизация для выходного сигнала. А переключение идет с помощью счетчика, тактируемого с частотой умноженной в 8 раза по сравнению с частотой ПЛИС, при этом все 8 выходов устанавливаются за один такт ПЛИС. Вот только логических элементов с частотой переключения ~500МГц как-то не наблюдается на горизонте. Пара ADF4351 выглядит перспективней по частотам, но поди их собери вместе. И тогда видимо альтернативы для платы с AD9959 и ее ценой в 6000 рублей для получения двух синхронных синусоид с частотой 100МГц, сдвинутых относительно друг друга на четверть периода, похоже не особо просматривается.

UPD:

пропущенный абзац перед
00111111b -> 01000000b

Однако вернемся к R2R-ЦАПу и линейному сигналу. Как видно просто из картинки в сигнале есть скачки. Самый сильный скачок так раз по середине сигнала. В принципе как потом стало ясно из калибровки, то есть оцифровки сигнала через ЦАП все той же STM-платы, что точки скачков кратны степеням двойки. И можно предположить, что связаны они с переходом от предыдущих значений к следующим значениям, большим на единичку, когда значительное количество младших битов заменяется на один старший бит:

UPD2:
Как оказалось тема калибровки на просторах интернета все-таки поднималась. Например, вот здесь: https://www.eevblog.com/forum/projects/r-2r-ladder-dac-calib...
Там кстати есть точно такая картинка с экрана осциллографа для линейной функции. И там ровно все те же скачки в точках, кратным степеням двойки. Похоже гуглить надо так:
"r2r dac calibration"

Показать полностью 11 2
Микроконтроллеры Stm32 Самоделки Обучение Видео Короткие видео Длиннопост
7
4
erinaceto
erinaceto
5 месяцев назад
Серия Технические заметки

Stm32 без IDE — памятка 2: мигаем светодиодом и кое-что ещё⁠⁠

Итак, в прошлый раз мы (надеюсь, и вы тоже) собрали и запустили при помощи консольных программ проект, созданный (и первично собранный) в STM32 CubeIDE. Теперь немного освоимся в нём.

Напомню, у нас есть структура каталогов проекта с исходными файлами (обратим внимание на Core и Drivers), а также аналогичная ей структура в подкаталоге Debug с правилами для сборки исходников в исполняемый файл. (Debug — это на самом деле название профиля сборки; по умолчанию кубик создаёт ещё Release, но, как нетрудно догадаться, он неудобнее для отладки, так что мы его собирать не будем; принципиальной же разницы между ними нет.)

Прежде чем переходить к заявленной заадаче, давайте потыкаем палочкой систему сборки (дело в том, что нам понядобится добавить в неё некоторые новые файлы, так что идём последовательно).

Создадим (любым текстовым редактором; хотя, конечно, Writer или Word будут для этого весьма некстати) файл Core/Src/our_file.c следующего содержания:

int value = 0;

И Core/inc/our_file.h:

extern int value;

Затем в Core/Src/main.c после строки /* USER CODE BEGIN Includes */ добавим #include "our_file.h", а в суперцикл добавим value ++;

/* USER CODE BEGIN WHILE */

while (1)

{

value ++;

Попробуем собрать:

aleksei@RNWS-008 /home/adk/STM32CubeIDE/31-live/lesson1/Debug $ make all | grep -v arm-none-eabi-gcc
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-no
ne-eabi/bin/ld: ./Core/Src/main.o: in function `main':
/home/adk/STM32CubeIDE/31-live/lesson1/Debug/../Core/Src/main.c:96: undefined reference to `value'
collect2: error: ld returned 1 exit status
make: *** [makefile:64: lesson1.elf] Ошибка 1

Понятно, в чём дело: компилятор не знает о файле our_file.c, где идёт выделение памяти под переменную value. В GUI кубика мы в таком случае нажимаем ПКМ на нужном файле → Resource configuration → снимаем галочки «Exclude from build». Стало быть, некий аналог этих галочек есть и в генерируемых кубиком makefilах. Откроем файл Debug/Core/Src/subdir.mk. Здесь три переменных — C_SRCS, OBJS и C_DEPS. Первая содержит все исходные файлы текущего каталога, вторая — получающиеся из них объектные файлы. Добавим в них строчки с именем нашего файла и соответствующим объектником:

C_SRCS += ../Core/Src/our_file.c#

OBJS += ./Core/Src/our_file.o#

Признаться, мне больше нравится такой синтаксис, чем склеивание строк через бэкслеши, но если вы решите добавлять строки в сите кубика, не забывайте про пробелы перед бэкслешами. Последняя переменная (C_DEPS) нужна больше для внутренний надобностей CubeIDE, но для единнобразия можете добавить и строчку для неё (по аналогии — базовое имя файла + расширение .d). В системе сборки кубика есть небольшая нелогичность: чтобы добавить объект в сборку, должно не только присутствовать правило для его сборки в файле subdir.mk, но его ещё нужно внести в общий список объектов проекта. Откроем файл Debug/objects.list и добавим в него строку

"./Core/Src/our_file.o"

Теперь соберём ещё раз проект (make), переключимся на терминал с отладчиком (arm-none-eabi-gdb) и нажмём Ctrl-C, чтобы приостановить выполнение прогарммы (аналогично нажатию кнопки «Pause» в интерфейсе CubeIDE). Вновь дадим команду load. Отладчик при этом определит, что файл был обновлён с последнего запуска, и загрузит новый файл в микроконтроллер. Вновь запустим и приостановим программу:

(gdb) load
…

Transfer rate: 13 KB/sec, 1104 bytes/write.
(gdb) b main
Breakpoint 4 at 0x80005d8: file ../Core/Src/main.c, line 105.
(gdb) c
Continuing.

Breakpoint 4, main () at ../Core/Src/main.c:105
105  HAL_Init();
(gdb) p value  
$5 = 0
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
HAL_GetTick () at ../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c:325
325  return uwTick;
(gdb) p value  
$6 = 16850
(gdb)

Отлично. Работает.
Маленькое пояснение: сперва я установил бряк на начало функции main. Дошёл до неё командой c(ontinue). Проверил состояние переменной value (сразу после загрузки прошивки проверять value бессмысленно: она ещё не инициализирована). Продолжил выполнение программы и тут же остановил её уже вручную, комбинацией Ctrl+c. Отладчик написал мне, где я нахожусь, за что ему спасибо, а затем я ещё раз проверил, что переменная докуда-то досчитала.

Сейчас попробуем помигать светодиодом. Для этого нам понадобится подключить в Core/Src/main.c файл stm32f4xx_hal_gpio.h. А вот подключать соответствующие исходники не понадобится, так как конкретно GPIO используется много где, и кубик пропишет его даже для пустого проекта. Останется лишь добавить в наш main.c функцию инициализации (по аналогии с тем, как это делает кубик при создании функции MX_GPIO_Init()):

void our_gpio_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_GPIOA_CLK_ENABLE();

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);

GPIO_InitStruct.Pin = GPIO_PIN_10;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

И вызвать её в main(), где-нибудь во второй секции. А затем в суперцикле помигать HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_10), HAL_Delay(300);

В принципе, на этом всё, осталась пара замечаний:

1) то, что gpio тянется по умолчанию, это хорошо, но давайте рассмотрим чуть иной пример. Скажем, нам нужно подключить АЦП и померить что-нибудь. Если мы хотим работать на чуть более низком уровне, скажем, CMSIS, то нам достаточно подключить заголовочный файл stm32f401xc.h (он лежит среди доступных к подключению каталогов, а именно в Drivers/CMSIS/Device/ST/STM32F4xx/Include). Если же мы, как уважающие себя люди, привыкли оперировать горячими закусками, то заметим, что в Drivers/STM32F4xx_HAL_Driver/Inc лежат далеко не все нужные нам файлы. Здесь мы можем либо скопировать недостающее из репозитория (где он расположен, можно глянуть в кубике: Window→Preferences→STM32Cube→Frimware Updater), либо указать на нужный каталог в строке сборки в файле Debug/Core/Src/subdir.mk (после ключа -I). Здесь я предполагаю первый вариант и скопировал в проект файлы, относящиеся к АЦП: *adc.h и *adc_ex.h — в Drivers/STM32F4xx_HAL_Driver/Inc, а *adc.c и *adc_ex.c — в Drivers/STM32F4xx_HAL_Driver/Src (заметьте, там будут не только файлы HAL, но и LL; впрочем, …ll….h действительно нужен). Добавил их в соответствующий subdir.mk, а также в список объектов. Также неплохо бы добавить соответстующие файлы или шаблоны в команду очистки проекты (внизу файлы Debug/Drivers/STM32F4xx_HAL_Driver/Src/subdir.mk — цель clean-Drivers-2f-STM32F4xx_HAL_Driver-2f-Src) (я добавил ./Drivers/STM32F4xx_HAL_Driver/Src/*.su ./Drivers/STM32F4xx_HAL_Driver/Src/*.o ./Drivers/STM32F4xx_HAL_Driver/Src/*.d ./Drivers/STM32F4xx_HAL_Driver/Src/*.cyclo )

Скомпилировал. Успешно. Но если сейчас попробовать вызвать любую функцию АЦП, то компилятор выдаст ошибку:

/* USER CODE BEGIN PV */

ADC_HandleTypeDef hadc1;

/* USER CODE END PV */

...

/* USER CODE BEGIN 2 */

HAL_ADC_Start(& hadc1);

/* USER CODE END 2 */

aleksei@RNWS-008 ~/STM32CubeIDE/other/test/Debug $ make all | grep -v arm-none-eabi-gcc
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-no
ne-eabi/bin/ld: ./Core/Src/main.o: in function `main':
/home/aleksei/STM32CubeIDE/other/test/Debug/../Core/Src/main.c:88: undefined reference to `HAL_ADC_Start'
collect2: error: ld returned 1 exit status
make: *** [makefile:64: test.elf] Ошибка 1

Дело в том, что о нашем намерении собрать данную часть HAL нужно уведомить не только утилиту make, но и саму библиотеку. Для этого необходимо найти в файле Core/Inc/stm32f4xx_hal_conf.h строку #define HAL_ADC_MODULE_ENABLED и раскомментировать её. Зачем это сделано, признаться, не до конца понимаю, но у богатых свои причуды.

Собственно, на этом всё. Единственное, давайте на сладкое всё же запустим АЦП и при помощи отладчика извлечём какие-никакие данные.

/* USER CODE BEGIN PV */

ADC_HandleTypeDef hadc1;

int cnt = 0;

uint16_t data[1000] = {0,};

/* USER CODE END PV */

…

/* USER CODE BEGIN 0 */

static void my_ADC1_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

__HAL_RCC_ADC1_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

ADC_ChannelConfTypeDef sC>

hadc1.Instance = ADC1;

hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;

hadc1.Init.Resoluti>

hadc1.Init.ScanC>

hadc1.Init.C>

hadc1.Init.Disc>

hadc1.Init.ExternalTrigC>

hadc1.Init.ExternalTrigC>

hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

hadc1.Init.NbrOfC>

hadc1.Init.DMAC>

hadc1.Init.EOCSelecti>

HAL_ADC_Init(&hadc1);

sConfig.Channel = ADC_CHANNEL_1;

sConfig.Rank = 1;

sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;

HAL_ADC_ConfigChannel(&hadc1, &sConfig);

}

/* USER CODE END 0 */

…

while (1)

{

HAL_ADC_Start(& hadc1);

HAL_ADC_PollForConversion(&hadc1, 1);

data[cnt] = HAL_ADC_GetValue(&hadc1);

cnt++;

if(cnt >= 1000)

{

cnt = 0;

}

И проверим в работе. Не забудем собрать, а затем — загрузим обновлённую прошивку и запустим её:

(gdb) load
…
Transfer rate: 14 KB/sec, 1102 bytes/write.
(gdb) c
Continuing.
^C
…

(gdb) b main.c:128
Breakpoint 4 at 0x80005e4: file ../Core/Src/main.c, line 129.
(gdb) c
Continuing.

Breakpoint 4, main () at ../Core/Src/main.c:129
129  HAL_ADC_Start(& hadc1);
(gdb)

Здесь я прервал программу в произвольном месте при помощи Ctrl+C, затем поставил точку останова где-то в main.Теперь посмотрим, что прочиталось в массив:

(gdb) p data
$10 = {245, 251, 259, 249, 257, 247, 254, 260, 248, 252, 257, 247, 254, 260, 247, 254, 260, 248, 252, 258, 245, 251, 259, 249, 257, 247, 254, 260, 247, 254, 260, 248, 252, 257, 247, 254, 260,  
248, 252, 258, 245, 251, 260, 247, 254, 260, 247, 254, 260, 247, 254, 261, 252, 257, 247, 254, 260, 247, 254, 260, 248, 252, 258, 244, 247, 254, 260, 248, 252, 258, 245, 251, 259, 249, 257,  
247, 254, 260, 247, 254, 260, 247, 256, 243, 249, 257, 247, 253, 262, 250, 255, 265, 257, 247, 254, 260, 247, 254, 260, 247, 254, 261, 251, 260, 247, 254, 260, 248, 252, 257, 247, 254, 260,  
247, 254, 260, 248, 252, 257, 247, 254, 260, 247, 254, 260, 248, 252, 258, 245, 251, 259, 249, 257, 247, 254, 260, 248, 252, 257, 247, 254, 260, 248, 252, 257, 247, 254, 260, 248, 252, 257,  
247, 254, 260, 247, 254, 260, 248, 252, 257, 247, 254, 260, 248, 252, 258, 245, 251, 259, 250, 255, 264, 253, 262, 250, 255, 265, 257, 247, 254, 260, 247, 254, 260, 248, 252, 257, 247, 254,  
260, 247, 254, 260, 248, 252, 257, 247, 254, 260, 247...}

Что-то прочиталось, уже неплохо. А теперь — ради чего всё это:

(gdb) dump memory ~/tmp/test_data.bin data (data + sizeof (data))
(gdb)

Теперь мы получили в файле набор двоичных данных из массива data и можем относительно легко его разобрать, скажем, в таблицу примерно так:

Stm32 без IDE — памятка 2: мигаем светодиодом и кое-что ещё Программирование, Микроконтроллеры, Stm32, Длиннопост

Ну, тут вариантов масса, поэтому нет смысла писать текстом

Помимо двоичных данных команда dump умеет сохранять данные и в виде формата inetl hex и некоторых других.

К чему я это всё? А, на самом деле просто к тому, что команду dump очень полезно знать, даже если вы работаете в GUI STM32CubeIDE. Ведь её можно ввести во вкладке Debugger Console и получить слепок нужной вам области памяти.

Показать полностью 1
[моё] Программирование Микроконтроллеры Stm32 Длиннопост
4
3
erinaceto
erinaceto
5 месяцев назад
Серия Технические заметки

Stm32 без IDE — памятка 1: собираем проект⁠⁠

За вопрос спасибо студентам группы 031/EE-01.

Буквой в скобках обозначаю (например, так: "(Щ)" ) моменты , на которые позже хочу сослаться.

Исходные данные: есть проект STM32CubeIDE (скажем, пустой, только что сгенерированный), теперь хочется его его скомпилировать и запустить на микроконтроллере.
Материалы: МК на базе stm32F401 (впрочем, конкретная модель не важна *), многострадальный ноутбук с Rosa Fresh 12.5.1, кубик версии 1.12 (люблю я именно эту версию…). Программатор — китайский свисток, которому повезло, что кубик его принимает за своего.
Если у вас windows, я предполагаю, что вы сами установили и настроили make, драйвер st-link и т. п. Также все консольные команды я даю в расчёте на bash, это стоит иметь в виду.

Итак, мы запустили кубоид, создали в нём проект, а теперь хотим закрыть кубоид и далее работать с этим проектом. На самом деле для того, чтобы всё получилось без лишней головной боли, сперва соберите проект в кубе. У вас создастся каталог Debug (ну, я пока предполагаю, что вы ничего не трогали), а в нём — исполняемый файл, и куча промежуточных файлов. Теперь вы можете сделать Project →Clean, при этом удалится большинство промежуточнх файлов, но останутся иструкции для утилиты make, которой мы и воспользуемся.

Для этого нам понадобятся

  • текстовый редактор. Любой;

  • утилита make;

  • компилятор, способный создать исполняемый файл для МК;

  • сервер gdb, способный работать по интерфейсу SWD с МК;

    • при использовании ST-LINK_gdbserver (см. ниже) понадобится консольный stm32programmer;

  • клиент gdb, умеющий в инструкции процессора МК.

С редактором, думаю, более-менее ясно.

Компилятор и клиент GDB можно достать из уже установленного кубоида (если у вас его в принципе нет, можно ограничиться пакетом STM32CubeCLT (CLT означает command-line tools). Там нам понадобится найти расположение файлов arm-none-eabi-gcc и arm-none-eabi-gdb.

Собственно, arm — это архитектура процессора, для которого мы собираем программу, none-eabi означает отсутствие какой бы то ни было ОС, взяимодействующей с исполняемым файлом (всяческие RTOS в данном случае не в счёт).

Вот по серверу есть варианты. Можно использовать openOCD, st-util либо stlink-gdbserver. Я буду использовать stlink-gdbserver просто потому, что он идёт в поставке с кубиком (на самом деле у него есть ещё два преимущества: он умеет более чем в одно подключение одновременно, а главное — в отладку двухъядерных МК).

Поищем (я предполагаю, что кубик установлен в /opt/st/stm32cubeide_1.12.0, в зависимости от ОС, кончено, нужно использовать подходящие инструменты для поиска):

aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'arm-none-eabi-gdb'  
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/arm-none-eabi-gdb
aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'arm-none-eabi-gcc'  
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.200.202301161003/tools/bin/arm-none-eabi-gcc
aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'ST-LINK_gdbserver'  
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_2.0.500.202301161003/tools/bin/ST-LINK_gdbserver

(Б) На самом деле, конечно, это всё можно найти и глазами, но в любом случае с непривычки будет сильное желание выкинуть эти длинные буквы подальше.Пути до (не включительно) arm-none-eabi-gdb и ST-LINK_gdbserver следует добавить к системной переменной PATH (нет, как это делается, я здесь пояснять не буду, это относится не к нашей теме, а к общей компьютерной грамотности).
(Ъ) А вот путь до arm-none-eabi-gcc нужно добавить в PATH обязательно.

(В) Для использования ST-LINK_gdbserver нам отдельно понадобится путь к программе STM32_Programmer_CLI. Примерно так:

aleksei@RNWS-008 ~ $ find /opt/st/stm32cubeide_1.12.0  -name 'STM32_Programmer_CLI'
/opt/st/stm32cubeide_1.12.0/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_2.0.600.202301161003/tools/bin/STM32_Programmer_CLI

aleksei@RNWS-008 ~ $ export PATH_TO_PROGRAMMER='/opt/st/stm32cubeide_1.14.0/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_2.1.100.202311100844/tools/bin'

(А) Далее, make можно использовать как системный, так и из поставки кубоида (так же, поищите make). В принципе, нет причин не использовать штатный make — если только у вас не windows. Но тут подскажу мало: вживую видел make в составе платформы msys2, по идее, должно быть достаточно make из кубика. Точно так же, добавьте её в PATH, и будет работать.


Отлично. если вы проделали это — треть работы позади.

Теперь перейдём к сборке проекта. Для этого необходимо зайти в терминале в каталог с проектом, далее в каталог Debug (посмотреть, где он лежит, можно из Cube IDE: щелчок правой кнопкой мыши → Show In → System Explorer

Stm32 без IDE — памятка 1: собираем проект Микроконтроллеры, Stm32, Программирование, Консольщики, Разработка, IT, Длиннопост

ПКМ на каталоге → Show In → System Explorer

Теперь, узнав, где мы сидим (в моём случае это ~/STM32CubeIDE/other/test/Debug), открываем там терминал:
cd ~/STM32CubeIDE/other/test/Debug
и собираем проект (во всяком случае, те, кто не прогуливал лекцию про make):
make all

Для этого у нас должны быть установлены make (см (А) ) и переменная PATH должна указывать на каталог с arm-none-eabi-gcc (см. (Ъ)). Если make пишет что-то вроде /bin/bash: команда не найдена: arm-none-eabi-gcc), то возвращаемся к пункту (Ъ).

Если же эти два требования выполнены, то внезапно собирается. Почему?

Потому что в каталоге Debug кубик создаёт makefile, а также воссоздаёт примерную структуру каталогов проекта. В каждом из подкаталогов лежит фай subdir.mk, описывающий, как собирать данный подкаталог (в самом Debug эти инструкции вынесены в файлы с названиями objects.list, objects.mk, sources.mk). В принципе, мне по нраву такой подход. В сами файлы мы залезем чуть позже. А пока посмотрим, что получилось на выходе:

aleksei@RNWS-008 ~/STM32CubeIDE/other/test/Debug $ make  all  | grep -v arm-none-eabi-gcc
Finished building target: test.elf

arm-none-eabi-size  test.elf  
text  data  bss  dec  hex filename
5788  20  1580  7388  1cdc test.elf
Finished building: default.size.stdout

arm-none-eabi-objdump -h -S test.elf  > "test.list"
Finished building: test.list

(grep -v использовал просто чтобы не выводить полотно текста).

У нас собрался файл Debug/lesson1.elf. Ура. Он модержит в себе инструкции и данные для работы программы; адреса, по которым эти инструкции и данные должны располагаться; отладочную информацию в соответствии с тем профилем сборки, который настроили в кубике — для Debug это практически весь исходный текст программы. Он нам и понадобится далее.

Теперь треть работы позади.

Подключаемся к МК.

Как уже упоминал, работать будем с ST-LINK_gdbserver; при желании можете использовать st-util, она чуть проще в запуске, а результат для нас будет тем же. Или openOCD, если он у вас уже есть.

Предполагаю, что (Б) и (В) мы уже прошли. Тогда запускаем:
ST-LINK_gdbserver -p 4242 -d -t -cp $PATH_TO_PROGRAMMER
Здесь -p 4242 — это указание порта для работы с клиентом gdb; по умолчанию ST-LINK_gdbserver использует 61234, делайте как вам удобно, я обычно пишу его явно, чтобы не забыть.
-d — использовать SWD (подозреваю, что ключ необязателен).
-t — тоже необязательный для нас, разрешает множественные подключения.
-cp $PATH_TO_PROGRAMMER — обязательно нужно указать путь к STM32_Programmer_CLI (см. (В))

Если контроллер подключён, то увидим сообщение типа Waiting for debugger connection
Это означает, что мы смогли подключиться по USB к программатору и через него к целевому контроллеру. Если не смогли — проверяем контакты (в том числе разрешение на доступ к USB, мало ли…)

Далее в отдельном терминале заходим в каталог с файлом elf и запускаем клиент отладчика. Примечание для пользователей windows: здесь следует использовать именно стандартный терминал windows, штуковины типа git bash или терминала msys2 в данном конкретном случае не дадут работать автодополнению клиента gdb.

aleksei@RNWS-008 ~/STM32CubeIDE/other/test/Debug $ arm-none-eabi-gdb

(gdb) target extended-remote :4242
Remote debugging using :4242
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x08015760 in ?? ()
(gdb) file test.elf
Reading symbols from test.elf...
(gdb) load

Loading section .isr_vector, size 0x298 lma 0x8000000
Loading section .text, size 0x1bc5a lma 0x8000298
Loading section .init, size 0xc lma 0x801bef4
Loading section .fini, size 0xc lma 0x801bf00
Loading section .rodata, size 0x10444 lma 0x801bf0c
Loading section .eh_frame, size 0x4 lma 0x802c350
Loading section .ARM.exidx, size 0x8 lma 0x802c354
Loading section .data, size 0x9ec lma 0x802c35c
Loading section .init_array, size 0xc lma 0x802cd48
Loading section .fini_array, size 0x4 lma 0x802cd54
Loading section .init_array.00000, size 0x4 lma 0x802cd58
Start address 0x08007a24, load size 183642
Transfer rate: 41 KB/sec, 8347 bytes/write.
(gdb) continue
Continuing.

Собственно, программа запущена. Далее изучайте команды gdb (начните с: breakpoint, info breakpoint, delete, next, step, continue, run, disconnect, target, quit, print, x, frame; несколько особняком — dump, потому что на тему неё я позже ещё напишу пару слов). Имейте в виду, что здесь работает автодополнение команд (клавишей Tab), история (клавиши «Вверх» и «Вниз»), поиск по истории (Ctrl + r), сокращения команд (например, 'c' эквивалентно continue). Также если нажать ВВОД при пустой строке ввода, будет повторена последняя команда (это не очень удобно, но увы, без пересборки gdb этого не исправить; для отдельных команд можно отменить повтор последней команды при помощи «dont-repeat».

В следущей серии помигаем светодиодиком.

Показать полностью 1
[моё] Микроконтроллеры Stm32 Программирование Консольщики Разработка IT Длиннопост
1

Оформить подписку для бизнеса

Перейти
Партнёрский материал Реклама
specials
specials

Ваш бизнес заслуживает большего!⁠⁠

Оформляйте подписку Пикабу+ и получайте максимум возможностей:

Ваш бизнес заслуживает большего! Малый бизнес, Предпринимательство, Бизнес

О ПОДПИСКЕ

Малый бизнес Предпринимательство Бизнес
3
tzar471
tzar471
11 месяцев назад

Нужна IAR Embedded Workbench for ARM v.8.50⁠⁠

Имеется проект для STM32 выполненный в IAR 8.50. При переносе в текущую версию 9.50 проекта, программа подгружает его, видит, компилирует, но по факту сформированная загруженная прошивка не работает. Чтобы исключить проблему совместимости версий, хочу попробовать установить 8.50 и прошить через нее. Не могу найти в интернете старую версию, может у кого-то есть установочник? Выгрузите куда-нибудь в облако? Если нужно, папку в облаке расшарю.

[моё] Электроника Программирование Микроконтроллеры Stm32 Без рейтинга Текст
4
12
kkuznetzov
1 год назад
Лига Радиолюбителей

Поддельные отладчики ST-Link V2⁠⁠

Из-за санкций стало трудно купить родной ST-LINK V2. Первые две фотографии один клон, ещё две фотографии второй клон. Последняя фотография не моя, там родной ST-LINK V2.

Родной ST-LINK V2 Я покупал в ТерраЭлектроннике, которой теперь нет. Первый клон с Aliexpress. Второй клон из Чип-Дип, его Я уже вернул и получил деньги назад.

На родном отладчике есть микросхема согласования уровней 74LVC245A. Благодаря согласованию JTAG/SWD интерфейс может работать с устройствами при их питании напряжением от 1.65 до 3.6 Вольт.

Клоны так не смогут. Первый клон ещё как то будет работать. Роль согласования выполнят резисторы, стоящие последовательно в сигнальных линиях. Но будет течь ток через защитные диоды контроллера отладчика или контроллера отлаживаемого устройства. Зависит от того где напряжение больше. Второй клон совсем никакой, только 3.3 В или ставить резисторы в свою схему.

Второй клон даже в STM32 Cube Programmer работает через раз. В среде разработки STM32 CubeIDE он вообще не виден.

Правда если использовать другую среду разработки (Eclipse например) и OpenOCD, то как то работают оба клона.

Из-за этого всего Я использую или родной ST-LINK V2 или клон JLink.

Поддельные отладчики ST-Link V2 Электроника, Debug, Stm32, Микроконтроллеры, Длиннопост
Поддельные отладчики ST-Link V2 Электроника, Debug, Stm32, Микроконтроллеры, Длиннопост
Поддельные отладчики ST-Link V2 Электроника, Debug, Stm32, Микроконтроллеры, Длиннопост
Поддельные отладчики ST-Link V2 Электроника, Debug, Stm32, Микроконтроллеры, Длиннопост
Поддельные отладчики ST-Link V2 Электроника, Debug, Stm32, Микроконтроллеры, Длиннопост
Показать полностью 5
[моё] Электроника Debug Stm32 Микроконтроллеры Длиннопост
28
31
ShuricU
ShuricU
1 год назад

Как прошить stm32 микроконтроллер, распиновка микроконтроллера и программатора⁠⁠

[моё] Электроника Stm32 Видео YouTube Микроконтроллеры
2
3
ShuricU
ShuricU
1 год назад

Программаторы для прошивки микроконтроллеров а также микросхем памяти⁠⁠

Здравствуйте! В этом видео Вы можете узнать о программаторах, с помощью которых можно прошить микроконтроллер разных производителей, а также микросхемы памяти. А также об адаптерах переходниках для разных типов микросхем.

Stm32 Программатор Прошивка Дамп Микроконтроллеры Видео YouTube
2

Продвиньте ваш пост

Перейти
Партнёрский материал Реклама
specials
specials

Нужно больше внимания к постам? Есть способ!⁠⁠

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

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

Продвинуть пост

Продвижение Посты на Пикабу Текст
19
DELETED
1 год назад

Управление шаговым двигателем на К1986ВЕ92QI⁠⁠

Доброго дня. Сразу говорю, я начинающий. Помогите, нужна помощь как можно скорее, 4 дня времени. Стоит задача реализовать управление шаговым двигателем без использования готовых драйверов, только лишь на наших отечественных компонентах. Всем будет управлять микроконтроллер К1986ВЕ92QI (отечественный аналог STM32). Двигатель АD-200-31.Нужно реализовать дробление шага на 8 микрошагов и чтобы ток, подаваемый на обмотки ШД, менялся ступенчато в виде синусоиды от 0 до 2.8 А (фото приложил), при этом напряжение питания обмоток оставалось стабильным 24В и происходила вовремя переполюсовка посредством управления ключами Н-моста. Управляться это должно при помощи двух Н-мостов (фото приложил). Ступенчатое изменение тока по синусоиде, скорее всего, должно управляться при помощи компараторов (но это не точно).
Необходимо:
1) Составить схему подключения всех элементов к микроконтроллеру.
2) Составить программу управления шаговым двигателем на языке С.
3) Реализовать включение реверса двигателя и управление системой по интерфейсу RS-422.
4) Сделать возможность выбора скорости вращения ротора со скоростями 0.25, 0.5, 1, 2, 4, 8, 10, 20 град/сек.

Если надо, мог скинуть модель схемы в протеусе на atmega128 и кодом программы.

Управление шаговым двигателем на К1986ВЕ92QI Stm32, Микроконтроллеры, Шаговые двигатели, Управление
Управление шаговым двигателем на К1986ВЕ92QI Stm32, Микроконтроллеры, Шаговые двигатели, Управление
Показать полностью 2
Stm32 Микроконтроллеры Шаговые двигатели Управление
57
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии