В данной статье рассмотрим как настроить USB CDC на STM32. В разработке устройств часто требуется передать данные на компьютер. Для этого можно использовать USB (если конечно оно имеется). Пример настройки USB CDC покажем с помощью библиотеки HAL. Так же для настройки используем CubeMX. С помощью данного программного средства, настройка usb cdc на stm32 не составит труда.
Что такое USB CDC
CDC — это своего рода последовательная шина, определенная USB2.0, поэтому мы можем использовать CDC для легкого установления связи со многими устройствами через порт USB.
Кстати, в USB2.0 определено очень много типов устройств:
- Класс запоминающих устройств большой емкости (MSC)
- Класс мыши и клавиатуры для интерфейса пользователя (HID)
- Класс коммуникационного устройства (CDC)
- Аудио класс(АУДИО)
- Класс протокола передачи мультимедиа (MTP)
На рисунке выше показано, что cdc_if.c — это своего рода пользовательский интерфейс для реализации подключения CDC, и есть много библиотек более низкого уровня для обработки подробного подключения.
Кроме того, ядро устройства заботится о стандартном перечислении управления подключением/отключением устройств, а класс устройства предоставляет API, который может быть вызван из прикладного уровня или процесса ядра устройства.
VCP и USB CDC на STM32
Класс USB CDC, как мы писали выше это шина, позволяющая реализовать разные интерфейсы. VCP это и есть интерфейс передачи данных (виртуальный ком порт). Посмотрим как настроить его в CubeMX.
Для начала создадим новый проект с нужным микроконтроллером, у меня это STM32L073xxx.
Затем включим устройство USB:
Следующим шагом необходимо перейти в Middleware and Software Packs выбрать USB_DEVICE и включить Virtual Com Port, как показано на рисунке ниже:
Из важных настроек здесь будет VID и PID. Это идентификационные ID устройства. Они должны быть уникальными для устройства. Не для каждого, но для общего типа устройства.
Так же еще одним из настраиваемых параметров, является PRODUCT_STRING (Product Identifier). Это строковое имя устройства, отображаемое в системе.
Последним действием настройки udb cdc в stm32, будет настройка часов. Для того чтобы USB запустился, необходимо настроить генератор USB на 48 МГц.
Вот и все можно сгенерировать наш проект и переходить к написанию кода.
USB CDC: Пишем код
Дополнительно сгенерированному коду, добавим в заголовок еще одну библиотеку:
#include “usbd_cdc_if.h”
В этой библиотеке содержаться функции по приему и передачи данных через USB.
CDC_Transmit_FS
Функция предназначена для отправки данных. Имеет следующий прототип:
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len), где
Buf – буфер с данными.
Len – количество байт для отправки.
CDC_Receive_FS
Функция предназначена для приема данных. Имеет следующий прототип:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len), где
Buf – буфер для приема.
Len – ожидаемое количество принимаемых байт.
Что бы организовать прием данных необходимо в usbd_cdc_if.с объявить переменную приемного буфера и поставить идентификатор extern:
extern uint8_t bufferUSB[64];
Так же необходимо модифицировать функцию CDC_Receive_FS:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); USBD_CDC_ReceivePacket(&hUsbDeviceFS); memset (bufferUSB, '\0', 64); // clear the buffer uint8_t len = (uint8_t)*Len; memcpy(bufferUSB, Buf, len); // copy the data to the buffer memset(Buf, '\0', len); // clear the Buf also return (USBD_OK); /* USER CODE END 6 */ }
Теперь, как только поступят данные на порт USB они будут помещены в буфер bufferUSB. Прочитать его можно будет в любом месте программы. Данный буфер не очищается до тех пор пока не поступят новые данные.
Вот и вся настройка USB CDC и VCP на STM32. Спасибо за внимание.