реклама на сайте
подробности

 
 
> STM32CubeMX и USB CDC, какие функции использовать?
ViKo
сообщение Jul 14 2014, 18:00
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Уже появилась в CubeMX поддержка STM32F3. Сделал проект для STM32F3Discovery. Подключаю к компьютеру - обнаруживается Virtual COM Port. Но как его использовать? В main программе на месте пользовательского кода - пустые места. Наверное, где-то описаны пара функций для работы - принять, послать. И буферы создать нужно. Не вижу ни в документации, ни в примерах. Поможите, люди добрые!
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
Golikov A.
сообщение Jul 24 2014, 19:02
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



совсем недавно кто-то запускал тут ЛА и прочую фигню, ему там много советов давали)...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 24 2014, 19:05
Сообщение #17


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Golikov A. @ Jul 24 2014, 22:02) *
совсем недавно кто-то запускал тут ЛА и прочую фигню, ему там много советов давали)...

Я давал. rolleyes.gif
Терзают смутные сомненья, что перегрузил я микроконтроллер работой. Программа в ОЗУ работает, быстрее, чем из флэш-памяти. Может, перекрыл какой-нибудь отладочный путь... Попробую из флэш.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 24 2014, 21:11
Сообщение #18


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вдруг взяло и заработало. laughing.gif ЛА показывает. Ничего, вроде не делал, не считая того, что перепробовал все свои платы и проекты. rolleyes.gif
Теперь пойду в USB. В нем тоже что-то ЛА показывает, но как-то пинка все ждет.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 25 2014, 08:54
Сообщение #19


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Опять не работает ЛА. Чувствую, дело в температуре, влажности, и частоте. Вечером проверю.

Еще одним чудом поделюсь, по теме. Не могу выключить компьютер, пока подключена плата F3Discivery с запущенным проектом CDC.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 25 2014, 20:37
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



драйвер CDC - вещь суровая, у меня есть RS485 - виртуальный ком порт через USB, ну то есть CDC. Помехи вешают его так, что ноутбук треба выключать жестким сбросом через удержание кнопки питания, ничего не помогает, даже снять задачу и прочее, выключить тоже нельзя, стоит с черным экраном и жужит хоть всю ночь.... А еще плюсом идут БИОСы с пробуждением по USB, в винде много накрутить можно...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 26 2014, 11:39
Сообщение #21


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



По поводу логического анализатора вырисовывается следующая картина. У меня Дискавери висит на USB проводе постоянно, и включается вместе с компьютером. Так вот, чтобы ЛА заработал, нужно переткнуть USB кабель в Дискавери (убрать питание на короткое время). После этого ЛА показывает сигналы. laughing.gif
Go to the top of the page
 
