Как подключить stm32 к компьютеру

STM32 и USB-HID — это просто

На дворе 2014 год, а для связи микроконтроллеров с ПК самым популярным средством является обычный последовательный порт. С ним легко начать работать, он до примитивности прост в понимании — просто поток байт.
Однако все современные стандарты исключили COM порт из состава ПК и приходится использовать USB-UART переходники, чтобы получить доступ к своему проекту на МК. Не всегда он есть под рукой. Не всегда такой переходник работает стабильно из-за проблем с драйверами. Есть и другие недостатки.
Но каждый раз, когда заходит разговор о том, применять USB или последовательный порт, находится множество поклонников логической простоты UART. И у них есть на то основания. Однако, хорошо ведь иметь альтернативу?
Как подключить stm32 к компьютеру
Меня давно просили рассказать как организовать пакетный обмен данными между ПК и МК на примере STM32F103. Я дам готовый рабочий проект и расскажу как его адаптировать для своих нужд. А уж вы сами решите — нужно оно вам или нет.

Выбор профиля HID

USB-HID — довольно обширный класс устройств, поэтому прежде всего придется выбрать какое именно устройство мы будем создавать.
Мы можем создать эмуляцию клавиатуры, мыши, джойстика и других устройств ввода, а можем создать свое устройство, чтобы не зависеть от довольно жестких рамок стандарта и свободно обмениваться данными с ПК.
Я расскажу как cделать Custom HID device. Это дает максимальную свободу. Чтобы не затягивать статью, постараюсь рассказать максимально кратко — описаний стандарта в сети и без меня много, но лично мне они слабо помогли, когда понадобилось решить конкретную задачу.

Структура проекта

Инициализация USB

В функции Set_System() производится настройка пина подтяжки линии D+ к питанию для программного подключения/отключения устройства от ПК (в нашей плате не используется), настраивается прерывание и инициализируются светодиоды и кнопки для демонстрационного проекта.
В USB_Interrupts_Config() настраиваются прерывания в зависимости от семейства МК (поддерживаются F10x, F37x, L1x).
Функция USB_Init() запускает работу USB модуля. Если временно нужно отключить для отладки работу с USB, просто закомментируйте эту строку.
Далее в бесконечном цикле проверяется, удалось ли сконфигурировать USB модуль при подключении к ПК. Если все сработало верно и устройство успешно подключилось, ПК включен и не находится в режиме энергосбережения, то состояние будет CONFIGURED.
Далее проверяется, была ли закончена предыдущая передача данных в ПК и если да, то готовится к отправке новый пакет в функции RHIDCheckState()

Размер пакета и частота передачи

В комментариях все довольно прозрачно. Обратите внимание на DEVICE_VER_L, DEVICE_VER_H — это константы из usb_desc.h, которые вы можете изменить для идентификации версии своего устройства.

Здесь стоит обратить внимание на константу wMaxPacketSize — она определяет максимальный размер пакета, которым мы будем обмениваться с ПК. Проект так настроен, чтобы при ее изменении менялись и размеры буферов. Но не забывайте, что больше 0x40 по стандарту указывать не стоит. С этой константой будьте осторожны — если передаваемый пакет будет отличаться по размеру — будут проблемы!
Следующая за ним константа с комментарием bInterval — это период опроса устройства в миллисекундах. Для нашего устройства задано 32мс.

Это самый важный дескриптор — он описывает протокол обмена и функционал устройства. Его формирование — не самая простая задача. Если допустить ошибку при формировании дескриптора — устройство перестанет работать. Формат дескриптора очень жесткий. Есть даже специальная утилита HID Descriptor tool. А в корне проекта лежит файл «RHID.hid» с описанным выше дескриптором для редактирования в этой утилите. Но если вы не понимаете, что делаете, лучше не лезть.
Для простоты я сделал две константы:
RPT3_COUNT — размер OUTPUT буфера в байтах для передачи пакета в МК (в примере — 1 байт)
RPT4_COUNT — размер INPUT буфера в байтах для передачи пакета в ПК (в примере — 4 байта)
Размер любого из этих буферов не должен превышать wMaxPacketSize. Меньше — можно.
Кстати, превратить Custom HID в другой HID девайс, например, клавиатуру или джойстик можно фактически только переписав ReportDescriptor и изменив класс и подкласс устройства в дескрипторе конфигурации.

Что такое Report

Цикл обмена

Массив uint8_t Buffer[RPT4_COUNT+1] определен как размер полезных данных входящего (рассматривается всегда с точки зрения хоста) пакета + байт ID. Это важно — если размер буфера будет отличаться — будут проблемы. Поэтому для изменения размеров буфера редактируйте значение константы в usb_desc.h.
В функции мы собираем данные в пакет, устанавливаем флаг PrevXferComplete = 0, говорящий о том, что данные отправляются и вызываем функциии библиотеки USB_SIL_Write и SetEPTxValid для отправки данных хосту.
Все, на этом передача данных хосту закончена.

