cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H7 nucleo USB FS CDC

embvis
Associate III
Posted on November 09, 2017 at 10:37

Hi,

I am trying to start with USB CDC on stm32h7. I create new project with CubeMx + STM32Cube_FW_H7_V1.1.0 (cubemx file attached). After compile usb device doesnt appear on the system.

Regards

Mike

#stm32h743 #virtual-comport-stm32 #cdc #stm32h7 #usb-device #usb-fs-cdc
19 REPLIES 19
Posted on May 08, 2018 at 16:37

Hi Marina,

I dont use the Nucleo board. I have designed a custom board using the STM32H743II. I am using PB13,PB14,PB15 for USB host connectivity and PF2,PF3 for USB_HOST_PWRON and USB_HOST_OVERCURR using a STMPS2141 to provide power to the host connector. The Cube MX driver does not handle the power switching and overcurrent handling you have to implement this by yourself.

I hope this is useful.

Best regards

Dirk

Posted on May 08, 2018 at 16:45

Yep, it does!

esukh
Associate III

HI, I have similar issue, but

HAL_PWREx_EnableUSBVoltageDetector() doesn't do the trick for me, my bet is incorrect codebase generated by stm32cubeMX 4.26 + FW 1.3

Is there anyone who deal with that problem?

Actually usb33den bit doesn't set after function call, in debugger at least.

JSmit.15
Associate

I am using PB13,PB14,PB15 for USB host connectivity and PF2,PF3 for USB_HOST_PWRON and USB_HOST_OVERCURR using a STMPS2141 to provide power to the host connector. 

https://www.brotherprintersupportnumber.com/brother-printer-setup/

Papayaved
Associate II

I have same problem with NUCLEO STM32H743ZI Virtual Com Port - I can not open port on PC

I have Nucleo STM32H743ZI board. I'm using CubeMX HAL (I tried several versions) and TrueStudio. "Virtual COM port" appearances in Windows 10 (I tried default Windows driver and ST driver) but I can not open port. My C# program write me "The parameter is incorrect" when I try open it:

SerialPort port = new SerialPort("COM8", 9600, Parity.None, 8, StopBits.One);
port.Open(); // System.IO.IOException: 'The parameter is incorrect.'

same message writes me program Realterm, PuTTY do nothing and "Tera Term" program works correct - I can send and receive data to my MCU program.

May anyone know what is it?

In my C# program and in terminal programs I use same parameters

STM32H743ZI USB FullSpeed Virtual Com Port: 'Com port parameter is incorrect'

For data exchange with MCU on Windows 10 I use C function: fopen("COM6", "r+"), fwrite, fgetc, fclose, - without COM port parameters and it's work. But if I use C++ Qt or C# libraries, when I try to open the COM port I catch exception 'The parameter is incorrect'. Same exception I catch in PuTTY and RealTerm programs. I tried setting various parameters. I think USB device cannot accept COM port parameters from PC. I used Nucleo and my board with same result.

I use CubeMX 5.2.1 and FW 1.4.0. If I use CubeMX 4.27.0 and FW 1.3.2 PC is not found USB device.

Also USB description has error in field bDeviceSubClass in FW 1.4.0 and FW 1.3.2.

Microsoft UsbView program:

     ===>Device Descriptor<===

bLength:             0x12

bDescriptorType:         0x01

bcdUSB:             0x0200

bDeviceClass:           0x02 -> This is a Communication Device

bDeviceSubClass:         0x02

*!*ERROR: bDeviceSubClass of 2 is invalid

bDeviceProtocol:         0x00

bMaxPacketSize0:         0x40 = (64) Bytes

idVendor:            0x0483 = STMicroelectronics

idProduct:           0x5740

bcdDevice:           0x0200

iManufacturer:          0x01

   English (United States) "STMicroelectronics"

iProduct:             0x02

   English (United States) "STM32 Virtual ComPort"

iSerialNumber:          0x03

   English (United States) "383A34463137"

bNumConfigurations:        0x01

 ---===>Open Pipes<===---

 ===>Endpoint Descriptor<===

bLength:              0x07

bDescriptorType:          0x05

bEndpointAddress:         0x82 -> Direction: IN - EndpointID: 2

bmAttributes:           0x03 -> Interrupt Transfer Type

wMaxPacketSize:         0x0008 = 0x08 bytes

bInterval:             0x10

 ===>Endpoint Descriptor<===

bLength:              0x07

bDescriptorType:          0x05

bEndpointAddress:         0x01 -> Direction: OUT - EndpointID: 1

bmAttributes:           0x02 -> Bulk Transfer Type

wMaxPacketSize:         0x0040 = 0x40 bytes

bInterval:             0x00

 ===>Endpoint Descriptor<===

bLength:              0x07

bDescriptorType:          0x05

bEndpointAddress:         0x81 -> Direction: IN - EndpointID: 1

bmAttributes:           0x02 -> Bulk Transfer Type

wMaxPacketSize:         0x0040 = 0x40 bytes

bInterval:             0x00

  ---===>Full Configuration Descriptor<===---

 ===>Configuration Descriptor<===

bLength:              0x09

bDescriptorType:          0x02

wTotalLength:          0x0043 -> Validated

bNumInterfaces:          0x02

bConfigurationValue:        0x01

iConfiguration:          0x00

bmAttributes:           0xC0 -> Self Powered

MaxPower:             0x32 = 100 mA

 ===>Interface Descriptor<===

bLength:              0x09

bDescriptorType:          0x04

bInterfaceNumber:         0x00

bAlternateSetting:         0x00

bNumEndpoints:           0x01

bInterfaceClass:          0x02 -> This is Communications (CDC Control) USB Device Interface Class

bInterfaceSubClass:        0x02

bInterfaceProtocol:        0x01

iInterface:            0x00

 -> This is a Communications (CDC Control) USB Device Interface Class

 ===>Descriptor Hex Dump<===

bLength:              0x05

bDescriptorType:          0x24

05 24 00 10 01 

 -> This is a Communications (CDC Control) USB Device Interface Class

 ===>Descriptor Hex Dump<===

bLength:              0x05

bDescriptorType:          0x24

05 24 01 00 01 

 -> This is a Communications (CDC Control) USB Device Interface Class

 ===>Descriptor Hex Dump<===

bLength:              0x04

bDescriptorType:          0x24

04 24 02 02 

 -> This is a Communications (CDC Control) USB Device Interface Class

 ===>Descriptor Hex Dump<===

bLength:              0x05

bDescriptorType:          0x24

05 24 06 00 01 

 ===>Endpoint Descriptor<===

bLength:              0x07

bDescriptorType:          0x05

bEndpointAddress:         0x82 -> Direction: IN - EndpointID: 2

bmAttributes:           0x03 -> Interrupt Transfer Type

wMaxPacketSize:         0x0008 = 0x08 bytes

bInterval:             0x10

 ===>Interface Descriptor<===

bLength:              0x09

bDescriptorType:          0x04

bInterfaceNumber:         0x01

bAlternateSetting:         0x00

bNumEndpoints:           0x02

bInterfaceClass:          0x0A -> This is a CDC Data USB Device Interface Class

bInterfaceSubClass:        0x00

bInterfaceProtocol:        0x00

iInterface:            0x00

 ===>Endpoint Descriptor<===

bLength:              0x07

bDescriptorType:          0x05

bEndpointAddress:         0x01 -> Direction: OUT - EndpointID: 1

bmAttributes:           0x02 -> Bulk Transfer Type

wMaxPacketSize:         0x0040 = 0x40 bytes

bInterval:             0x00

 ===>Endpoint Descriptor<===

bLength:              0x07

bDescriptorType:          0x05

bEndpointAddress:         0x81 -> Direction: IN - EndpointID: 1

bmAttributes:           0x02 -> Bulk Transfer Type

wMaxPacketSize:         0x0040 = 0x40 bytes

bInterval:             0x00

I have the same problem, did you find a solution?

Thanks

Yes, I was answered this question on stackoverflow. You must edit function in file USB_DEVICE\App\usbd_cdc_if.c

Connection parameters are not stored in STM.

/**

 * @brief Manage the CDC class requests

 * @param cmd: Command code

 * @param pbuf: Buffer containing command data (request parameters)

 * @param length: Number of data to be sent (in bytes)

 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL

 */

static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length)

{

 /* USER CODE BEGIN 5 */

 /*******************************************************************************/

 /* Line Coding Structure                            */

 /*-----------------------------------------------------------------------------*/

 /* Offset | Field    | Size | Value | Description             */

 /* 0   | dwDTERate  |  4 | Number |Data terminal rate, in bits per second*/

 /* 4   | bCharFormat |  1 | Number | Stop bits              */

 /*                    0 - 1 Stop bit            */

 /*                    1 - 1.5 Stop bits          */

 /*                    2 - 2 Stop bits           */

 /* 5   | bParityType | 1  | Number | Parity                */

 /*                    0 - None               */

 /*                    1 - Odd               */

 /*                    2 - Even               */

 /*                    3 - Mark               */

 /*                    4 - Space              */

 /* 6   | bDataBits |  1  | Number Data bits (5, 6, 7, 8 or 16).     */

 /*******************************************************************************/

static uint8_t lineCoding[7] // 115200bps, 1stop, no parity, 8bit

 = { 0x00, 0xC2, 0x01, 0x00, 0x00, 0x00, 0x08 };

 switch(cmd)

 {

  case CDC_SEND_ENCAPSULATED_COMMAND:

  break;

  case CDC_GET_ENCAPSULATED_RESPONSE:

  break;

  case CDC_SET_COMM_FEATURE:

  break;

  case CDC_GET_COMM_FEATURE:

  break;

  case CDC_CLEAR_COMM_FEATURE:

  break;

  case CDC_SET_LINE_CODING:

   memcpy(lineCoding, pbuf, sizeof(lineCoding));

  break;

  case CDC_GET_LINE_CODING:

   memcpy(pbuf, lineCoding, sizeof(lineCoding));

  break;

  case CDC_SET_CONTROL_LINE_STATE:

  break;

  case CDC_SEND_BREAK:

  break;

 default:

  break;

 }

 return (USBD_OK);

 /* USER CODE END 5 */

}

Yess! now works!

I had already found a solution using a NuGet Packages: SerialPortStream

But your is a better solution

Thank you