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

Очередная багофича HAL

Наткнулся на новый косяк библиотеки HAL в функции HAL_I2S_Transmit. Есть у нее параметр uint16_t Size, который удваивается в случае работы с данными 24 или 32 бита

// stm32f4xx_hal_i2s.c line 537
if((tmp1 == I2S_DATAFORMAT_24B) || (tmp1 == I2S_DATAFORMAT_32B))
{
  hi2s->TxXferSize  = (Size << 1U);
  hi2s->TxXferCount = (Size << 1U);
}
else
{
  hi2s->TxXferSize  = Size;
  hi2s->TxXferCount = Size;
}


Проблема в том, что переменные TxXferSize и TxXferCount имеют тип uint16_t. И если на вход HAL_I2S_Transmit передать размер 0x8000 и более, то после сдвига влево результат превращается в тыкву.

// stm32f4xx_hal_i2s.h line 110
typedef struct __I2S_HandleTypeDef
{
  SPI_TypeDef                *Instance;    /*!< I2S registers base address        */
  I2S_InitTypeDef            Init;         /*!< I2S communication parameters      */
  uint16_t                   *pTxBuffPtr;  /*!< Pointer to I2S Tx transfer buffer */
  __IO uint16_t              TxXferSize;   /*!< I2S Tx transfer size              */
  __IO uint16_t              TxXferCount;  /*!< I2S Tx transfer Counter           */

Микроконтроллеры STM32F7/STM32H7 семейства Value Line

Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32, интересуется как работать с кодом во внешней памяти на базе контроллеров с Cortex-M7. Мы покажем как настроить среду разработки, как использовать GCC в составе Atollic TrueStudio, как настроить процессор на максимальную производительность и расскажем о тонкостях работы с модулем защиты памяти.

Содержание
-Использование компилятора GCC в составе AtollicTrueStudio;
-Проверка эффективности компилятора и самого микроконтроллера STM32F7/STM32H7 Value line при различных стратегиях размещения кода:
-Внутренняя память FLASH;
-Внешняя QSPI flash;
-Внешняя SDRAM.



На сайте Компэла вы также найдете вопросы-ответы, которые задавались в процессе вебинара, а также исходный код и дополнительные материалы:
-Программные коды, использованные на вебинаре
-Разработка графических устройств на STM32. Выбираем графическую библиотеку
-Отладочные платы на базе микроконтроллеров STM32
-Новая доступная среда разработки для микроконтроллеров STM32
-STM32F7 & H7 Value line: бюджетные версии микроконтроллеров высокой производительности
-Микроконтроллеры STM32 теперь работают с голосовым сервисом Alexa

STM32: Драйвер АЦП: Микросхема ADS1256 [Texas Instruments] это Малошумящий 24-битный АЦП с SPI интерфейсом. топик-ссылка

Драйвер АЦП "ADS1256" реализован для архитектуры микроконтроллеров "STM32 Cortex-M" с использование низкоуровневых драйверов для SPI и EXTI из стандартного фреймворка "STM32CubeFW". Компилятор: GCC-совместимый (Keil, IAR)... Реализован модуль математической постобработки: "усреднение скользящим окном", "конвертация кода АЦП в реальные единицы измерения", "Калибровка АЦП"... Реализован асинхронный "Режим потоковой конвертации DATAC" для ADS1256.

Захват изображения с USB камеры при помощи STM32

image
Для собственного самообразования решил подключить USB камеру (вебкамеру) к STM32. У меня уже была отладочная плата на базе STM324F429, способная выводить изображение на VGA монитор, так что для проверки работы камеры я использовал именно ее.


Читать дальше
  • +9
  • 29 сентября 2018, 22:18
  • citizen

Еще одна обертка над GPIO

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


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

Захват видеосигнала от ZX Spectrum при помощи STM32F4.

Есть у меня ZX Spectrum. Захотелось мне получить с него именно цветное изображение. Телевизора с подходящим SCART разъемом у меня нет, а покупать какие-либо переходники — не наш путь:) Так что я решил собрать на базе STM32F429 собственной конвертер, способный формировать VGA видеосигнал. Делалось это в первую очередь для самообразования.


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

ST прикупает Atollic и...


Новость надеюсь приятная — теперь Atollic TRUE Studio V9.0 для STM32 PRO версия бесплатна!


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

Подозрительные STM32F103C8T6, угадай по виду оригинальный.

Приветствую! Постараюсь как можно короче.
STM32F103C8T6 по всей видимости становятся чуть ли не «народным» и встречается всё чаще. Заказав у китайцев очередные несколько «синих» платок я усомнился в оригинальности чипов. И сегодня собрав несколько вариантов прикладываю шакальные фото, откуда взят (от кого), есть ли претензии, кем представляется и unique id(который толи я не смог считать, толи все нули означают чистый китай).


Читать дальше
  • +1
  • 19 января 2018, 02:12
  • qic

Complementary PWM и Push-Pull режимы на таймере 1 контроллеров STM32

Это скорее не статья, а развернутый ответ на сомнения моего уважаемого коллеги Lifelover 'а, которые он выражал в этом обсуждении относительно возможности реализации некоторых режимов ШИМ на таймерах контроллеров серии STM32.



Читать дальше
  • +5
  • 07 января 2018, 16:13
  • _YS_