С приемом данных немного сложнее — есть два способа послать данные девайсу — один из них заключается в использовании описанных в дескрипторе репорта возможностей устройства (Features), с соответствующими параметрами посредством функции SET_FEAUTRE. Это некоторая абстракция, для красивого управления устройством с кучей функций, чтобы можно было вызывать осмысленные функции, а не просто слать поток байт.
Второй способ — это работа с устройством как с файлом — просто записываем в него пакет как в файл. Этот метод называется SET_REPORT. На деле работает чуть-чуть медленнее.
Наше устройство поддерживает оба метода, о чем мы и сказали хосту в дескрипторе репортов.

Обработка SET_FEATURE

Данные, отправленные методом SET_FEAUTRE обрабатываются в usb_prop.c

Здесь мы проверяем первый байт в репорте и в соответствии с ним обрабатываем остаток пакета — управляем светодиодами или просто берем байт, отправленный нам хостом и кладем в пакет для последующей отправки обратно в функции RHIDCheckState.
Под Report_Buf зарезервировано wMaxPacketSize байт, чтобы влез любой пакет, который нам отправит хост.

Данные, отправленные методом SET_REPORT обрабатываются в usb_endp.c

Здесь почти то же самое, только нужно самостоятельно забрать данные вызовом USB_SIL_Read(EP1_OUT, Receive_Buffer) и в конце сообщить, что мы закончили вызовом SetEPRxStatus(ENDP1, EP_RX_VALID);

Настраивать устройство, передавать и принимать данные в пакетах нужного размера с нужной нам периодичностью мы научились.
Собираем проект и прошиваем в устройство.
Работать, это будет примерно так:

Проект поддерживает взаимодействие с утилитой USB HID Demonstrator от ST Microelectronics.
Страница Device capabilities отображает возможности, описанные в Report Descriptor.
Input/Output transfer позволяет вручную поотправлять данные девайсу и посмотреть пакет, который от него приходит.
Graphic view позволяет управлять светодиодами, чекбоксами Led 1, Led 2, настроив соответствующий им Report ID, а также передавать байт ползунком (ReportID=3)
Как подключить stm32 к компьютеру

Также я написал маленькую демо-софтинку, которая автоматически определяет подключение к компу и отключение нашего девайса по его VID и PID, отображает статус — подключено/отключено индикатором рядом с чекбоксом Auto Connect
Как подключить stm32 к компьютеру
Радиокнока Send using позволяет выбрать метод отправки данных девайсу.
Report: отображает полученный от девайса пакет побайтно, начиная с ReportID.
Щелкая по светодиодам ниже — управляем светодиодами девайса. Их состояние отображает текущее состояние девайса. Считывается из репорта от девайса.
Перемещая ползунок, мы отправляем Report с и значением, соответствующим позиции ползунка. Девайс вернет это значение в 4 байте репорта.
В выпадающем комбобоксе отображаются HID девайсы, найденные в системе и если найден наш девайс, то отображается его название.

Скачать все, что необходимо, можно на GitHub. В составе:
DT — HID Descriptor tool
tstHID-STM32F103 — проект для EmBlocks
USB HID Demonstrator — утилита от ST Microelectronics
HIDSTM32.exe — моя демо-софтинка на Delphi аналогичного фукнционала, но не требующая настройки

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

Источник

Как подключить stm32 к компьютеру

Отладочная плата на микроконтроллере stm32f103c8t6, является одной из самых популярных в любительской среде «электронщиков». Это одна из самых удачных плат в соотношении «цена/функционал», а сам stm32f103xxxx, который выпускается уже 10 лет, является ветераном и первопроходцем микроконтроллеров на ядрах ARM Cortex M3.

Краткое описание

Полезная информация о плате собрана на страничке проекта STM32duino.

Для начала взглянем на раcпиновку платы:

Как подключить stm32 к компьютеру

и принципиальную схему:

Как подключить stm32 к компьютеру

На схеме нас будет интересовать резистор R10. На вики STM32duino, относительно этого резистора утверждается следующее:

Т.е. они пишут, что согласно спецификации USB, на линии D+ должен быть установлен резистор номиналом 1.5K в то время как китайцы ставят резисторы на 4.7К или 10К. И далее предлагается поменять его на резистор требуемого номинала. Там даже прилагается фото с результатом переделки:

Как подключить stm32 к компьютеру

Еще там сказано, что несмотря на неправильный номинал резистора, USB-хостами наш микроконтроллер все же может восприниматься корректно. Нужно пробовать, но никакой гарантии нет.

