Настроив проект в STM32CubeMx, тип устройства выберем USB Device Communication Device Class, мы можем сгенерировать программные файлы.
Устройство будет появляться в диспетчере устройств в виде COM-порта, если будет подключаться к ОС Windows.
В целях обучения выберем Makefiles и нажмем сгенерировать проект.
Проектные файлы
"USB_DEVICE/App/usb_device.c" --
исходный файл, отвечающий за инициализацию устройства USB. В нем по очереди вызываются функции:
USBD_Init -- инициализация библиотеки устройства и структуры, отвечающей за само устройство USB
USBD_RegisterClass -- выбор типа USB устройства, которое будет использоваться.
USBD_CDC_RegisterInterface -- активация программного интерфейса USB
USBD_Start -- активация всего программно-аппаратной системы USB.
"USB_DEVICE/App/usbd_desc.c"
Здесь интересны дефайны, которые будут показываться при работе с интерфейсом.
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PRODUCT_STRING_FS "STM32 Virtual ComPort"
source "USB_DEVICE/App/usbd_cdc_if.c"
Описывают функции в выбранном интерфейсе CDC: инициализацию, деинициализацию, отправку данных и прием.
Для изучения особенно интересна функция CDC_Control_FS, которая работает с запросами в соответствии с протоколом.
Также в этом файле содержатся самые важные в практическом плане функции, которые необходимы разработчику для работы через этот интерфейс.
Функция CDC_Transmit_FS позволит отправить пакет данных по протоколу.
А функция CDC_Receive_FS предназначена для приема данных по протоколу.
"USB_DEVICE/Target/usbd_conf.c"
Исходный код аппаратного обеспечения интерфейса USB:
- Инициализация часов, периферии и GPIO
- Инициализация регистров интерфейса
- Реализация прерываний
Например, реализация для embox. Кратко тут, более полно тут.
static irq_return_t eventUsbOTGFS_IRQhandler(unsigned int irq_nr, void *data)
{
HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
return IRQ_HANDLED;
}
STATIC_IRQ_ATTACH(67, eventUsbOTGFS_IRQhandler, NULL);
Для FreeRTOS и прочих вариантов нужно определить соответствующую функцию, которая будет вызывать функцию HAL_PCD_IRQHandler для корректной работы программного обеспечения.
- Аппаратных отправки и получения данных
Файлы вспомогательного обеспечения
"Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c"
К этим файлам обращается модуль из файла usb_device. Описывается инициализация интерфейса.
"Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c"
Обработчик стандартных запросов протокола USB.
"Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c"
Функции ввода/вывода по каналу передачи данных интерфейса USB.
"Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c"
Описывается инициализация класса CDC, основные пакеты этого класса, а также аппаратные функции передачи данных.