21. STM32. Программирование STM32F103. USB
На тестовой плате STM32F103 есть microUSB разъем. И он служит не только для подачи питания. STM32F103 может работать с USB в качестве различных USB - устройств. Как USB HID устройство, в том числе как клавиатура или мышка, как виртуальный последовательный порт, USB Mass Storage, и тому подобное. Мы рассмотрим лишь пару примеров. В первом - компьютер будет воспринимать STM32F103 как виртуальный последовательный порт. Во втором примере STM32F103 эмитирует клавиатуру и мышку. STM32F103 будет двигать мышкой, (конечно на экране :), и эмитировать нажатие кнопок на клавиатуре.
Описание работы USB
В общем, Вы должны понимать что:- USB устройства подключаются к Хосту (чаще всего, это - компьютер). Хост - главный, он всем управляет.
- USB устройство не может быть инициатором передачи данных. То есть, оно сидит и молчит, пока его не спросят. Спросили или прислали данные, - оно ответило или приняло данные и замолчало.
- USB устройство имеет уникальный идентификатор. Каждое USB устройство может иметь несколько конечных точек, каждая из которых имеет уникальный адрес. Именно через конечные точки передаются данные или команды.
- USB устройство имеет Дескриптор. Это массив данных, в котором содержится описание устройства. Благодаря дескриптору, операционная система получает информацию о USB устройстве и использует для общения с ним соответствующий драйвер.
- Хост идентифицирует USB-устройство по ID вендора и ID продукта (Vendor ID - VID и Product ID - PID)
Библиотека STM32 USB FS Device Lib
Для работы с USB, существует библиотека для STM32. Я использую версию STM32_USB-FS-Device_Lib_V4.0.0. Архив с библиотекой содержит несколько примеров. К сожалению, для CoIDE проектов нет. Обратите внимание, что тактирование USB интерфейса требует фиксированной частоты 48МГц.
Виртуальный последовательный порт
Прежде всего, нам надо позаботиться о том, чтобы компьютер смог адекватно воспринять наш STM32 как последовательный порт. Для этого надо установить драйвер, который очень сложно найти на сайте st.com, поэтому я его выложил на GITHUB: https://github.com/avislab/STM32F103/tree/master/Example_USB_Virtual_Com_Port/Drivers Драйвер для Win7, Win8 - VCP_V1.4.0_Setup.exe, для WindowsXP - VCP_V1.3.1_Setup.exe. Эти драйверы нужны только для Windows. Для Linux (Ubuntu) драйвер не нужен. Ubuntu его распознает и так. Обычно Ubuntu видит виртуальный порт как /dev/ttyACM0. Теперь пара слов о примере Example_USB_Virtual_Com_Port. После подключения прошитой платы с микроконтроллером к порту USB компьютера, компьютер будет воспринимать ее, как последовательный порт. В Windows это будет COM порт, в Linux - что-то вроде /dev/ttyACM0. В примере программа микроконтроллера реализует только эхо (echo). То есть, отправляет назад все принятые данные. Поэтому, когда Вы подключитесь к последовательному порту с помощью терминальной программы (например Putty), и начнете набирать текст, Вы увидите его на экране терминала. Если набрать символ `1` загорится светодиод на плате, когда микроконтроллер получит любой другой символ - он погасит светодиод. Этот функционал реализован в главном цикле программы:
int main(void)
{
Set_System();
SetSysClockTo72();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
/* Initialize Leds mounted on STM32 board */
GPIO_InitTypeDef GPIO_InitStructure;
/* Initialize LED which connected to PC13, Enable the Clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
while (1)
{
if (bDeviceState == CONFIGURED)
{
CDC_Receive_DATA();
// Check to see if we have data yet
if (Receive_length != 0)
{
// If received symbol `1` then LED turn on, else LED turn off
if (Receive_Buffer[0]==`1`) {
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
else {
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
// Echo
if (packet_sent == 1) {
CDC_Send_DATA ((uint8_t*)Receive_Buffer,Receive_length);
}
Receive_length = 0;
}
}
}
}
Полный код примера можно скачать здесь:
https://github.com/avislab/STM32F103/tree/master/Example_USB_Virtual_Com_Port
Клавиатура и мышь
Этот пример можно использовать, когда нужно создать устройство типа сканера штрих-кодов, который эмулирует нажатия клавиши на клавиатуре. Для использования подобных устройств не требуется специальных драйверов или отдельных программных решений. После подключения к USB порту компьютера плата с микроконтроллером эмулирует последовательность нажатия кнопок на клавиатуре (функция KEYBOARD_SEND_word), и передвигает курсор мыши на один пиксель вправо и вверх (функция MOUSE_move):
int main(void)
{
Set_System();
SetSysClockTo72();
USB_Interrupts_Config();
Set_USBClock();
USB_Init();
while (1)
{
if (bDeviceState == CONFIGURED)
{
if (PrevXferComplete)
{
KEYBOARD_SEND_word("HELLO!!!");
MOUSE_move(1,-1);
//RHIDCheckState();
}
}
}
}
Желательно открыть текстовый редактор и после этого подключать плату, тогда Вы сможете увидеть как набирается текст "HELLO !!!". Обратите внимание, что микроконтроллер эмулирует нажатие кнопок на клавиатуре, а не передает символы. Если у Вас будет включена русская раскладка клавиатуры, Вы увидите "РУДДЩ !!!" вместо "HELLO !!!".
Полный код примера можно скачать здесь:
https://github.com/avislab/STM32F103/tree/master/Example_USB_Keyboard
USB Mass Srorage
Этот пример демонстрирует возможность использования Flash памяти микроконтроллера в качестве USB носителя, то есть небольшой флешки. Размер памяти для использования всего 54Кб. С практической точки зрения это не имеет особой ценности, но в некоторых проектах возможность использовать STM32 как USB Mass Storage может пригодиться.
#include "stm32f10x.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
int main(void)
{
Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
while (bDeviceState != CONFIGURED);
while (1)
{
}
}
Полный код примера можно скачать здесь:
https://github.com/avislab/STM32F103/tree/master/Example_USB_Mass_Storage
Защита USB
К сожалению, STM32 оказался слабым перед электростатическими зарядами на линиях USB. Вы с легкостью можете сжечь порт микроконтроллера и даже не заметить этого. Компьютер просто перестанет распознавать STM32 как USB устройство. Все остальные части микроконтроллера могут дальше исправно работать и Вам может показаться, что это проблемы в контактах, или в прошивке контроллера. К сожалению, такое случается.
Смотри также:
- 1. STM32. Программирование STM32F103. Тестовая плата. Прошивка через последовательный порт и через ST-Link программатор
- 2. STM32. Программирование. IDE для STM32
- 3. STM32. Программирование STM32F103. GPIO
- 4. STM32. Программирование STM32F103. Тактирование
- 5. STM32. Программирование STM32F103. USART
- 6. STM32. Программирование STM32F103. NVIC
- 7. STM32. Программирование STM32F103. ADC
- 8. STM32. Программирование STM32F103. DMA
- 9. STM32. Программирование STM32F103. TIMER
- 10. STM32. Программирование STM32F103. TIMER. Захват сигнала
- 11. STM32. Программирование STM32F103. TIMER. Encoder
- 12. STM32. Программирование STM32F103. TIMER. PWM
- 13. STM32. Программирование STM32F103. EXTI
- 14. STM32. Программирование STM32F103. RTC
- 15. STM32. Программирование STM32F103. BKP
- 16. STM32. Программирование STM32F103. Flash
- 17. STM32. Программирование STM32F103. Watchdog
- 18. STM32. Программирование STM32F103. Remap
- 19. STM32. Программирование STM32F103. I2C Master
- 20. STM32. Программирование STM32F103. I2C Slave
- 21. STM32. Программирование STM32F103. USB
- 22. STM32. Программирование STM32F103. PWR
- 23. STM32. Программирование STM32F103. Option bytes
- 24. STM32. Программирование STM32F103. Bootloader
- STM32. Скачать примеры
- System Workbench for STM32 Установка на Ubuntu
- Keil uVision5 – IDE для STM32
- IAR Workbench – IDE для STM32
- Управление бесколлекторным двигателем постоянного тока (BLDC) с помощью STM32
- Управление PMSM с помощью STM32
Спасибо за замечательные статьи!
Проект компилируется в кукоксе, но при попытке прошить из него же через stlink приводит к потере программатором прошиваемой платы. Платка после этого уже не стирается и кукокса и лечится стиранием через UART. Прошивка бинарника через уарт происходит ОК, но платка при подключинее не опрделеяется, то есть неизв устройство, вид\\пид-ов винда не видит.
Автор, плиз, если услышишь, подкинь идеек как найти причину и через это получить ещё кусочек бесценного опыта! :)
Додати коментар
Недавні записи
- 🇺🇦 FOC Board STM32F103RB 🧩
- STM32 Motor control SDK - керування оборотами мотора за допомогою потенціометра 📑
- Flask✙Gunicorn✙Nginx➭😎
- STM32 Motor control SDK - програмне керування обертам мотора
- STM32 Motor control SDK - як створити перший проект
- Vue SVG. Приклад побудови живого параметричного креслення
- Вимірювання моменту мотора
- Vue SVG - компонент. Приклад 📑
- Flask + Vue 🏁 Финальный пример 🏁
- Flask, CORS, JSON-файл. Пример#6
Tags
bldc brushless stm32 motor web html css flask atmega foc git java-script pmsm raspberry-pi python websocket mongodb esp8266 nodemcu st-link tim timer docker ngnix programmator ssd1331 ssd1306 wifi uart meteo bme280 bmp280 i2c gps mpu-6050 mpu-9250 sensors 3d-printer options usb barometer remap watchdog flash eeprom rtc bkp encoder pwm servo capture examples dma adc nvic usart gpio books battery dc-dc sms max1674 avr lcd dht11 piezo rs-232 rfid solar exti bluetooth eb-500 displays ethernet led smd soldering mpx4115a hih-4000
Архіви