USB HID для микроконтроллеров STM32F103 без использования библиотек

Однажды озадачившись подключением микроконтроллера к ПК через USB, я обнаружил, что это непростая задача. По сравнению с USART, SPI и.т.п., программирование USB оказалось на порядок сложнее. Поиск примеров в интернете практически не дал никаких результатов. Имеющиеся примеры, как правило, основаны на использовании больших и сложных библиотек, которые очень трудно применить, а тем более модифицировать под свои нужды. Также эти примеры обычно состоят из множества файлов, так что даже понять структуру проекта, а не то что принцип работы, USB из них не представляется возможным. Есть неплохие статьи по USB, однако ответа на вопрос, как реализовать обмен данными на конкретном контроллере они не дают. В итоге пришлось самостоятельно, путем длительных экспериментов пытаться запустить USB.
Используемый контроллер STM32F103C8T6. Это наверное самый распространенный и дешевый контроллер с модулем USB. Конкретно использовалась вот такая плата:
ru.aliexpress.com/item/STM32F103C8T6-ARM-STM32-DIY-KIT/32839140960.html?spm=a2g0v.search0104.3.14.1a477b81mKd6hC&ws_ab_test=searchweb0_0%2Csearchweb201602_9_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910%2Csearchweb201603_58%2CppcSwitch_0&algo_pvid=551618bd-fcbf-49a9-9147-692e88feb8ce&algo_expid=551618bd-fcbf-49a9-9147-692e88feb8ce-5
Цена такой платы практически равна цене микросхемы отдельно. Реализуемый класс устройств HID. Преимущества HID известны. Это отсутствие необходимости использования драйверов на ПК и относительная простота реализации. К недостаткам можно отнести низкую скорость передачи данных. В качестве среды программирования использован CooCox. Программа со стороны ПК компилировалась в Borland C++ 5.5.
Программа для CooCox состоит из одного файла и не использует никаких библиотек (кроме RCC, которая нужна лишь ради функции SystemInit(); в начале программы). Также не используются прерывания, поскольку, на мой взгляд, их использование, затрудняло бы понимание кода и отладку. VID и PID взяты от какого-то STM-овского устройства. При их смене, нужно так-же сменить их и в программе на ПК, поскольку поиск устройства происходит по VID и PID.
Работа рассматриваемой пары программ состоит в следующем. Программа со стороны ПК посылает целое число в контроллер. Контроллер делает инкремент полученного числа и отправляет его назад в ПК. Затем этот цикл повторяется снова и снова. В окне программы выводится полученное число. Дополнительно реализовано управление светодиодом на плате (PC13).
Данная программа не претендует на полное соответствие протоколу USB. В ней реализована обработка ограниченного набора запросов (только тех, что реально попадались при отладке). Как показала практика, набор запросов может различаться на разных компьютерах. Кроме того несмотря на то что удалось добиться работоспособности данной программы, многие вопросы касающиеся USB для меня так и остались непонятными. Этот пример, скорее полуфабрикат, требующий дальнейшей доработки.
Файлы проекта:
drive.google.com/drive/folders/1b3E0YwgRlacK2K2Qykc7OxS11ocNuWig?usp=sharing
  • +8
  • 27 марта 2019, 17:29
  • VVK
  • 1

Глава из «Поваренной книги разработчика аналоговой электроники», от Texas Instruments (TI)

Измерения с использованием датчиков малой мощности: 12-битная, несимметричная схема с одним источником питания на 3,3 В, 1 ksps

Исходные данные к описываемому решению представлены в таблицах 9 и 10



Описание решения
В данном решении усилитель сверхнизкой мощности используется для управления АЦП SAR, уровень энергопотребления которого в активном режиме измеряется в нановаттах. Решение предназначено для использования в системах сбора данных с датчиков с общим уровнем потребления в несколько микроватт. Примерами таких систем являются пассивные инфракрасные датчики, датчики газа и глюкометры. Значения в разделе выбора компонентов могут быть скорректированы в соответствии с требуемой скоростью передачи данных и полосой пропускания усилителя. В предыдущей части рассматривается более сложная версия схемы, где на канал отрицательного напряжения подается небольшое отрицательное напряжение (-0,3 В). Вариант схемы с одним источником питания показывает пониженную производительность, когда выходной сигнал усилителя близок к нулю. Однако в большинстве случаев конфигурация с одним источником питания является более предпочтительной благодаря простоте (рисунок 10, таблица 11).


