STM32 STM32CubeF4 USB CDC работа

Я собрал код из STM32CubeF4 для примера USB CDC. Я добавил недостающий код приема для CDC_Receive_FS () в usbd_cdc_if.c. Я загрузил это в свой STM32F4 Discovery, и он работает. Символ, набранный на Tera Term, возвращается и отображается на Tera Term.

Я надеюсь, что кто-то здесь может дать мне некоторые знания о том, как работает эта прошивка USB CDC, в частности, это вызвано прерыванием, которое генерируется при изменении уровня напряжения на выводах USB -D и + D, или есть бесконечный цикл while, который был запущен где-то, и он просто опрашивает, ожидая появления каких-то данных? Что вызвало у меня вопрос, так это то, что я вижу, что можно мигать светодиодами на этой плате, переключая состояние контактов GPIO в бесконечном цикле while в main.c. Однако в main.c для USB в этом цикле while вообще нет ничего. Итак, как эта прошивка USB CDC получает и отправляет символ из / в Tera Term.


person Richard    schedule 13.05.2015    source источник


Ответы (2)


Я найду 2 минуты, чтобы ответить вам, вместо того, чтобы читать вам лекцию. Прием осуществляется через прерывания. Очень и очень просто аппаратное обеспечение видит изменение напряжения на D + / D- и отмечает прерывание на основе функций инициализации. Прерывание вызывает HAL_PCD_IRQHandler, который вызывает USBD_LL_DataInStage в файле usbd_conf.c. Это заканчивается вызовом функции USBD_CDC_DataIn в файле usbd_cdc.c. Это ваша отправная точка, но она не проста. Чтобы сделать то, что вы хотите, вам, возможно, придется остановить вывод на UART и просто обработать его в основном цикле.

person Rick    schedule 15.05.2015
comment
Замечательно, и большое вам спасибо, это именно та отправная точка, которую я искал. Учитывая сложность USB, я не смог этого ни увидеть, ни найти. FWIW, RS-232 - это то, на чем я вырос. - person Richard; 16.05.2015
comment
Это, конечно, не так просто, как изменение напряжения на линиях. Для этого задействован целый стек последовательной передачи. Однако вы получаете то, о чем просите, и некоторые люди могут предпочесть простые ответы для сложных систем. Рекомендовать прочитать документацию и поработать с программным стеком - это, конечно, не обучение, но в целом хороший ответ. А для сложной системы даже больше. - person too honest for this site; 17.05.2015

Этот вопрос является общим для этого форума, а не актуальным для конкретной проблемы. Однако, как некоторые подсказки, вы можете

  • Прочтите спецификации USB, по крайней мере, некоторый базовый обзор (просто начните с википедии). USB не работает при включении GPIO в программном обеспечении (см. Следующий пункт)
  • Прочтите справочное руководство STM32F4xx. Это довольно исчерпывающе.
  • Прочтите исходный код демонстрации. Это должно ответить на все вопросы.
  • Чтобы отслеживать пути выполнения, вы должны помнить, что C всегда начинается с функции main (), так что это хорошее начало, чтобы увидеть, что происходит. (отказ от ответственности: я хорошо знаю, все начинается с запуска, но это может еще больше запутать новичка).

Если вы хотите работать с USB, вам все равно придется это делать, так что вы можете начать с него прямо сейчас. Да, это займет некоторое время; неудивительно, что инженеры изучали все это в течение многих лет, прежде чем приступить к более крупным проектам.

Вся информация доступна легально и бесплатно в сети.

И да, USB, скорее всего, управляется прерываниями и может также использовать DMA для передачи данных.

person too honest for this site    schedule 14.05.2015
comment
Я просто хотел, чтобы кто-то ткнул пальцем в конкретный фрагмент кода, с которого он запускается. В main.c я вижу MX_USB_DEVICE_Init, и я следую за ним, и я вижу, USBD_Start, и я следую за ним, и я вижу, USBD_LL_Start, и я следую за ним, и я вижу, HAL_PCD_Start, и я следую за ним, и вижу, USB_DevConnect. Этот последний комментарий заключается в том, что он запускает устройство USB OTG. - person Richard; 15.05.2015