VadimNic_nt 0 Posted November 21, 2021 (edited) · Report post Здравствуйте! Интересует возможность адаптации примеров из CubeMX для STM32 по работе с USB (CDC, CDC+MSD) под FreeRtos. Есть ли такая возможность в принципе? Edited November 21, 2021 by VadimNic_nt Quote Ответить с цитированием Share this post Link to post Share on other sites
x893 0 Posted November 21, 2021 · Report post 3 hours ago, VadimNic_nt said: Есть ли такая возможность в принципе? Конечно Quote Ответить с цитированием Share this post Link to post Share on other sites
VadimNic_nt 0 Posted November 21, 2021 · Report post 2 hours ago, x893 said: Конечно Хотелось бы понять. Можно-ли создать в CubeMX рабочий проект, например с USB CDC, реализующий эхо через VCP и UART без допиливания библиотек CubeMX? Quote Ответить с цитированием Share this post Link to post Share on other sites
x893 0 Posted November 21, 2021 · Report post 1 hour ago, VadimNic_nt said: Можно-ли создать в CubeMX рабочий проект, например с USB CDC, реализующий эхо через VCP и UART без допиливания библиотек CubeMX? Конечно. Допиливать не нужно, но своё написать (или скоммуниздить на github) придётся Quote Ответить с цитированием Share this post Link to post Share on other sites
VadimNic_nt 0 Posted November 22, 2021 · Report post 13 hours ago, x893 said: Конечно. Допиливать не нужно, но своё написать (или скоммуниздить на github) придётся Может подскажите какую-нибудь статью, чтобы понять как это лучше сделать? Ну или если знаете подходящий репозиторий на GitHub, дайте ссылку, плиз... Quote Ответить с цитированием Share this post Link to post Share on other sites
juvf 0 Posted November 22, 2021 · Report post Где 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 Quote Ответить с цитированием Share this post Link to post Share on other sites
VadimNic_nt 0 Posted November 22, 2021 · Report post 12 hours ago, juvf said: Где USB, а где FreeRTOS? То, что вы хотите - это делается, только нет ни какой завязки между ос и usb, так же, как например с UART. Собирайте проект в кубе с USB. Это делается чуть-ли не 2-3 клика мыши, без боли и танцев с бубном (писать ответ сюда - дольше). Спасибо за ответ. Опыт использования UCB CDC из CubeMX у меня есть, только ранее в своих приложениях (не очень сложных) я использовал автомат состояний. Читая статьи на разных сайтах про взаимоотношения CubeMX, USB и FreeRTOS у меня сложилось впечатление, что реализация стека USB от CubeMX плохо стыкуется с FreeRTOS, т.к. стек USB работает через прерывания. Поэтому и решил поднять этот вопрос и узнать мнение спецов. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted November 22, 2021 · Report post 4 минуты назад, VadimNic_nt сказал: реализация стека USB от CubeMX плохо стыкуется с FreeRTOS, т.к. стек USB работает через прерывания. Большинство периферии обслуживается с использованием прерываний. Но это никак не мешает взаимодействию с ОС. Quote Ответить с цитированием Share this post Link to post Share on other sites