|
STM32CubeMX и USB CDC, какие функции использовать? |
|
|
|
 |
Ответов
|
Nov 14 2015, 16:43
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Вопрос на ту же тему. Поднял Midware USB CDC (HAL) пришедшее с Stm32 CubeMX v1.0 (version 4.6.0) (Device), процессор Stm32f207. На всякий случай некоторые подробности. 1. При получении пакета CDC вызывается пользовательская (callback) функция CDC_Receive_FS (uint8_t* Buf, uint32_t *Len). Вызов идет на уровне прерываний. В ней я считываю данные и, обязательно, вызываю USBD_CDC_ReceivePacket(hUsbDevice_0), иначе следующий пакет не будет принят. Изначально, для контроля по Эхо, в ней же вызывалась функция посылки ответа CDC_Transmit_FS(...). Затем стал устанавливать флаг и вызывать ее в MainLoop. 2. Для отправки ответных данных служит пользовательская функция CDC_Transmit_FS(...) вызываемая из любого места, в частности из MainLoop. В ней сначала заполняется буфер, затем вызывается функция USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, Len), затем собственно отправка пакета USBD_CDC_TransmitPacket(hUsbDevice_0) (внутренняя функция HAL).
Сначала CDC_Transmit_FS вызывалась прямо в CDC_Receive_FS (т.е. на уровне прерываний) для контроля эхо и все работало идеально. Затем, для анализа и формирования ответного пакета, перенес CDC_Transmit_FS в MainLoop. И вот тут начались проблемы.
Т.е. все (эхо) работает нормально до какого-то момента, а, затем, затыкается навсегда из-за того, что передача пакета зависает навсегда - при попытке вызова USBD_CDC_TransmitPacket она возвращает USBD_BUSY.
Всякие эксперименты дали следующее - все начинает работать прекрасно, если перед вызовом USBD_CDC_TransmitPacket запретить прерывания, а, потом, снова разрешить. Но это как-то слишком криво получается.
Т.е. похоже, что если при выполнении USBD_CDC_TransmitPacket происходит прерывание, то HALовская система обалдевает.
Никто с подобным не сталкивался?
P.S. Да, сейчас прерывания "плоские", т.е. все на одном уровне приоритета. Может тут можно поиграться?
|
|
|
|
Сообщений в этой теме
ViKo STM32CubeMX и USB CDC Jul 14 2014, 18:00 Integro посмотрите в файле usbd_cdc_if.c,
CDC_Transmit_FS... Jul 15 2014, 11:38 ViKo Цитата(Integro @ Jul 15 2014, 14:38) посм... Jul 15 2014, 20:01  Integro Цитата(ViKo @ Jul 15 2014, 23:01) Пробова... Jul 16 2014, 07:50 ViKo Из мейн функции не видны. Можно инклюдами заголово... Jul 16 2014, 08:19 Integro Цитата(ViKo @ Jul 16 2014, 11:19) Из мейн... Jul 16 2014, 12:49 ViKo Кабы я умел программировать USB в STM32, стал бы я... Jul 16 2014, 16:18 Integro Цитата(ViKo @ Jul 16 2014, 19:18) Кабы я ... Jul 17 2014, 15:06 ViKo Вот функция из usbd_cdc_if.c
Код/**
* @brief CD... Jul 20 2014, 10:14 Integro Цитата(ViKo @ Jul 20 2014, 13:14) ...
Ха,... Jul 23 2014, 08:12  ViKo Цитата(Integro @ Jul 23 2014, 11:12) Ха, ... Jul 24 2014, 12:19   Tahoe Цитата(ViKo @ Jul 24 2014, 16:19) Пытался... Jul 24 2014, 14:32    ViKo Цитата(Tahoe @ Jul 24 2014, 17:32) Ну да,... Jul 24 2014, 14:51 den_po Цитата(ViKo @ Jul 20 2014, 14:14) Вот фун... Jul 30 2014, 20:37  Atlantis- Цитата(den_po @ Jul 31 2014, 00:37) Если ... Jul 31 2014, 06:17  Atlantis- Цитата(den_po @ Jul 31 2014, 00:37) Если ... Oct 20 2014, 08:12 Golikov A. а галочки дебуг и трейс информация, 0 оптимизация ... Jul 24 2014, 12:25 ViKo Цитата(Golikov A. @ Jul 24 2014, 15:25) а... Jul 24 2014, 13:05 Golikov A. совсем недавно кто-то запускал тут ЛА и прочую фиг... Jul 24 2014, 19:02 ViKo Цитата(Golikov A. @ Jul 24 2014, 22:02) с... Jul 24 2014, 19:05 ViKo Вдруг взяло и заработало. ЛА показывает. Ничего,... Jul 24 2014, 21:11 ViKo Опять не работает ЛА. Чувствую, дело в температуре... Jul 25 2014, 08:54 Golikov A. драйвер CDC - вещь суровая, у меня есть RS485 - ви... Jul 25 2014, 20:37 ViKo По поводу логического анализатора вырисовывается с... Jul 26 2014, 11:39 den_po Её не нужно самостоятельно вызывать, это колбэк, о... Jul 31 2014, 07:33 Atlantis- Цитата(den_po @ Jul 31 2014, 11:33) Её не... Jul 31 2014, 07:49  den_po Цитата(Atlantis- @ Jul 31 2014, 11:4... Jul 31 2014, 08:08   Atlantis- Цитата(den_po @ Jul 31 2014, 12:08) Давай... Jul 31 2014, 08:29    den_po Цитата(Atlantis- @ Jul 31 2014, 12:2... Jul 31 2014, 10:05     Atlantis- Цитата(den_po @ Jul 31 2014, 14:05) А мож... Jul 31 2014, 10:42      den_po Цитата(Atlantis- @ Jul 31 2014, 14:4... Jul 31 2014, 12:18       Atlantis- Цитата(den_po @ Jul 31 2014, 16:18) Вот э... Jul 31 2014, 12:33        den_po Цитата(Atlantis- @ Jul 31 2014, 16:3... Jul 31 2014, 13:53       Atlantis- Цитата(den_po @ Jul 31 2014, 16:18) Хе, с... Aug 1 2014, 05:55 ViKo У меня внутри бесконечного цикла работает такой ко... Jul 31 2014, 07:36 Atlantis- ЦитатаПроверьте свежесгенерированный кубом код, из... Aug 1 2014, 11:08 den_po CDC_Transmit_FS нужно вызывать самостоятельно, ког... Aug 1 2014, 11:29 Atlantis- Цитата(den_po @ Aug 1 2014, 15:29) CDC_Tr... Aug 1 2014, 12:02 den_po Думаю, ерунда может приходить, если отправляются д... Aug 2 2014, 13:01 den_po Баг с мусором в F0 почти убрал. В функции usbd_con... Aug 3 2014, 00:16 Vsevolod Gromov Цитата(Предыдущий баг - должно быть 15, а не 5)
Н... Oct 15 2014, 16:29  den_po Цитата(Vsevolod Gromov @ Oct 15 2014, 20... Oct 17 2014, 20:26   Vsevolod Gromov Цитата(den_po @ Oct 18 2014, 00:26) Там д... Oct 20 2014, 10:23 den_po Последняя проблема - моя ошибка. Просто драйвер на... Aug 6 2014, 12:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|