Stm32 драйвер usb windows 10

STM32 и USB. Часть 2. Немного о драйверах и софте.

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

В проекте был реализован интерфейс с двумя bulk-ендпойнтами (in и out), с моим «кастомным» протоколом, при помощи которого можно включать, выключать и заставлять светоиоды мигать с нужными временами горения/не горения.

Ну и выложил небольшую программу для всего этого:

Пользователь Vga в комментариях справедливо заметил, что разработка своего драйвера под Windows — задача далеко не тривиальная, и что проще реализовать стандартный класс, например HID, под который драйверы есть.

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

Итак, у нас на повестке следующие варианты:

1) Написать драйвер самому. Задача сложная, неблагодарная, долгая. Тут сразу можно отсылать, например к Windows Driver Foundation. Есть куча примеров, которые можно расковырять и адаптировать под свои задачи.
Несомненный плюс этого варианта — решение получится красивое и компактное. Но стоит ли это потраченного времени…
Извините, если разочаровал тех, кто полагал, что я опишу именно этот вариант 🙂

2) Реализовать на девайсе один из стандартных классов, например тот же HID.
Но давайте предположим что мы вот буквально вчера наконец-то заставили наш девайс определяться по USB как самостоятельное устройство, и все что мы умеем — это читать и писать в ендпойнты. Нам нужно что-то еще проще.

3) Использовать готовые средства. Вот на этом «варианте для начинающих и не только» мы остановимся.

Но вначале небольшое отступление.

Как Windows опознает наши USB-устройства?
В большинстве случаев это «зашитые» в девайс VID (Vendor ID) и PID (Product ID). Есть исключения, например HID и Mass Storage, там Windows опознает класс устройства и подсовывает уже приготовленный драйвер.

Если мы воткнем наш девайс в компьютер, система определит его, но, очевидно, будет ругаться на отсутствие драйвера, и предложит выбрать .inf- файл.
Именно в этом файле и прописываются, помимо прочего, наши VID и PID, а также путь к драйверу.

Есть, конечно, и более хитрые варианты, но мы на них пока останавливаться не будем.
Наши VID и PID можно подсмотреть в файле usb_desc.c проекта. И обязательно прочтите комментарий 😉

Итак, встречаем: libusb-win32 и Jungo WinDriver.

Jungo WinDriver

Весьма удобная штука.
Запускаем Wizard, выбираем по VID-PID наш девайс:

Генерим inf-файл, сохраняем, устанавливаем тут же драйвер, и вуаля. Вот они наши два bulk-ендпойнта + управляющий, нулевой ендпойнт:

Читайте также:  Vmware как установить windows с образа

А вот наш девайс определился в диспетчере устройств:

Но и это не все. Жмем на волшебную кнопку Generate Code:

И получаем воистину огромный набор вариантов на любой вкус:

Генерим проект, запускаем. Вот — готовая программа для работы с нашим девайсом:

Можем отправлять данные в ендпойнты и читать их оттуда.
Например, отправка пакета на скриншоте согласно моему протоколу зажжет светодиод номер два. (См protocol.txt в проекте Keil)

Я сгенерил проект для C# (.NET) и мне он выдал солюшен с двумя проектами: Собственно сама программа и либа для работы с девайсом по USB. В последней есть все необходимое, вплоть до событий подключения-отключения девайса. А вообще если не заморачиваться, то все можно свести к обычному чтению-записи в ендпойнты.
Дальше сами справитесь? 😉

Ну а теперь поговорим о недостатках.
1) Jungo WinDriver — штука очень уж платная. Кто хочет расстроиться — цены лежат тут.
2) У некоторых USB-девайсов бывает несколько конфигураций. Такое встречается редко, но встречается.
WinDriver с такими работать не умеет, а функция смены конфигурации помечена как Not Implemented Yet.

libusb-win32

Распаковываем и в папочке bin лежит программка inf-wizard.exe. Тоже визард для генерации инф-файла, а заодно и всех остальных файлов, необходимых для установки драйвера.
Запускаем, выбираем наш девайс, сохраняем inf и прочее в отдельную папочку:

Ну и сразу инсталлируем.

Теперь, чтобы создать свой проект, необходимо собрать все нужные от libusb файлы в папках lib, include, подсмотреть как работать с устройством, в папке exampes. А работать — проще простого (см bulk.c)

Но и этого мне показалось мало. Поскольку меня в свое время подсадили на тяжелый наркотик, именуемый C# + .NET, я стал искать решения, такие же простые, как и Jungo WinDriver.
И нашел следующее:

LibUsbDotNet

Нет, вы только вдумайтесь: .NET-надстройка над библиотекой, портированной из линукса под win32!
Конечно, изврат извратом, но мне понравилось.

Именно при помощи этой либы я и написал программу из предыдущей статьи. Работать с ендпойнтами так же просто.

Ну а дальше реализуем небольшой протокол, пишем-читаем ендпойнты и радуемся мигающим светодиодам 🙂
Только не забываем одну тонкость: весь обмен с USB-девайсом происходит по инициативе хоста. Поэтому, данные не попадут в хост до тех пор пока хост сам не захочет их прочитать.
Вот и все.

Итого

Вот, в принципе, все необходимое для того чтобы создать на STM32 примитивный USB-девайс. Весь обмен сводится к чтению и записи в ендпойнты и разбору того, что же туда все-таки пришло и что с этим делать.
Лично мне кажется этот вариант проще, чем реализация на девайсе стандатного класса.

Как всегда, файлы с проектом находятся тут.

Ну а в следующий раз, когда дойдут руки, будем поднимать USB Mass Storage, причем поверх уже сделанного интерфейса для светодиодов, т.е. составное USB-устройство 🙂

