STM32F4. Урок 31 — Использование USB-OTG как виртуальный COM-порт

Данная библиотека позволяет использовать USB OTG порт на плате Discovery в режиме CDC. Это позволяет создать виртуальный COM-порт (с логическими уровнями UART), дающий возможность совершать обмен данными между платой и ПК. На стороне компьютера устанавливается “VirtualComPort-Driver for ST”, который можно загрузить на сайте ST (автор тестировал версию 1.3.1). Поиск можно осуществить по запросу «STSW-STM32102». Библиотека ожидает идентификатор конца строки в виде символа «0x0D», означающий возврат каретки (который должен быть указан в конце). Настройка протокола (скорость, количество стоп-битов и т.д.) производится в драйвере USB. В библиотеке предусмотрены функции для отправки и приема строк и функция проверки соединения с USB. Автор тестировал написанные функции в “mini” PC-Terminal программе. Для подключения использовался microUSB кабель (который можно купить на eBay или Amazon)

Используемые выводы:

 PA8  -> USB_OTG_SOF (не используется)
 PA9  -> USB_OTG_VBUS
 PA10 -> USB_OTG_ID
 PA11 -> USB_OTG_DM
 PA12 -> USB_OTG_DP

Требуемые библиотеки:

Подключаемые модули CooCox-IDE: GPIO, MISC
Поддерживаемые библиотеки: отсутствуют

Перечисления:

 typedef enum {   USB_CDC_NO_INIT =0, // интерфейс USB не инициализирован    USB_CDC_DETACHED,   // USB-соединение инициализировано   USB_CDC_CONNECTED   // USB-Соединение установлено }USB_CDC_STATUS_t; USB_CDC_STATUS_t USB_CDC_STATUS;  typedef enum {   NONE = 0,  // без идентификатора   LFCR,      // возврат строки и перевод каретки (0x0A,0x0D)   CRLF,      // перевод каретки и возврат строки (0x0D,0x0A)   LF,        // перевод строки (0x0A)   CR         // возврат каретки (0x0D) }USB_CDC_LASTBYTE_t;  typedef enum {   RX_USB_ERR =0, // нет подключения к USB   RX_EMPTY,      // данные не приходят   RX_READY       // данные, принятые в буфер }USB_CDC_RXSTATUS_t;

Функции:

 void UB_USB_CDC_Init(void);                                                // инициализировать интерфейс USB USB_CDC_STATUS_t UB_USB_CDC_GetStatus(void);                               // Проверка статуса USB ErrorStatus UB_USB_CDC_SendString(char *ptr, USB_CDC_LASTBYTE_t end_cmd);  // Отправить строку через USB USB_CDC_RXSTATUS_t UB_USB_CDC_ReceiveString(char *ptr);                    // Принять строку через USB

Пример использования:

 //-------------------------------------------------------------- // File     : main.c // Datum    : 23.06.2013 // Version  : 1.4 // Autor    : UB // EMail    : mc-4u(@)t-online.de // Web      : www.mikrocontroller-4u.de // CPU      : STM32F4 // IDE      : CooCox CoIDE 1.7.0 // Module   : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der USB-CDC-Library // Hinweis  : Diese zwei Files muessen auf 8MHz stehen //              "cmsis_boot/stm32f4xx.h" //              "cmsis_boot/system_stm32f4xx.c" //--------------------------------------------------------------  #include "main.h" #include "stm32_ub_usb_cdc.h"  int main(void) {   char buf[APP_TX_BUF_SIZE]; // буфер для приема данных   USB_CDC_RXSTATUS_t check=RX_EMPTY;    SystemInit(); // Инициализация настроек кварца    // Инициализация USB-OTG-порта как CDC-устройство   // (Виртуальный COM порт)   UB_USB_CDC_Init();    while(1)   { 	  // Проверка работы USB-подключения к ПК 	  if(UB_USB_CDC_GetStatus()==USB_CDC_CONNECTED) { 		  // Проверка получения данных по USB 		  check=UB_USB_CDC_ReceiveString(buf); 		  if(check==RX_READY) { 			  // При получении данных 			  // вернуться эхо 			  // (с перемещением на новую строку) 			  UB_USB_CDC_SendString(buf,LFCR); 		  } 	  }   } } 

В приложении проект CooCox и отдельная библиотека для использования в других проектах, а так же программа-терминал для работы с COM-портом. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.