STM32F4Discovery - организация виртуального COM-порта VCP

Практически во всех компьютерах сейчас есть универсальная последовательная шина USB (Universal Serial Bus). USB - это последовательный интерфейс передачи данных для среднескоростных и низкоскоростных периферийных устройств.

COM-порт или RS232 на компьютерах сейчас почти не встречается. Хотя, если быть более точным, то RS-232 (Recommended Standard 232) это физический уровень для асинхронного (UART) интерфейса или, если по-другому, это каким напряжением передаются нолики и единички по проводам, а как организуется сама передача данных, определяется универсальным асинхронным приёмопередатчиком (УАПП) или UART (Universal Asynchronous Receiver-Transmitter).

Несмотря на то, что в компьютерах COM-порт практически исчез, в промышленном и узкоспециальном оборудовании, встраиваемых устройствах, COM-порт ещё довольно широко используется. Поэтому, для того чтобы обеспечить обмен данными таких устройств с компьютером, в стандарт USB включен такой класс устройств как CDC (Communication Device Class). Если USB-устройство относиться к этому классу CDC (Communication Device Class) и подключается к компьютеру через разъём USB, то в системе создаётся еще один COM-порт. Это виртуальный COM-порт (VCP). Виртуальный COM-порт (VCP) возникает при подключении устройства и исчезает при его отключении. Но, несмотря на то, что это виртуальный COM-порт, он позволяет работать с собой как реальный, физически существующий.

Если на базе микроконтроллера STM32F407 нужно создать устройство которое обязано обмениваться данными через COM-порт, а есть только разъемы USB, то использование класса CDC как раз для этого случая.

На отладочной плате STM32F4Discovery есть разъём микро-USB, через который можно организовать обмен данными с компьютером. Для организации виртуального COM-порта на STM32F4Discovery существует в библиотеке специальный класс USB CDC Class, который позволяет организовать обмен данными через виртуальный COM-порт. Находиться описание этого класса в папке STM32F4-Discovery_FW_V1.1.0 \Libraries \STM32_USB_Device_Library \Class \cdc.

В интернет был найден пример создания и использования виртуального COM-порта на STM32F4Discovery (см. http://firsthand.ru/node/309). Этот пример был для toolchain IAR EWARM. При нажатии пользовательской кнопки на STM32F4Discovery через виртуальный COM-порт на компьютер из микроконтроллера передаётся "HELLO", а при передаче на контроллер символа "A" загорается светодиод и при передаче на контроллер символа "S" этот светодиод гаснет. Мне этого было не достаточно.

Мне нужно передавать в микроконтроллер, в данном случае в STM32F4Discovery, команду с дополнительными параметрами. Мне нужно чтобы STM32F4Discovery принимал несколько байт сразу, а не один символ, как в примере. После принятия этих нескольких байт, микроконтроллер должен определить, что от него требуется, обработать всё что нужно и выдать результат обработки обратно в компьютер через виртуальный COM-порт.

Для начала пример был переделан на получение STM32F4Discovery через виртуальный COM-порт определенного количества символов и выдачу, всего полученного, обратно на компьютер через тот же виртуальный COM-порт (мой пример с VCP см. в архиве http://yadi.sk/d/1_oLxP3NGoRys).

Для этого был организован кольцевой буфер Buf_In[BUF_IN_SIZE], куда по прерыванию переписывается все, что пришло из компьютера.  (см. функцию VCP_DataRx() файл usbd_cdc_vcp.c)

Если количество данных во входном буфере Buf_In[] превышает длину данных для начала обработки, то ВСЕ данные из Buf_In[] переписываются в выходной и отсылается в порт (функция VCP_DataTx (&Buf_Out[0],Buf_In_Len);).

Ну и осталась возможность, при нажатии кнопки на STM32F4DISCOVERY, передать через виртуальный COM-порт в компьютер "HELLO" (см. функцию EXTI0_IRQHandler(void) файл stm32f4xx_it.c). Эта возможность оставлена для проверки связи с HyperTerminal.

После компиляции и загрузки программы в микроконтроллер, после подключения STM32F4DISCOVERY через микро-USB к USB компьютера, в системе должен появиться STMicroelectronics Virtual COM Port. Посмотреть это можно в Диспетчере устройств в разделе "Порты (COM и LPT)". У меня виртуальный COMport определяется как STMicroelectronics Virtual COM Port (COM26).

Теперь, запустив программу HyperTerminal на компьютере и настроив её на работу с COM-портом ( у меня это COM26), можно проверить работу, нажав на кнопку на STM32F4DISCOVERY. На экране должна возникнуть надпись "HELLO".

Если просто набирать какие либо символы на клавиатуре, то после набора 16 символов (см. uint32_t LenMax = 16; // длина данных для начала обработки в фале main.c) вы должны будете получить их обратно на экране HyperTerminal.