1. Внесённые изменения
1.1. Изменение VCP_DataTx
Наибольшее удивление вызвала функция VCP_DataTx, расположенная в src/usbd_cdc_vcp.c "чешского" дерева исходников и предназначенная для отправки данных USB/CDC-хосту. Оригинальный листинг:
static uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
/* puvodni verze realizujici presmerovani USART portu na USB virtualni port */
/*
if (linecoding.datatype == 7)
{
APP_Rx_Buffer[APP_Rx_ptr_in] = USART_ReceiveData(DISCOVERY_COM) & 0x7F;
}
else if (linecoding.datatype == 8)
{
APP_Rx_Buffer[APP_Rx_ptr_in] = USART_ReceiveData(DISCOVERY_COM);
}
*/
/* ****************************************************************** */
/* nova verze reagujici na stisk tlacitka */
if (linecoding.datatype == 7)
{
APP_Rx_Buffer[APP_Rx_ptr_in] = (uint8_t) Len & 0x7F;
}
else if (linecoding.datatype == 8)
{
APP_Rx_Buffer[APP_Rx_ptr_in] = (uint8_t) Len ;
}
/* ****************************************************************** */
APP_Rx_ptr_in++;
/* To avoid buffer overflow */
if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
{
APP_Rx_ptr_in = 0;
}
return USBD_OK;
}
Из представленных строк кода можно сделать вывод о том, что:
- функцию нельзя вызвать где-то за пределами данного файла, т.к. она объявлена статической;
- с помощью данной функции нельзя отправить массив байт USB/CDC-хосту, т.к. переменная Buf никоим образом не используется;
1.2. Удаление кода, имеющего отношение к USART
Было выполнено удаление кода, ответственного за инициализацию/обработку прерываний/приём и отправку данных через USART1. В самом простом случае устройство USB-CDC - это, по сути, преобразователь интерфейса USB <---> USART. И чешские программисты, работая над оригинальной кодовой базой от STMicroelectronics не стали удалять данный функционал. Тем не менее, очень часто от CDC-устройств ждут несколько более сложного поведения, нежели простой двухсторонний проброс данных. В связи с этим было принято решение об удалении поддержки USB <---> USART в явном виде.
1.3. Чистка кода
На основании опыта, полученного при разработке USB-CDC устройств на базе микроконтроллеров семейства STM32F1xx, было принято решение об удалении некоторых фрагментов кода, имеющих отношение к CDC, но не влияющих на работоспособность канала обмена данными.
2. Итоги
После внесённых изменений прошитая отладочная плата STM32F4Discovery выполняет следующие функции: - ежесекундная отправка текущего значения счётчика секунд usb-хосту с переключением состояния синего светодиода LED6; - при получении данных от USB/CDC-хоста производится увеличение на единицу (инкремент) каждого из полученных байт с последующей отправкой модифицированных данных USB/CDC-хосту;' - отправка строки "hello world!" USB/CDC-хосту каждый раз при нажатии на расположенную на отладочной плате пользовательскую (синюю) кнопку (защита от дребезга отсутствует);
Для начала работы с CDC-устройством (прошитой STM32F4Discovery) необходимо установить соответствующие драйвера для Windows XP/Vista/7. Основанные на ядре Linux операционные системы, в частности, Ubuntu 10.04 LTS или Ubuntu 12.04 LTS поддерживают обмен данными с CDC-устройством "из коробки":

При дальнейшей разработке первоочередное внимание необходимо уделить функциям VCP_DataTx и VCP_DataRx, расположенным в src/usb-cdc/usbd_cdc_vcp.c изменённого проекта.
3. Ссылки
- stm32f4-usb-cdc.zip - Eclipse-проект с полным деревом исходных текстов, готовый к сборке;
- stm32f4-usb-cdc.hex.zip - прошивка, полученная в результате сборки упомянутого выше Eclipse-проекта;
- stsw-stm32102.zip - Драйвера для поддержки USB/CDC-устройств на базе STM32F4xx для семейства ОС Windows;