STM32CubeMX USB CDC VCP?

Я нашел большое количество примеров, но ничего о том, как это сделать "правильно" из STM32MXCube.

Как создать скелетный код из STM32CubeMX для связи виртуального COM-порта USB CDC (если возможно, обнаружение STM32F4)?

3 ответов


проект STM32CubeMX для Discovery F4 с CDC в качестве USB-устройства должен работать из коробки. Предполагая, что вы используете обновленный STM32CubeMX и библиотеку:

  • Запустить STM32CubeMX
  • выберите совет Discovery F4
  • включить периферийное устройство UBS_OTG_FS только (оставить над вещами снимите флажок)
  • включить связь midlleware USB_Device .. .он же CDC

на вкладке Часы проверьте источник часов HSE HCLK. Он должен дать 168 МГц HLCK и 48 МГц в 48 МГц (USB). Проверьте, нет ли красного нигде.

сохранить проект

создать код (я использовал sw4stm32 toolchains)

Build (возможно, вам придется переключиться на внутренний CDT builder против GNU make).

Теперь добавьте код для отправки данных через COM-порт, и вуаля, он должен работать.

на самом деле, сложная часть не пытается сделать какой-либо "CDC" доступ, пока хост USB не подключается (нет настройки CDC еще)

здесь как я это сделал для быстрого теста emit:

в файле usbd_cdc_if.c

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
    uint8_t result = USBD_OK;

    /* USER CODE BEGIN 7 */
    if (hUsbDevice_0 == NULL)
        return -1;

    USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
    result = USBD_CDC_TransmitPacket(hUsbDevice_0);
    /* USER CODE END 7 */

    return result;
}

static int8_t CDC_DeInit_FS(void)
{
    /* USER CODE BEGIN 4 */
    hUsbDevice_0 = NULL;
    return (USBD_OK);
    /* USER CODE END 4 */
}

в главном файле.c

/* USER CODE BEGIN Includes */
#include "usbd_cdc_if.h"
/* USER CODE END Includes */
....

/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    uint8_t HiMsg[] = "hello\r\n";
    CDC_Transmit_FS(HiMsg, strlen(HiMsg));
    HAL_Delay(200);
}

как только вы подключите micro USB (CN5) CDC данные начнут отображаться на хост-терминале.

это работает. Я вижу "привет" на терминале (возможно, Вам потребуется установить драйвер,http://www.st.com/web/en/catalog/tools/PF257938).

для приема, он должен быть первым вооружен, скажем, начал с первого вызова в USBD_CDC_ReceivePacket () в хорошем месте. Для этого он может быть CDC_Init_FS.

затем вы можете обрабатывать данные, как он поступает в CDC_Receive_FS и перевооружение приема снова отсюда.

это работает для меня.

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
    /* USER CODE BEGIN 6 */
    USBD_CDC_ReceivePacket(hUsbDevice_0);
    return (USBD_OK);
    /* USER CODE END 6 */
}

static int8_t CDC_Init_FS(void)
{
    hUsbDevice_0 = &hUsbDeviceFS;

    /* USER CODE BEGIN 3 */
    /* Set Application Buffers */
    USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, 0);
    USBD_CDC_SetRxBuffer(hUsbDevice_0, UserRxBufferFS);
    USBD_CDC_ReceivePacket(hUsbDevice_0);

    return (USBD_OK);
    /* USER CODE END 3 */
}

есть несколько плат обнаружения STM32F4, поддерживаемых программным обеспечением STM32Cube, и вы не сказали, что используете, но у меня была точно такая же проблема с доской обнаружения с F401VCT MCU.

после установки драйвера виртуального COM-порта STM Диспетчер устройств Windows показал виртуальный COM-порт STMicroelectronics, но с желтой предупреждающей меткой. COM-порт не был доступен с терминальным приложением (шпаклевка).

I в конце концов обнаружил, что есть проблема с выводом исходного кода из программы STMCube. Но есть простое решение:

  1. откройте новый проект STM32Cube и включите USB_OTG_FS как устройство Только и выберите CDC Virtual Port COM из промежуточных программ Раскрывающийся USB_Device.
  2. создайте исходный код без каких-либо других изменений, необходимых для любых настроек USB.
  3. в файле usbd_cdc_if.c, change #define USB_HS_MAX_PACKET_SIZE от 512 до 256.
  4. в файле usbd_cdc.c, измените #define CDC_DATA_HS_MAX_PACKET_SIZE С 512 до 256.

после этого желтое предупреждение исчезло из Диспетчера устройств, и я мог получать данные в функции CDC_Receive_FS (в usbd_cdc_if.C файл) при использовании шпатлевки. Имейте в виду, что эти определения возвращаются к своим неправильным значениям каждый раз, когда STM32Cube генерирует код, и я не нашел способа обойти это еще.

надеюсь, это поможет.


iChal это!--5--> работал, чтобы удалить желтый предупреждающий знак.

Я хотел бы отметить, что USB_HS_MAX_PACKET_SIZE теперь находится в usbd_def.h и CDC_DATA_HS_MAX_PACKET_SIZE в usbd_cdc.h

Я использую STM32CubeMX v4.11.0 STM32Cube v1.0 и STM32F401C-дискотека.

при дальнейшей работе мне теперь нужно только установить размер кучи на большее значение. Я устанавливаю его в 0x600, так как у меня также включен FreeRTOS. Я использую IAR EWARM, поэтому изменение производится в скрипте компоновщика stm32f401xc_flash.icf.