Jump to content

    
Sign in to follow this  
VadimNic_nt

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

Recommended Posts

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

Edited by VadimNic_nt

Share this post


Link to post
Share on other sites
2 hours ago, x893 said:

Конечно

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

Share this post


Link to post
Share on other sites
1 hour ago, VadimNic_nt said:

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

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

Share this post


Link to post
Share on other sites
13 hours ago, x893 said:

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

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

Share this post


Link to post
Share on other sites

Где 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

Share this post


Link to post
Share on other sites
12 hours ago, juvf said:

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

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

 

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

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

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

Share this post


Link to post
Share on other sites
4 минуты назад, VadimNic_nt сказал:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this