11 votos

Error STM32 USB VCP

He estado trabajando en un proyecto para el pasado dos semanas y la depuración de este problema ha llevado hasta esta semana. Pregunto si alguien puede ayudar, voy a tratar de ser lo más explícito y claro como sea posible.

Estoy tratando de implementar un USB Virtual de Puerto de Comunicaciones en un Microcontrolador basado en el STM32F302K8 (Cortex M4). He utilizado STM32CubMX para generar el código necesario para crear un USB de Velocidad Completa Dispositivo de implementación de una clase CDC. Mi dispositivo se muestra en Windows (Administrador de Dispositivos) y Linux. Soy capaz de implementar un simple eco de la función que se basa en el código de ejemplo, pero cuando yo ahora pruebe a utilizar la función USBD_CDC_SetTxBuffer para enviar datos a la PC, esto pone en marcha un Duro Controlador de errores. Que se han reducido de esto por el hecho de que el UsbDeviceFS.pClass (la cual es necesaria por USBD_CDC_SetTxBuffer) campo nunca se inicializa porque USBD_CDC_Init() nunca es llamado en la inicialización del Dispositivo USB.

He implementado la corrección de algunos bugs (incluyendo un cambio en el tamaño de la pila, la fijación de la transmisión de la bandera en USBD_CDC_TransmitPacket, y cambiar el tamaño de CDC_DATA_HS_MAX_PACKET_SIZE 256 512) en el código de ejemplo de como se documenta en el ST foro, pero sigue recibiendo el mismo errror.

Mi dispositivo configuración de código es

* USB Device Core handle declaration */
USBD_HandleTypeDef hUsbDeviceFS;

/* init function */                    
void MX_USB_DEVICE_Init(void)
{
  /* Init Device Library,Add Supported Class and Start the library*/
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);

  USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);

  USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);

  USBD_Start(&hUsbDeviceFS);

}

10voto

devup Puntos 26

Para responder mi propia pregunta, el problema es que mi código no espera para que el USB finalizar la inicialización y comenzaron inmediatamente a enviar datos. Insertar una espera activa en un valor booleano o añadiendo un retraso (como @ramez) soluciona el problema.

2voto

Gibbo Puntos 11

He utilizado CubeMX para la generación de código para STM32F4 discovery. Yo lo he utilizado como puerto COM virtual como usted. Yo no uso USBD_CDC_SetTxBuffer() la función directamente. En usbd_cdc_if.c archivo no existe una función denominada CDC_Transmit_FS(). Hubo un error en el código generado, la función tuvo un buffer como parámetro y no hizo nada con él. Corregido el código de la función es la siguiente:

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  memcpy(UserTxBufferFS, Buf, sizeof(char) * Len);
  USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, Len);   
  result = USBD_CDC_TransmitPacket(hUsbDevice_0);
  return result;
}

En realidad tuve que agregar el memcpy para el código. Después de esta corrección podría enviar datos desde el microcotroller a la PC con esta transmisión de la función. Por ejemplo:

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  configureGPIOs();

  uint8_t Buf[] = "Test";

  HAL_Delay(1000);

  while (1)
  {
      CDC_Transmit_FS(Buf, 4);
      HAL_Delay(1000);
  }
}

El initalization en MX_USB_DEVICE_Init() es la misma que en mí como el tuyo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X