Настройка USB CDC на STM32

В данной статье рассмотрим как настроить USB CDC на STM32. В разработке устройств часто требуется передать данные на компьютер. Для этого можно использовать USB (если конечно оно имеется). Пример настройки USB CDC покажем с помощью библиотеки HAL. Так же для настройки используем CubeMX. С помощью данного программного средства, настройка usb cdc на stm32 не составит труда.

Что такое USB CDC

CDC — это своего рода последовательная шина, определенная USB2.0, поэтому мы можем использовать CDC для легкого установления связи со многими устройствами через порт USB.
Кстати, в USB2.0 определено очень много типов устройств:

  • Класс запоминающих устройств большой емкости (MSC)
  • Класс мыши и клавиатуры для интерфейса пользователя (HID)
  • Класс коммуникационного устройства (CDC)
  • Аудио класс(АУДИО)
  • Класс протокола передачи мультимедиа (MTP)

Class USB CDC

На рисунке выше показано, что cdc_if.c — это своего рода пользовательский интерфейс для реализации подключения CDC, и есть много библиотек более низкого уровня для обработки подробного подключения.
Кроме того, ядро ​​устройства заботится о стандартном перечислении управления подключением/отключением устройств, а класс устройства предоставляет API, который может быть вызван из прикладного уровня или процесса ядра устройства.

VCP и USB CDC на STM32

Класс USB CDC, как мы писали выше это шина, позволяющая реализовать разные интерфейсы. VCP это и есть интерфейс передачи данных (виртуальный ком порт). Посмотрим как настроить его в CubeMX.

Для начала создадим новый проект с нужным микроконтроллером, у меня это STM32L073xxx.
Затем включим устройство USB:

Включение устройства USB CDC в CubeMX

Следующим шагом необходимо перейти в Middleware and Software Packs выбрать USB_DEVICE и включить Virtual Com Port, как показано на рисунке ниже:

Активация VCP на USB CDC на STM32

Из важных настроек здесь будет VID и PID. Это идентификационные ID устройства. Они должны быть уникальными для устройства. Не для каждого, но для общего типа устройства.
Так же еще одним из настраиваемых параметров, является PRODUCT_STRING (Product Identifier). Это строковое имя устройства, отображаемое в системе.

Последним действием настройки udb cdc в stm32, будет настройка часов. Для того чтобы USB запустился, необходимо настроить генератор USB на 48 МГц.

Настройка тактирования USB CDC на 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. Спасибо за внимание.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии