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

Как все-таки правильно делать CDC на STM32?

11 часов назад, x893 сказал:

На github нет случайно его ?

Моего проекта? Нет. Там нет куба, все на регистрах и плюсах. Писано год назад, больше host нигде пока не нужен был. Но вы спрашивайте (можно в личке), постараюсь вспомнить.

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


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

17 hours ago, Сергей Борщ said:

Моего проекта? Нет. Там нет куба, все на регистрах и плюсах. Писано год назад, больше host нигде пока не нужен был. Но вы спрашивайте (можно в личке), постараюсь вспомнить.

Да какая разница на чём написано. Клонировал и запустил (если конечно он работает).

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


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

Разница большая: если там используется SPL или "хал", то получится вообще неподдерживаемый код, с которым невозможно работать!

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


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

52 minutes ago, Eddy_Em said:

Разница большая: если там используется SPL или "хал", то получится вообще неподдерживаемый код, с которым невозможно работать!

Не бывает неподдерживаемого кода. Что мешает сделать git clone и не гадать на остатках кофе?

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


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

2 часа назад, x893 сказал:

Что мешает сделать git clone

Наверное то, что это проект, выполненный за зарплату и не предназначенный для распространения отдельно от устройства, для которого предназначен.

Нет смысла пытаться брать на "слабО?".

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


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

30 minutes ago, Сергей Борщ said:

Наверное то, что это проект, выполненный за зарплату и не предназначенный для распространения отдельно от устройства, для которого предназначен.

Нет смысла пытаться брать на "слабО?".

я и не думал, раз закрытый - значит закрытый.

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


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

Подниму тему.

Помучился уже достаточно хорошо с CDC, не могу понять почему зависает.  От компьютера передача идет нормально. К компьютеру периодически намертво виснет CDC_Transmit_FS() с кодом USB_BUSY.  Вынес CDC_Transmit_FS() в отдельный поток scmRTOS, она забирает данные из fifo.  При работе 2 процесса очень медленно наливают данные в fifo. Это может работать очень долго и без ошибок. Но как только присоединяется еще один процесс - начинаются зависания. Стеки выставил огромные для теста, Всё остальное работает кроме USB Tx. Идеи закончились... подскажите куда смотреть чтоб отловить баг.

 

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


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

В 13.08.2020 в 16:04, a_electronic сказал:

2-е па) Собственно, сам баг. Молодцы STMы залепили в функцию USBD_CDC_Init(...), которая вызывается в прерывании от USB, вызов USBD_malloc(...) со всеми вытекающими.
Т.е., надо - объявить статическую структутру USBD_CDC_HandleTypeDef  myClassCDC;

хм, в версии Revision 1.2 November 16, 2007

#define USBD_malloc         (uint32_t *)USBD_static_malloc

void *USBD_static_malloc(uint32_t size)
{
  static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */
  return mem;
}
 

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


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

В 19.07.2023 в 15:20, Gradient сказал:

подскажите куда смотреть чтоб отловить баг.

 

удалось вам отловить ?

Пока я выяснил, что флаг  (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData->TxState не сброшен в ноль

а сбрасывается в USBD_CDC_DataIn

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


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

Нет, причину не нашел и пофиксить не удалось. Подозреваю, что то связанное с питанием. Потому что если записать от dcdc то не виснет. Но от батареи или повер банка начинает подписать. Причем осциллограф провалов по питанию не видит. 

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

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


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

В 19.07.2023 в 15:20, Gradient сказал:

Помучился уже достаточно хорошо с CDC, не могу понять почему зависает.

У меня тоже на STM32F103 периодически зависало, пока не уменьшила приоритет прерываниям от USB. Суть в том, что прерывания от системного таймера должны иметь бОльший приоритет, чем USB, UART и I2C, т.к. в их реализация в CubeMX иногда вызывает задержки HAL_DELAY(), которые превращаются в бесконечность, когда системный таймер не может пробить свое прерывание.

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


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

Тогда отладчик бы показывал что зависаем в HAL_DELAY(). Но тем не менее, зависает именно функция передачи на этапе проверки флага занятости USB.

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


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

В 13.11.2023 в 20:45, megajohn сказал:

сбрасывается в USBD_CDC_DataIn

Это интересно. 

Разве согласно человеческой логике, он не должен сбрасываться при выгрузке последнего байта? Может его просто забыли в нужное место прописать? Если есть возможность, посмотрите состояние буфера , есть ли ещё данные и если нет, аппаратные флаги завершения передачи. По идее там прерывание должно сработать.

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


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

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

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

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

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

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

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

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

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

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