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;
© ООО "Контроль-В" 2012 - 2021