Skip to main content
Lagodolio
Associate III
January 5, 2021
Question

USB on H7: unable to open the port

  • January 5, 2021
  • 2 replies
  • 844 views

Hello!

I'm migrating from STM32F7 to H7 MCU, but I incurred a strange problem (well, two strange problems...).

I have a QT program that opens COM ports by:

void Sensor_interface::open_port()
{
 if (Device_Sensor_Port.isEmpty())
 {
 qDebug()<<"No Sensor port present-"<<Device_Sensor_Port;
 }
 else
 {
 qDebug()<<"DEVICE Port" << Device_Sensor_Port; // It prints "COM3"
 sensor_used_port.setPortName(Device_Sensor_Port);
 sensor_used_port.setBaudRate(BAUDRATE_SENSOR); 
 sensor_used_port.setDataBits (QSerialPort::Data8);
 sensor_used_port.setParity(QSerialPort::NoParity);
 sensor_used_port.setStopBits (QSerialPort::OneStop);
 sensor_used_port.setFlowControl (QSerialPort::NoFlowControl);
 sensor_used_port.open (QIODevice::ReadOnly);
 sensor_used_port.setDataTerminalReady(true);
 }
}
 

and this function is OK with my F7.

On H7, instead, the COM port is correctly recognized (as COM3) but the open command fails:

bool QSerialPort::setDataTerminalReady(bool): device not open

If I open that port with another program, (i.e. ARDUINO terminal) all works great and I can see STM32H7 messages.

The second strange thing is that USB works only with the SWD debugger connected.

I use an STM32F446RE as an SWD debugger/programmer (it is on COM4). If I remove the USB connected to STM32F446RE, the system stop sending messages.

My H7 is externally supplied.

I can send the code if it is useful...

Thanks,

Mario

This topic has been closed for replies.

2 replies

Lagodolio
LagodolioAuthor
Associate III
January 6, 2021

This is the freertos.c file:

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * File Name : freertos.c
 * Description : Code for freertos applications
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
 * All rights reserved.</center></h2>
 *
 * This software component is licensed by ST under Ultimate Liberty license
 * SLA0044, the "License"; You may not use this file except in compliance with
 * the License. You may obtain a copy of the License at:
 * www.st.com/SLA0044
 *
 ******************************************************************************
 */
/* USER CODE END Header */
 
/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
 
/* USER CODE BEGIN Variables */
 
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
 .name = "defaultTask",
 .priority = (osPriority_t) osPriorityNormal,
 .stack_size = 1920 * 4
};
/* Definitions for USB_DOUT */
osThreadId_t USB_DOUTHandle;
const osThreadAttr_t USB_DOUT_attributes = {
 .name = "USB_DOUT",
 .priority = (osPriority_t) osPriorityNormal1,
 .stack_size = 128 * 4
};
 
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
 
/* USER CODE END FunctionPrototypes */
 
void StartDefaultTask(void *argument);
void USB_Data_Out(void *argument);
 
extern void MX_USB_DEVICE_Init(void);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
 
/**
 * @brief FreeRTOS initialization
 * @param None
 * @retval None
 */
void MX_FREERTOS_Init(void) {
 
 /* Create the thread(s) */
 /* creation of defaultTask */
 defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
 
 /* creation of USB_DOUT */
 USB_DOUTHandle = osThreadNew(USB_Data_Out, NULL, &USB_DOUT_attributes);
 
}
 
/* USER CODE BEGIN Header_StartDefaultTask */
/**
 * @brief Function implementing the defaultTask thread.
 * @param argument: Not used
 * @retval None
 */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
 /* init code for USB_DEVICE */
 MX_USB_DEVICE_Init();
 /* USER CODE BEGIN StartDefaultTask */
 /* Infinite loop */
 for(;;)
 {
 osDelay(1);
 }
 /* USER CODE END StartDefaultTask */
}
 
/* USER CODE BEGIN Header_USB_Data_Out */
/**
* @brief Function implementing the USB_DOUT thread.
* @param argument: Not used
* @retval None
*/
 
/* USER CODE END Header_USB_Data_Out */
void USB_Data_Out(void *argument)
{
 /* USER CODE BEGIN USB_Data_Out */
	MX_USB_DEVICE_Init();
 /* Infinite loop */
	uint8_t UserTxBuffer[] = "Hello World!!\n";
 
		for(;;)
	 {
		 CDC_Transmit_FS(UserTxBuffer, sizeof(UserTxBuffer)-1);
 
 
	 osDelay(1);
	 }
 /* USER CODE END USB_Data_Out */
}
 
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
 
/* USER CODE END Application */
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Lagodolio
LagodolioAuthor
Associate III
January 6, 2021