На моей версии платы был установлен резистор на 10K:

Как подключить stm32 к компьютеру

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

Поэтому, если есть такая возможность, то резистор все же лучше поменять:

Как подключить stm32 к компьютеру

Ну и заодно я впаял штыревой разъем, что бы в лишний раз не мараться. Получилось как-то так:

Как подключить stm32 к компьютеру

Ок. теперь когда отремонтирован USB, можно начать программировать.

Прошивка и программирование Blue Pill

Подключаем плату к ST-Link и запускаем «STM32 ST-LINK Utility»:

Как подключить stm32 к компьютеру

Жмем «Connect to the target» и если в графе Device чип определился правильно, значит все Оk, чип живой и готов к работе. Хотя, это конечно следовало проверить ДО того как браться за паяльник 😉

Попробуем прошить Blink через ST-Link из Arduino. Для этого запустим Arduino с установленным паком Arduino_STM32. В меню выбора платы щелкнем по Generic-STM32F103C series

Как подключить stm32 к компьютеру

Из примеров загрузим вариант Blink’а для STM32:

Как подключить stm32 к компьютеру

В тексте скетча исправим номер пина PB1 на PC13, т.е. на пин с зеленым светодиодом.

Как подключить stm32 к компьютеру

В меню выбора программатора выберем ST-Link:

Как подключить stm32 к компьютеру

После чего пробуем прошить:

Как подключить stm32 к компьютеру

В итоге имеем вес прошивки в 13 КБайт, и успешный лог выполнения. К конце прошивка немного подвисает, на этапе «waiting for tty device», т.е. в ожидании последовательного порта, как будто бы прошивка происходила через USB-загрузчик, но в целом, все ОК.

Установка USB загрузчика STM32duino

Попробуем поставить загрузчик STM32duino для прошивки через USB-кабель. Для этого скачиваем отсюда прошивку с суффиксом PC13(пин со светодиодом):

Как подключить stm32 к компьютеру

Далее загружаем скачанную прошивку в микроконтроллер:

Как подключить stm32 к компьютеру

Откладываем в сторону ST-Link, и подключаем микроконтроллер к компьютеру через microUSB разъем. Затем снова запускаем Arduino IDE и в опции «Upload Method» указываем «STM32duino bootlooder».

После чего снова пробуем прошить скетч, но уже через USB. Если все сложится удачно, то выйдет такой лог:

Как подключить stm32 к компьютеру

Замечу, что прошивалось через Linux версию Arduino IDE.

Здесь есть один нюанс. Джампики на плате должны находиться в положении «ноль». Если они, допустим, будут вообще сняты, то Arduino не сможет перезагрузить микроконтроллер перед прошивкой, и он не сможет войти в режим загрузчика. Так же должно быть понятно, что если теперь прошить микроконтроллер через ST-LINK, то загрузчик затрётся.

Теперь я отложу эту плату в сторону чтобы не затереть загрузчик STM32duino, который еще понадобится, и возьму другую. Попробуем поднять на микроконтроллере Virtual COM Port c помощью STM32Cube MX и IAR ARM.

Прошивка в Virtual COM PORT

Запускаем «куб» и открываем новый проект:

Как подключить stm32 к компьютеру

Выбираем смою модель микроконтроллера:

Как подключить stm32 к компьютеру

Выставляем тактирование от кварца, и включаем отладку по SWD:

Как подключить stm32 к компьютеру

Включаем USB Full-Speed модуль:

Как подключить stm32 к компьютеру

Выставляем режим работы USB модуля как Virtual COM Port:

Как подключить stm32 к компьютеру

Для индикации рабочего цикла задействуем светодиод на PC13 ножке:

Как подключить stm32 к компьютеру

С конфигурацией GPIO покончено, переходим к настройке тактирования. Сразу же откажемся от автоматических настроек:

Как подключить stm32 к компьютеру

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

Как подключить stm32 к компьютеру

Осталось дело за малым, задать идентификатор для ножки PC13:

Как подключить stm32 к компьютеру

Как подключить stm32 к компьютеру

Как подключить stm32 к компьютеру

С «кубом» закончили, экспортируем проект в IAR ARM:

Как подключить stm32 к компьютеру

Настройка параметров экспорта: имя проекта, среда разработки, рабочие каталоги:

Как подключить stm32 к компьютеру

После чего открываем проект в IAR:

Как подключить stm32 к компьютеру

В главный цикл добавим следующий код:

Как подключить stm32 к компьютеру

В начало main.c нужно еще будет добавить заголовочный файл usbd_cdc_if.h:

Как подключить stm32 к компьютеру