Рис. 10 Несимметричная схема с одним ИП


Таблица 11. Спецификации упрощенной версии 12-битной несимметричной схемы

Рекомендуем обратить внимание
  • Определите линейный диапазон операционного усилителя на основе характеристик синфазного сигнала, размаха выходного напряжения и линейного коэффициента усиления напряжения. Это описано в разделе выбора компонентов.
  • Используйте конденсаторы COG для минимизации искажений.
  • Используйте пленочные резисторы 0,1% 20 ppm/°C или более высокой точности для минимизации искажений.


В серии обучающих видеороликов TI “Precision Labs – ADCs” показаны методы выбора элементов цепи зарядного сегмента Rfilt и Cfilt. Данные параметры компонентов зависят от полосы пропускания усилителя, частоты дискретизации преобразователя данных и конструкции самого преобразователя. Приведенные здесь значения позволяют получить хорошие показатели установления сигнала и динамические характеристики для усилителя и преобразователя данных в этом примере. В случае изменения дизайна вам понадобится выбрать другой RC-фильтр. Ознакомьтесь с обучающим видео “Введение в выбор компонентов для входных каскадов SAR АЦП”, в котором представлена дополнительная информация по выбору RC-фильтра для получения наилучших характеристик по установлению сигнала и переменному току. Далее...

CP2102 - еще один переходник USB-COM

Универсальный переходник CP2102 USB-COM.


Особенности моего донгла:
  1. «Универсальный» режим питания CP2102-модуля, а также подключаемого MCU модуля:
    USB/Внешнее питание/Сдвоенное питание.
  2. Дополнительные линии DTR/RTS для бутлоадера (проверено на бутявках Arduino/AVR, STM32)
  3. USB-супрессор
  4. Авто-Толерантность RX/TX к уровням сигнала MCU 3.3-5V (ну это заслуга создателей CP2102, привет FT232!)



Читать дальше
  • +5
  • 20 марта 2019, 23:51
  • maxxir
  • 3

LM5176 регулируем входной и выходной ток

В статье LM5176 Силовой блок я обещал рассказать, как можно регулировать выходной/входной ток. Итак: В разрыв выходной цепи установлен шунт R5. Сигнал с него поступает на входы ISNS- и ISNS+ контроллера LM5176. Когда ток меньше порога 50mV на R5 — ограничения тока нет. Когда напряжение на шунте R5 подходит к 50mV, контроллер начинает ограничивать ток.


Изменяем схему, как показано на рисунке:

Читать дальше
  • +5
  • 18 марта 2019, 14:37
  • CreLis
  • 1

Как зарядить автомобильный аккумулятор от другого аккумулятора? Силовой блок на LM5176

Как зарядить автомобильный аккумулятор от другого аккумулятора? Как зарядить дополнительный аккумулятор во время движения автомобиля? Как «прикурить» автомобиль с севшим аккумулятором не превышая допустимый зарядный ток? Как зарядить суперконденсатор?

Всё это можно сделать с помощью силового блока на LM5176. Входное напряжение может меняться от 10 до 16V. Напряжение на выходе можно установить от 14 до 15V. Зарядный ток можно изменять от 0.8А до 15А. Сердцем нашего силового блока является Buck-Boost контроллер LM5176 от компании Texas Instruments. Как устроена схема:

Читать дальше
  • +4
  • 15 марта 2019, 19:53
  • CreLis
  • 1

Защита от переполюсовки и к.з. зарядного устройства

