Перейти к содержанию
    

FreeRTOS и библиотеки USB из CubeMX

Здравствуйте!
Интересует возможность адаптации примеров из CubeMX для STM32 по работе с USB (CDC, CDC+MSD) под FreeRtos. Есть ли такая возможность в принципе? 

Изменено пользователем VadimNic_nt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, VadimNic_nt said:

Есть ли такая возможность в принципе? 

Конечно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, x893 said:

Конечно

Хотелось бы понять. Можно-ли создать в CubeMX рабочий проект, например с USB CDC, реализующий эхо через VCP и UART без допиливания библиотек CubeMX?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, VadimNic_nt said:

Можно-ли создать в CubeMX рабочий проект, например с USB CDC, реализующий эхо через VCP и UART без допиливания библиотек CubeMX?

Конечно. Допиливать не нужно, но своё написать (или скоммуниздить на github) придётся

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, x893 said:

Конечно. Допиливать не нужно, но своё написать (или скоммуниздить на github) придётся

Может подскажите какую-нибудь статью, чтобы понять как это лучше сделать? Ну или если знаете подходящий репозиторий на GitHub,  дайте ссылку, плиз...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где USB, а где FreeRTOS? То, что вы хотите - это делается, только нет ни какой завязки между ос и usb, так же, как например с UART.

Собирайте проект в кубе с USB. Это делается чуть-ли не 2-3 клика мыши, без боли и танцев с бубном (писать ответ сюда - дольше). 

В итоге у вас будет сгенерирован код в который достаточно вставить 1 строку для вызова своего обработчика. Вот как у меня вышло

usbd_cdc_if.c
 

/**
  * @brief  Data received over USB OUT endpoint are sent over CDC interface
  *         through this function.
  *
  *         @note
  *         This function will block any OUT packet reception on USB endpoint
  *         untill exiting this function. If you exit this function before transfer
  *         is complete on CDC interface (ie. using DMA controller) it will result
  *         in receiving more data while previous ones are still not sent.
  *
  * @param  Buf: Buffer of data to be received
  * @param  Len: Number of data received (in bytes)
  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
  */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);



    uint8_t *p = resiveUsbJ(Buf, *Len);//мой внешний обработчик
    if(p[2] > 0)
        CDC_Transmit_FS(p, p[2]); //отправка ответа



    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    return (USBD_OK);
  /* USER CODE END 6 */
}

Чтобы отправить эхо, вообще внешних методов не нужно (ровно как и ни каких ртос)
 

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);

    CDC_Transmit_FS(Buf, *Len);//отправляем эхо

    USBD_CDC_ReceivePacket(&hUsbDeviceFS);
    return (USBD_OK);
  /* USER CODE END 6 */
}

Это все крутиться в обработчике. Вам нужно обработку переместить в FreeRTOS? Карты в руки! Полученные данные из CDC_Receive_FS() отправляйте месаджем/флагом/эвентом/симафором/очередью в тред оси, в задаче обрабатывайте и отправляйте обратно в ад UART USB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 hours ago, juvf said:

Где USB, а где FreeRTOS? То, что вы хотите - это делается, только нет ни какой завязки между ос и usb, так же, как например с UART.

Собирайте проект в кубе с USB. Это делается чуть-ли не 2-3 клика мыши, без боли и танцев с бубном (писать ответ сюда - дольше). 

 

Спасибо за ответ. Опыт использования UCB CDC из CubeMX у меня есть, только ранее в своих приложениях (не очень сложных) я использовал автомат состояний.

Читая статьи на разных сайтах про взаимоотношения CubeMX, USB и FreeRTOS у меня сложилось впечатление, что реализация стека USB от CubeMX плохо стыкуется с FreeRTOS, т.к. стек USB работает через прерывания.

Поэтому и решил поднять этот вопрос и узнать мнение спецов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, VadimNic_nt сказал:

реализация стека USB от CubeMX плохо стыкуется с FreeRTOS, т.к. стек USB работает через прерывания.

Большинство периферии обслуживается с использованием прерываний. Но это никак не мешает взаимодействию с ОС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...