+Quote Post
den_po
сообщение Jul 30 2014, 20:37
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(ViKo @ Jul 20 2014, 14:14) *
Вот функция из usbd_cdc_if.c
Код
/**
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
...

Вопрос - как?! Как используется параметр Buf?

А вот еще один шедевр оттуда же.
Код
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
...

Это означает, что мне нужно поработать там своей головой?

Если кому ещё интересно, то вот:
Внутри CDC_Transmit_FS нужно самостоятельно выполнить нужные действия. Например, скопировать или дописать содержимое Buf в UserTxBufferFS.
Внутри CDC_Receive_FS нужно обработать пришедшие по USB данные. Чтобы следующий пакет успешно принялся, нужно после обработки данных (в главном цикле либо тут же в CDC_Receive_FS) вызвать USBD_CDC_ReceivePacket(hUsbDevice_0)

Сообщение отредактировал den_po - Jul 30 2014, 20:41
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jul 31 2014, 06:17
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(den_po @ Jul 31 2014, 00:37) *
Если кому ещё интересно, то вот:
Внутри CDC_Transmit_FS нужно самостоятельно выполнить нужные действия. Например, скопировать или дописать содержимое Buf в UserTxBufferFS.
Внутри CDC_Receive_FS нужно обработать пришедшие по USB данные. Чтобы следующий пакет успешно принялся, нужно после обработки данных (в главном цикле либо тут же в CDC_Receive_FS) вызвать USBD_CDC_ReceivePacket(hUsbDevice_0)

очень интересно!
с передачей более менее понятно, а вот с приемом данных не совсем. где у Вас вызывается CDC_Receive_FS? у меня в проекте, например, эта функция вызывается один раз - при инициализации, в функии MX_USB_DEVICE_Init.
Go to the top of the page
 
+Quote Post
den_po
сообщение Jul 31 2014, 07:33
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 31 2014, 07:36
Сообщение #25


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



У меня внутри бесконечного цикла работает такой код. User - это кнопка. По нажатию кнопки принимается последовательность символов, и выдается обратно.
Код
    User_old = User;
    User = GPIOA->IDR & 0x0001;
    if (!User_old && User) {
      USBD_CDC_SetRxBuffer(&hUsbDeviceFS, Buf_Ch);
      USBD_CDC_ReceivePacket(&hUsbDeviceFS);
      USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf_Ch, 8);
      USBD_CDC_TransmitPacket(&hUsbDeviceFS);
      do {
        User_old = User;
    User = GPIOA->IDR & 0x0001;
      } while (!User_old && !User);
    }

Это - чисто экспериментальный проект, попытка разобраться с USB в STM32. Но как-то слишком накручено в этом Cube, уж не с целью ли запутать простое.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jul 31 2014, 07:49
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(den_po @ Jul 31 2014, 11:33) *
Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket.

так я и спрашиваю, где она у Вас вызывается? весь путь по которому CDC_Transmit_FS вызывается, он ведь должен вести в конце концов к OTG_HS_IRQHandler? там обрабатывается флаг прихода данных, вызывается куча функций и в конце концов CDC_Transmit_FS, так ведь должно быть? у меня CDC_Transmit_FS из OTG_FS_IRQHandler не вызывается.
Go to the top of the page
 
+Quote Post
den_po
сообщение Jul 31 2014, 08:08
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(Atlantis- @ Jul 31 2014, 11:49) *
так я и спрашиваю, где она у Вас вызывается? весь путь по которому CDC_Transmit_FS вызывается, он ведь должен вести в конце концов к OTG_HS_IRQHandler? там обрабатывается флаг прихода данных, вызывается куча функций и в конце концов CDC_Transmit_FS, так ведь должно быть? у меня CDC_Transmit_FS из OTG_FS_IRQHandler не вызывается.

Давайте для начала определимся, CDC_Transmit_FS или CDC_Receive_FS.
CDC_Transmit_FS вызывается по желанию. Я пробовал и из главного цикла, и из CDC_Receive_FS.
CDC_Receive_FS в моём случае (stm32f072) вызывается по такой цепочке:
USB_IRQHandler -> HAL_PCD_IRQHandler -> PCD_EP_ISR_Handler -> HAL_PCD_DataOutStageCallback -> USBD_LL_DataOutStage -> USBD_CDC_DataOut -> CDC_Receive_FS.
Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c)
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jul 31 2014, 08:29
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(den_po @ Jul 31 2014, 12:08) *
Давайте для начала определимся, CDC_Transmit_FS или CDC_Receive_FS.
CDC_Transmit_FS вызывается по желанию. Я пробовал и из главного цикла, и из CDC_Receive_FS.
CDC_Receive_FS в моём случае (stm32f072) вызывается по такой цепочке:
USB_IRQHandler -> HAL_PCD_IRQHandler -> PCD_EP_ISR_Handler -> HAL_PCD_DataOutStageCallback -> USBD_LL_DataOutStage -> USBD_CDC_DataOut -> CDC_Receive_FS.
Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c)

извините перепутал, CDC_Receive_FS конечно. у меня проект для STM32F429ZI (точнее для платы Discovery с ним), так вот там CDC_Receive_FS вызывается только при инициализации, а в прерывании - нет. теперь, зная Вашу цепочку, я наверное смогу прописать вызов CDC_Receive_FS куда надо))

Цитата(den_po @ Jul 31 2014, 12:08) *
Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c)

что за табличка кстати?
Go to the top of the page
 
+Quote Post
den_po
сообщение Jul 31 2014, 10:05
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



Цитата(Atlantis- @ Jul 31 2014, 12:29) *
извините перепутал, CDC_Receive_FS конечно. у меня проект для STM32F429ZI (точнее для платы Discovery с ним), так вот там CDC_Receive_FS вызывается только при инициализации, а в прерывании - нет. теперь, зная Вашу цепочку, я наверное смогу прописать вызов CDC_Receive_FS куда надо))

А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются?
Я писал уже, после вызова CDC_Receive_FS нужно вызывать USBD_CDC_ReceivePacket, иначе следующий пакет не примется. Точно дело не в этом?

Цитата(Atlantis- @ Jul 31 2014, 12:29) *
что за табличка кстати?

Код
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,  
  CDC_Receive_FS
};
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Jul 31 2014, 10:42
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(den_po @ Jul 31 2014, 14:05) *
А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются?

хм, может, ну и что. данные посылаю из фирменной тестовой программы

Цитата(den_po @ Jul 31 2014, 14:05) *
Я писал уже, после вызова CDC_Receive_FS нужно вызывать USBD_CDC_ReceivePacket, иначе следующий пакет не примется. Точно дело не в этом?

я прикрутил прием данных в USBD_LL_DataOutStage, после отправки второго пакета тестовая программа виснет, видимо нет подтверждения или еще чего. причем USBD_CDC_ReceivePacket меня не спас. ой, сейчас поробовал - уже не виснет=)))
можете показать содержимое функции USBD_LL_DataOutStage, а то у меня там никакой
USBD_CDC_DataOut нет, она фигурирует только в структуре
Код
/* CDC interface class callbacks structure */
USBD_ClassTypeDef  USBD_CDC =
{
  USBD_CDC_Init,
  USBD_CDC_DeInit,
  USBD_CDC_Setup,
  NULL,                 /* EP0_TxSent, */
  USBD_CDC_EP0_RxReady,
  USBD_CDC_DataIn,
  USBD_CDC_DataOut,
  NULL,
  NULL,
  NULL,    
  USBD_CDC_GetHSCfgDesc,  
  USBD_CDC_GetFSCfgDesc,    
  USBD_CDC_GetOtherSpeedCfgDesc,
  USBD_CDC_GetDeviceQualifierDescriptor,
};

причем USBD_CDC опять нигде не фигурирует, только в
Код
#define USBD_CDC_CLASS    &USBD_CDC
, а USBD_CDC_CLASS нигде больше нет

Цитата(den_po @ Jul 31 2014, 14:05) *
Код
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
  CDC_Init_FS,
  CDC_DeInit_FS,
  CDC_Control_FS,  
  CDC_Receive_FS
};

такая табличка у меня есть

Сообщение отредактировал Atlantis- - Jul 31 2014, 11:32
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01483 секунд с 7
ELECTRONIX ©2004-2016