Все, можно нажимать на компиляцию и загружать прошивку в микроконтроллер. «Весит» она кстати тоже не мало, десять килобайт. Можно убирать в стол ST-Link, он больше не понадобится. Подключаем микроконтроллер через USB к компьютеру, если речь идет о Linux, то больше ничего делать не надо, драйвер уже имеется в ядре и при подключении выдает такой лог:

Можно открывать терминальную программку и смотреть на всплывающие строки: «hello world!»

Если же речь идет о Windows, то потребуется еще поставить драйвер com-порта. Для этого зайдем на my.st.com, залогинимся и в строке поиска ведем запрос: «stm32 virtual com port»

Как подключить stm32 к компьютеру

В выпадающем списке нам сразу предлагается STSW-ST32102, он то нам и нужен. Скачиваем, распаковываем, находим инсталятор:

Как подключить stm32 к компьютеру

Подводный камень кроется в том, что после установки драйвера его еще нужно будет установить 😉

Т.к. у меня виртуальная машина, я пробрасываю в нее свое устройство:

Как подключить stm32 к компьютеру

Операционка обнаруживает новое устройство и предлагает установить драйвер:

Как подключить stm32 к компьютеру

Нам нужно указать папку в которую распаковались драйвера.

Как подключить stm32 к компьютеру

Они должны быть в «Program Files\STMicroelectronics\Virtual comport driver\Win7». Я не знаю, чем руководствовались парни из STM кидая драйвера от WinXP в папку Win7. Если у вас операционка Win7 или Win8, то в соответствующих папках будут находиться инталяторы для этих операционок, их нужно запустить. А делать так как я показываю, не надо. Это только для Win2000/XP/Vista.

Как подключить stm32 к компьютеру

Щелкаем на установку драйвера:

Как подключить stm32 к компьютеру

В случае успеха, система выдаст соответствующий репорт:

Как подключить stm32 к компьютеру

Теперь устройство можно будет найти в диспетчере устройств:

Как подключить stm32 к компьютеру

Теперь можно запустить терминальную программку, чтобы посмотреть на выводимые микроконтроллером через USB данные:

Как подключить stm32 к компьютеру

Подключение микроконтроллера STM32F103C8T6 к Android-планшету

Микроконтроллер с USB портом можно подключить не только к стационарному компьютеру, но и Ardroid устройству.

На моем планшете с root-доступом, устройство прекрасно видно:

Как подключить stm32 к компьютеру

Скачанная наугад программка usb-терминал, сразу нашла устройство:

Как подключить stm32 к компьютеру

Как подключить stm32 к компьютеру

В принципе, даже не изучая Java и AndroidStudio, используя лишь NDK, можно написать хороший код для сопряжения Android-девайсов и STM32-микроконтроллеров. Это может дать новую жизнь старым смартфонам и планшетам, которые можно использовать для отображения информации или управления чем-то.

Подключение I 2 C модуля DS3231

Теперь я снова беру плату с прошитым загрузчиком STM32duino, и попробую сделать, как говориться, без лишней пыли, что-то более полезное чем hello_world, а именно подключить RTC DS3231 через интерфейс I 2 C.

Микроконтроллер stm32f103c8t6 имеет два аппаратных I 2 C интерфейса. Дефолтовый интерфейс в Medium_Density чипах висит на пинах PB6 и PB7:

Как подключить stm32 к компьютеру

Подключаем модуль к микроконтроллеру:

Как подключить stm32 к компьютеру

В Arduno IDE копируем этот скетч, компилируем, загружаем, смотрим на результат работы:

Источник

STM32 USB НАЧАЛО.

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

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

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

Картинка ниже очень наглядно показывает, как программно реализован usb.

Как подключить stm32 к компьютеру

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

Конечную точку можно представить себе как почтовый ящик, почтальон знает, что в него надо кидать письма, а Вы знаете, что из него можно забирать письма. В случае с usb почтовым ящиком является конечная точка.

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

Давайте оформим это в виде кода.

Тут может возникнуть вопрос, что такое таблица конечных точек?
Так как посылки у usb могут быть разной длины и большого размера, разработчики МК не стали делать для получаемых/принимаемых данных отдельный регистр, для каждой конечной точки. Они выделили для этой цели кусок памяти. А для того, чтобы МК понимал, где заканчивается одна точка и начинается другая, в начале этой памяти расположена таблица.

То есть если мы хотим отправить данные, используя нулевую точку, мы записываем данные по нужному адресу. Остальное МК сделает за нас.

Создаем конечную точку.

Что касается дескриптора устройства, оставлю тут табличку в которой расписано назначение каждого байта.

Как подключить stm32 к компьютеру

Тут начинается самое интересное, для начала расширим код нашего прерывания, для случая когда МК успешно принял данные.

Теперь добавим, функции записи и чтения конечных точек.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *