- Create the «Ethernet-over-USB» Project
- Source Files
- Using the «Ethernet-over-USB» Project
- Hardware Setup
- Troubleshooting
- Stm32 usb cdc linux
- Stm32 usb cdc linux
- mcu.by
- Услуги разработки встраиваемого ПО и контрактная разработка электроники на ShuraCore
- Старт ARM. Поднимаем USB CDC.
- 6 thoughts on “ Старт ARM. Поднимаем USB CDC. ”
Create the «Ethernet-over-USB» Project
In this example, we are using the MCBSTM32F400 board with the STM32F407IGHx device. Create a new project in MDK (Select Device STMicroelectronics:STM32F4 Series: STM32F407:STM32F407IG:STM32F407IGHx). In the Manage Run-Time Environment window, select the following components:
- CMSIS:Core
- CMSIS:RTOS2 (API):Keil RTX5
- CMSIS Driver:Ethernet MAC (API):Ethernet MAC
- CMSIS Driver:Ethernet PHY (API):KSZ8081RNA
- CMSIS Driver:USB Device (API):High-speed
- Device:STM32Cube Framework (API):Classic
- USB:Device: 1
- USB:Device:CDC:1
Click the Resolve button and then OK.
Before continuing to add the required source code, you need to add a template file called USBD_User_CDC_NCM_ETH_0.c:
- Right-click on Source Group 1 and select Add New Item to Group ‘Source Group 1’. .
- Click on User Code Template and select the USB Device CDC NCM Ethernet Bridge template.
- Click Add to copy the file USBD_User_CDC_NCM_ETH_0.c to the project.
Your Project should look like this:
Source Files
- Click on New (Ctrl + N) to create a new file.
- Save it (File -> Save) as main.h.
- Copy the following code into the main.h file and save it again:
- Right-click on Source Group 1 and select Add New Item to Group ‘Source Group 1’. .
- Click on C File (.c) and enter main in the Name box.
- Copy the following code into the main.c file:
- Right-click on Source Group 1 and select Add New Item to Group ‘Source Group 1’. .
- Click on C File (.c) and enter app_main in the Name box.
- Copy the following code into the app_main.c file:
Before building the project, you need to edit these configuration files (in Configuration Wizard view):
- Under Device, double-click RTE_Device.h and:
- enable ETH (Ethernet Interface) [Driver_ETH_MAC0] and:
- disable ENET:MII (Media Independent Interface)
- enable ENET:RMII (Reduced Media Independent Interface) and:
- set ETH_RMII_TXD0 Pin to PG13
- set ETH_RMII_TXD1 Pin to PG14
- set ETH_RMII_TX_EN Pin to PG11
- enable USB OTG High-speed and under it:
- enable Device [Driver_USBD1]
- enable ETH (Ethernet Interface) [Driver_ETH_MAC0] and:
- Under USB, double-click USBD_Config_0.c and under USB Device 0 change:
- set Connect to hardware via Driver_USBD# to 1
- enable High-speed
- under Device Settings change:
- set Max Endpoint 0 Packet Size to 64
- set Product ID to 0x3518
- Under USB, double-click USBD_Config_CDC_0.h and under USB Device: Communication Device Class (CDC) 0 change:
- set Communication Class Subclass to Network Control Model (NCM)
Before building and downloading the project to the target, make sure that the correct debugger is set in the Options for Target dialog (ALT + F7). You may then build and download the example project to the evaluation board using the ВµVision commands:
After these steps, the project should start executing on your evaluation kit. In case of errors, refer to the Evaluation Board User’s Guide for configuration information.
Using the «Ethernet-over-USB» Project
Hardware Setup
- Verify all jumper settings on the target hardware.
- Connect the development board to a host Linux PC (native or in a virtual machine) attaching a Micro-USB cable to the USBHS port and using an Ethernet cable to the ETH connector.
- Using a virtual machine, you need to connect to the VM:
- Within the Linux system (here Ubuntu), you should be able to see a wired Ethernet connection (with the MAC address 1E:30:6C:A2:45:5E):
Troubleshooting
Especially when working with virtual machines, the USB connection is not passed onto the guest system properly. Then it can help to restart the guest. Also, to make Ubuntu use the network adapter that you like, do the following: In Ubuntu’s search, enter «network». The Network Connections program will be available in the search results:
Double-click to open and then mark the Wired connection 1 and click Edit:
Select the MAC address of your Ethernet-over-USB device and press Save and Close:
This should instruct Ubuntu to use your device for the network connection. Also, try to disconnect any other network adapter from the virtual machine.
Источник
Stm32 usb cdc linux
Попробуем разобраться с реализацией USB на STM32L. Библиотека от ST просто ужасна. Нет, она прекрасно работает, но на ее примере разобраться с USB навряд ли получится. Она написана очень сложно. А вот на примере от keil (у них есть свой пример для USB) разобраться можно. Вот на таком немного переработанном примере я и постараюсь объяснить (хотя бы для самого себя) как можно реализовать USB на микроконтроллере.
В примере реализуется CDC устройство.
USB на ПК определяет подключение к шине какого-то типа устройства по появлению подтяжки на DM или DP.
- pull-up на D- на стороне девайса — девайс говорит, что он Low-speed;
- pull-up на D+ на стороне девайса — девайс говорит, что он Full-speed или High-speed (уточняется в дальнейшем диалоге с хостом);
- оба пина без подтяжек на стороне девайса — он отключен от шины, и хост с ним не работает;
Для подключения резистора к DP нам понадобится модуль SYSCFG и регистр PMC(кроме того, в библиотеки периферии от ST в файле stm32l1xx_syscfg.c есть функция SYSCFG_USBPuCmd, которая поможет вам записать в этот регистр нужные значение — вкл/выкл подтяжку. Я ей буду пользоваться, поэтому ее надо подключить к проекту).
Инициализацию USB, для нашего микроконтроллера, разделим на 3 части.
- Настройка частоты тактирования микроконтроллера и вкл. тактирования модулей периферии;
- Настройка прерываний от USB;
- Инициализация самого USB модуля (настраиваем через соответствующие регистры);
В самом начале надо настроить тактирование самого микроконтроллера — для этого я обычно изменяю сам файл system_stm32l1xx.c (из стандартного проекта keil дляSTM32). А точнее, функцию SetSysClock. Для USB нам необходимо, чтобы после PLLMUL была частота 96 МГц.
Если используем HSI 16 МГц, то надо выбрать коэффициент умножения 6. А после, для того, что-бы тактировать микроконтроллер от PLL выбрать, коэффициент деления 3. Тогда на выходе PLL, частота будет 32 МГц. При такой частоте, не забываем настроить пропуск такта при чтении FLASH (она может работать максимум на частоте 24 МГц, и если пропуск не настроить программа будет просто виснуть).
Теперь включаем тактирование USB периферии и SYSCFG (для включения подтягивающего резистора — см. выше).
Теперь переходим к настройке прерываний. В нашей программе мы будем использовать только вектор прерывания USB_LP_IRQHandler.
Он был использован в примере, и если честно, с другими векторами USB прерываний я не работал и не знаю как работать. В Reference Manual про них написано:
- USB low-priority interrupt (USB_LP_IRQHandler) — страбатывает на всех USBсобытиях (корректная передача, USB reset и т.д.)
- USB high-priority interrupt (USB_HP_IRQHandler) — срабатывает только на событии корректной передачи для isochronous and double-buffer bulk и используется для достижения наибольшей возможной скорости обмена.
- USB wakeup interrupt (USB_FS_WKUP_IRQHandler) — срабатывает по просыпанию из Suspend mode.
Теперь перейдем к самой последовательности инициализации USB периферии. Объяснение действий — см. комментарии в коде. Все регистры для USB и значения, которые в них пишутся задефайнены в файле usb.h, можете посмотреть его скачав проект по ссылке ниже.
Дальнейшая настройка будет происходить в прерывании USB_LP_IRQHandler.
При общении с той или иной конечной точкой, вызывается соответствующая функция — USB_EndPoint0, USB_EndPoint1, USB_EndPoint2, USB_EndPoint3.
Именно в нулевой конечной точки реализованы все стандартные запросы USB, запросы специфические для CDC устройства (вирт. COM-порта). При запросе к нулевой точки, отдается дескриптор устройства (который необходимо заранее прописать).
Вторая и третья конечная точка вызываются при приеме и передачи данных соответственно. Точнее на передачу конечная точка вызывается постоянно с какой-то периодичностью, просто, грубо говоря, передается ноль байт (можете посмотреть в отладчике — постоянное попадание в функцию USB_EndPoint3). А в конечную точку на прием попадаем, лишь когда пришли данные с ПК.
Первая конечная точка для CDC устройства используется для настроек параметров самого COM-порта (хотя не уверен, я уже забыл — разбирался давно).
Дескрипторы для CDC устройства, с комментариями:
Если руки дойдут, то может когда-нибудь постараюсь поподробнее расписать алгоритм работы с конечными точками. А сейчас, я уже и сам забыл, нужно освежать знания — читать книги Агурова про USB.
Проект — USB_CDC — для скачивания (проект сделан в keil, заархивирован 7Zip). Драйвер для ПК я брал от ST, его можно скачать или на сайте ST или скачать — stsw-stm32102.
Источник
Stm32 usb cdc linux
STM32F103 USB CDC CMSIS provires a simple low weight firmware for STM32F1 serie to implement Virtual Com Port. Current implementation create Virtual Com Port with next settings: 115200, 0, none, 8, but you can change these settings as you want.
- Add usblib.c and usblib.h to your project.
- Make sure you have configured USB to 48 MHz clock and RCC to 48 MHz or more (72 MHz is recomended).
- It’s strongly recomended to use 1,5K GPIO driven pull-up rezistor to have full controll of USB line initiate sequence.
- Call USBLIB_Init(); to enable USB and make initial configuration of USB registers. Please note — USBLIB_Init(); will trigget USB RESET sequence.
- Enable 1.5K pull-up resistor to allow host detect device connection.
- If your device connected to Windows host use RemoteSwitchHUB.inf to install a default Windows driver. After installation you will see new COM port named RemoteSwitch HUB (If you want to change this name you need to edit it in usblib.c and inf files).
- If your device connected to Unix systems then you will see a new device in /dev/ dir.
- Implement void uUSBLIB_LineStateHandler(USBLIB_WByte LineState) in your code to handle line state. See main.c for example. NOTE: you can’t send any data to host when port is closed! To controll when port is opened use this condition:
- Inplement void uUSBLIB_DataReceivedHandler(uint16_t *Data, uint16_t Length) in your code to accept data from host. See main.c f.e.
Code well tested on Windows7, MacOS 10.13 (High Sierra) and Raspbian OS.
Источник
mcu.by
Услуги разработки встраиваемого ПО и контрактная разработка электроники на ShuraCore
Старт ARM. Поднимаем USB CDC.
Всем привет! Сегодня будем поднимать USB CDC (VCP) на плате stm32f401c-disco.
USB communications device class (коммуникационный класс устройства) — является составным классом устройства Универсальной последовательной шины. Класс может включать один (или более) интерфейс, такой как интерфейс пользовательского элемента управления, интерфейс передачи данных, аудио или интерфейс запоминающего устройства.
VCP – Виртуальный COM-порт
Базовый класс 02h (Communications and CDC Control)
Этот базовый класс определен для устройств, которые относятся к классу устройств спецификации связи. Эта спецификация определяет используемый набор подкласса и Протокола значений. Значения за пределами определения спецификации защищены. Обратите внимание, что связи класса устройств спецификации требуется несколько значений Кода класса (три), которые будут использоваться в описания устройств, а некоторые, которые будут использоваться в интерфейсе дескрипторов.
Базовый класс 02h
Подкласс xxh
протокол xxh
смысл Communication device class
Базовый класс 0Ah (CDC-Data)
Этот базовый класс определен для устройств, которые относятся к классу устройств спецификации связи. Это спецификация определяет используемый набор подкласса и протокола значений. Значения за пределами определения спецификации защищены. Эти коды класса могут быть использованы только в интерфейсе дескрипторов.
Базовый класс 0Ah
Подкласс xxh
протокол xxh
смысл CDC data device
1. Находим строку HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); и меняем на HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
2. Находим строку #define CDC_DATA_HS_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ и меняем на #define CDC_DATA_HS_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */
3. Производим изменения в usbd_cdc_if.c
4. Теперь нужно добавить в usbd_cdc_if.h несколько строк кода
5. Устраняем баг для USBD_CDC_TransmitPacket()
6. И добавляем пример в main.c
И все готова!, подключаем микро USB к плате, второй вывод к host-у и у нас появляется виртуальный com порт.
6 thoughts on “ Старт ARM. Поднимаем USB CDC. ”
When i debbuged this code i found that for really big messages this doesn’t work right. There was some issue with size off offset. IT send multiple time the same think.
I corrected it with:
if (size > CDC_DATA_HS_OUT_PACKET_SIZE) <
int offset;
for (offset = 0; offset
with large data is not working, thanks
Ну и зачем столько путанного кода. Всё это легко организуется средствами генерируемого STM32Cube проекта. Достаточно добавить несколько строчек в функцию ( CDC_Receive_FS (uint8_t* UserRxBufferFS, uint32_t *Len)) . И это доходчиво описано здесь: http://habrahabr.ru/post/249395/
Создается впечатление, что вы пытаетесь запутать, выложив обилие непонятной информации и кода.
Точно, спасибо за инфу.
Есть одна проблема. Не передаются пакеты более 64 байт. Кто-нибудь решил ее?
Источник