Где Взять Драйвера Для Платы

Автор: Mkile, 21 июня 2014 в STM32

Рекомендованные сообщения

Присоединяйтесь к обсуждению

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

Читайте также:  Способы обновления операционной системы windows

Сообщения

Похожие публикации

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

Микроконтроллер я как понял он питается и управляется с помощью 3.3В а 5В нежелательно, поскольку мк может сгореть. Хотя многие говорят можно подать, а в дотушите нету упоминания, можете разъяснить этот момент. (знаю можно устранить с помощью подтягивающего резистора, но всё же, хочу знать от мнение асов и кто уже просветлён).

Есть датчики температуры, уровень жидкости и её температура, скорости вращения. Их я как понимаю можно подключить на МК через усилитель, ФНЧ и комутатор аналоговых сигналов а затем на МК пустить. (питание через гальваническую развязку сделаю), так можно делать? Интересует схема этих датчиков которые я перечислил, желательно для промышленности поскольку не могу выбрать а какие-то не могу найти потому что не знаю что поставить.

Ещё читал что аналоговые датчики можно подключать напрямую из датчиков к МК (через делитель). Что скажите?

И такой момент, на МК есть вводы и выводы. Т.е. программно в них можно прописать какой пин будет вводом а какой выводом? Дискретным или аналоговым, можете рассказать? Или на статью с разъяснением скиньте.

Здравствуйте, товарищи форумчане!
У меня вот такая проблемка: есть такая схема:

По сути тут stm32 на который подаётся некоторое постоянное напряжение, а именно на вход PA1. МК получает его, приводит в цифровую форму (разрядность АЦП равна восьми) и выводит их при помощи восьми GPIO выводов, а именно PB0-PB7. Эти выводы соединены со схемой ЦАП, которая преобразует значение, полученное от stm32 обратно в аналоговую форму и выводит в пробнике R2(1).
Проблема в том результат выводится не верный. Точнее говоря не всегда верный. Когда я подаю 1В, то на выходе получаю 0,99В, что верно. Но когда, например, подаю 300мВ, то получаю 1.8В, что совсем не верно. Код прошивки предельно прост:
while (1)
<
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(10);
>
Код колбека прерывания:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
<
if(hadc->Instance == ADC1) //check if the interrupt comes from ACD1
<
int adc = HAL_ADC_GetValue(&hadc1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,(adc>>0)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,(adc>>1)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,(adc>>2)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,(adc>>3)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,(adc>>4)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,(adc>>5)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,(adc>>6)&1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,(adc>>7)&1);
>
>
На всякий случай вот настройка АЦП в stm32:

STM32 usb driver not recognised win10 #697

Comments

paolovr70 commented Oct 2, 2019

HI thank you for you repository. I used the two batch files for drivers but WIN10 does not recognize the stm32. Message is no associated driver. Any suggestion? Thanks. P.

The text was updated successfully, but these errors were encountered:

rtek1000 commented Oct 5, 2019

Windows 10 makes the installer go crazy because of the drivers. Is this the case of unsigned driver? What is the VID / PID that appears in your computer’s device manager?

STM32F103C8T6 — Virtual Serial Port:

Читайте также:  Лучшие предложения для windows

stevstrong commented Oct 8, 2019

You have to execute the batch file with admin rights.

paolovr70 commented Oct 15, 2019

Yes. BAT File executed but the problem remains. I tried with 3 different win10 compiters. I am not able to change the driver and use a different one because.the system tell me that it.is already using the best one according to win10. Any suggestion?

rogerclarkmelbourne commented Oct 15, 2019

I tested this recently on a brand new W10 installation and it worked fine.
Even if the STM32 was already connected.

rtek1000 commented Oct 16, 2019

What board are you using?

Some boards may have a hardware error that may not let your computer recognize USB, a pull-up resistor on the USB data line, see:

paolovr70 commented Oct 16, 2019 •

Thank you, for the reply but in my BOARD R10 ia resistor with the vaue of 152, that is exactly 1.5k. This is the board (on ebay.com): STM32F103C8T6 ARM STM32 Minimum System Development Board Module For Arduino
Any other idea? thanks. p.

adamfxtion commented Oct 17, 2019

I was have been having problems getting USB to work with recent STM32F103C8T6 system minimum boards, getting ‘device not recognised’ messages and ‘device descriptor request failed’ message in device manager (Win 10). I have concluded that while the boards were sold as STM32F103C8T6 system minimum boards and the chips are labelled as STM32F103C8T6, they are in fact something else with STM32 markings. there may of course be versions of the chip with correct markings, not STM32) that that also don’t work.
The link below, second page, has more on these boards. While the discussion is about not being able to program STM32’s with STlink, it turns out that the reason it doesn’t work is because the CPUID was different than that which would be read from a genuine STM32 part.

I have tested my boards and the configuration bits at 0xE00FFFC0 are a match for Macbeth’s when read using using ST-Link Utility, so the manufacturer as read from the chip is not ST if I understand correctly.
I have not found any of the STM32duino code (including bootloaders) to work with these chips, whatever they are. I did successfully get the openCM3 CDC example project to work in VSC/Platformio (after sorting out the STlink programming issue discussed in the link) and Macbeth got the USB to work another way, but as it stands the, it looks as though the current STM32duino code and these chips are incompatible. It also rather looks to me like a large batch of these particular boards with suspect chips is now in circulation, as I have 6 boards obtained in 3 different orders, 2 from UK stock and 4 in 2 lots from China direct (all last couple of months though). I also confirmed that changing the CPU for an STM32 obtained from Farnell on one of these boards fixed the USB issue.

Оцените статью