The USB CDC is implemented in usbd_cdc_if.c:

/* USER CODE BEGIN Header */
/**
 ******************************************************************************
 * @file : usbd_cdc_if.c
 * @version : v1.0_Cube
 * @brief : Usb device for Virtual Com Port.
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
 * All rights reserved.</center></h2>
 *
 * This software component is licensed by ST under Ultimate Liberty license
 * SLA0044, the "License"; You may not use this file except in compliance with
 * the License. You may obtain a copy of the License at:
 * www.st.com/SLA0044
 *
 ******************************************************************************
 */
/* USER CODE END Header */
 
/* Includes ------------------------------------------------------------------*/
#include "usbd_cdc_if.h"
 
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
/** Data to send over USB CDC are stored in this buffer */
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
 
/* USER CODE BEGIN PRIVATE_VARIABLES */
 
/* USER CODE END PRIVATE_VARIABLES */
 
/**
 * @}
 */
 
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
 * @brief Public variables.
 * @{
 */
 
extern USBD_HandleTypeDef hUsbDeviceFS;
 
/* USER CODE BEGIN EXPORTED_VARIABLES */
 
/* USER CODE END EXPORTED_VARIABLES */
 
/**
 * @}
 */
 
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
 * @brief Private functions declaration.
 * @{
 */
 
static int8_t CDC_Init_FS(void);
static int8_t CDC_DeInit_FS(void);
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
 
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
 
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
 
/**
 * @}
 */
 
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
{
 CDC_Init_FS,
 CDC_DeInit_FS,
 CDC_Control_FS,
 CDC_Receive_FS,
 CDC_TransmitCplt_FS
};
 
/* Private functions ---------------------------------------------------------*/
/**
 * @brief Initializes the CDC media low layer over the FS USB IP
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
static int8_t CDC_Init_FS(void)
{
 /* USER CODE BEGIN 3 */
 /* Set Application Buffers */
 USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
 USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
 return (USBD_OK);
 /* USER CODE END 3 */
}
 
/**
 * @brief DeInitializes the CDC media low layer
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 */
static int8_t CDC_DeInit_FS(void)
{
 /* USER CODE BEGIN 4 */
 return (USBD_OK);
 /* USER CODE END 4 */
}
 
/**
 * @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 */
 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;
 
 /*******************************************************************************/
 /* 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). */
 /*******************************************************************************/
 case CDC_SET_LINE_CODING:
 
 break;
 
 case CDC_GET_LINE_CODING:
 
 break;
 
 case CDC_SET_CONTROL_LINE_STATE:
 
 break;
 
 case CDC_SEND_BREAK:
 
 break;
 
 default:
 break;
 }
 
 return (USBD_OK);
 /* USER CODE END 5 */
}
 
/**
 * @brief Data received over USB OUT endpoint are sent over CDC interface
 * through this function.
 *
 * @note
 * This function will issue a NAK packet on any OUT packet received on
 * USB endpoint until exiting this function. If you exit this function
 * before transfer is complete on CDC interface (ie. using DMA controller)
 * it will result in receiving more data while previous ones are still
 * not sent.
 *
 * @param Buf: Buffer of data to be received
 * @param Len: Number of data received (in bytes)
 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 */
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
 /* USER CODE BEGIN 6 */
 USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
 USBD_CDC_ReceivePacket(&hUsbDeviceFS);
 return (USBD_OK);
 /* USER CODE END 6 */
}
 
/**
 * @brief CDC_Transmit_FS
 * Data to send over USB IN endpoint are sent over CDC interface
 * through this function.
 * @note
 *
 *
 * @param Buf: Buffer of data to be sent
 * @param Len: Number of data to be sent (in bytes)
 * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
 */
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
 uint8_t result = USBD_OK;
 /* USER CODE BEGIN 7 */
 USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
 if (hcdc->TxState != 0){
 return USBD_BUSY;
 }
 USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
 result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
 /* USER CODE END 7 */
 return result;
}
 
/**
 * @brief CDC_TransmitCplt_FS
 * Data transmited callback
 *
 * @note
 * This function is IN transfer complete callback used to inform user that
 * the submitted Data is successfully sent over USB.
 *
 * @param Buf: Buffer of data to be received
 * @param Len: Number of data received (in bytes)
 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 */
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
{
 uint8_t result = USBD_OK;
 /* USER CODE BEGIN 13 */
 UNUSED(Buf);
 UNUSED(Len);
 UNUSED(epnum);
 /* USER CODE END 13 */
 return result;
}
 
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
 
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
 
/**
 * @}
 */
 
/**
 * @}
 */
 
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/