Надо было разработать портативное зарядное устройство З.У. для зарядки 12V АКБ в полевых условиях. То есть, заряжать один аккумулятор от другого. Причем, зарядный ток — до 15 А. В полевых условиях, в темноте и на морозе перепутать полярность — проще простого. Хотелось сделать так, чтобы при неправильной полярности ничего не перегорало, а просто гудел зуммер.

Самая простая известная схема защиты — с предохранителем.
Если предохранитель сгорит — на морозе его не заменишь!


Кроме того, при неправильной полярности на выход З.У. придёт целых — 0.9 Вольт!



Вот так перегорает предохранитель Tesla 20A в схеме с 2-мя диодами шоттки VS42CTQ030. В течение 25 mS на З.У. приходит — 0.9 Вольт! Осциллограф подключен к точке А

Читать дальше

STM8L Мониторинг питающего напряжения без использования АЦП

Микроконтроллеры STM8L предназначены, прежде всего, для устройств с батарейным питанием. Поэтому часто бывает нужно следить за степенью разряда батарей. Это можно делать при помощи АЦП. Если АЦП полностью занят выполнением основной задачи, то мониторинг питания можно поручить системе Programmable voltage detector (PVD).

Обычно PVD используют для определения порога малого заряда батареи, после чего предпринимают определённые действия, пока питание не пропало совсем.
Мы же будем использовать PVD для отображения текущего заряда батареи на светодиодной шкале в диапазоне 1,7 …. 3,05 V.

Для работы мы возьмём плату STM8L-Discovery с микроконтроллером STM8L152C6T6.
LCD индикатор аккуратно вынимаем и откладываем в сторону.

Для подключения светодиодной шкалы нам понадобится весь порт B. Вместо светодиодной шкалы можно просто взять 8 светодиодов. Катодами мы подключим их к общему проводу, а анодами к выходам PB0 … PB7 порта B через резисторы по 2КОм.


Читать дальше
  • +6
  • 13 марта 2019, 00:09
  • CreLis
  • 1

Программатор SPI и I2C микросхем памяти CH341A Mini Programmer

  Микросхемы памяти серий 24хх (EEPROM), 25хх (Serial Flash) широко используются в электронике. Такие чипы присутствуют в составе практически любой конструкции современной бытовой и промышленной аппаратуры, где есть процессоры и/или микроконтроллеры. Данный программатор имеет возможность работы с обоими типами памяти.


Читать дальше

Корпоративная библиотека компонентов для Altium Designer своими руками

Пролог

В одной из предыдущих статей я описывал как создать библиотеку компонентов для Altium Designer на основе базы данных. В качестве бэкэнда был использован Access из пакета MS Office, который хранит все данные в одном файле. Это удобно, потому что MS Access доступен, не требует какой-либо настройки, а также потому, что Altium умеет с ним работать из коробки.

Однако, в этом удобстве и заключается главный недостаток. Всё хорошо пока вы работаете сами, и являетесь единоличным пользователем базы данных. Проблемы начинаются, когда нужно организовать корпоративную библиотеку, пользоваться которой будут несколько человек, и часто одновременно. В чем же проявляются недостатки хранения библиотеки в БД MS Access?

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

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

Чтобы решить проблему одновременной доступности БД мы откажемся от MS Access и посмотрим что мы можем сделать.


Читать дальше

Преобразователь логических уровней "1.8V-Adapter"



  Брал на Ali, продавца советовать не буду, т.к. брал за сто с бесплатной доставкой, теперь он повысил цену и доставку требует оплатить. С этим адаптером их там много…
  Преобразователь логических уровней выполнен на трансмиттере SN74ALVC164245. Он имеет два независимых 8-разрядных канала, в каждом есть вход управления направлением передачи DIR и вход перевода входов/выходов в высокоимпендансное Z состояние OE. В каждом канале имеются два порта A и B для входов/выходов, порт А предназначен для работы с логическими уровнями 2,5..3,3V, порт В работает с уровнями 5..3,3V. При питании обоих портов от 3,3V трансмиттер обеспечивает задержку передачи со входа на выход не более 5,8ns (в обе стороны), частоту передачи до 10MHz, токи выходных каскадов не менее 24ma.


Читать дальше