STM32 Clase de audio USB no reconocido como dispositivo de audio

Estoy aprendiendo sobre las clases de USB usando STM32F429ZI (en la placa Discovery). Ya traté de implementar la clase de dispositivo de comunicaciones (CDC) y funcionó bien, ahora traté de hacer una prueba simple con la clase de dispositivo de audio.
Estoy usando CubeMX para generar un proyecto, elegí Audio Device Class allí, creó archivos de biblioteca predeterminados. uVision cumplió sin errores ni advertencias. Mostré mi MCU y en el administrador de dispositivos se ve así:ingrese la descripción de la imagen aquí

Después de aprender sobre CDC USB, supe que necesitaba aumentar Stack_Size y Heap_Size en el archivo de inicio. Lo probé - nada cambia. También encontré algunos consejos para disminuir HS_MAX_PACKET_SIZE, aún sin efecto.

Bueno, las preguntas son:

  1. ¿Por qué está bajo el puerto COM? Incluso si algunas configuraciones no son correctas, ¿no debería estar debajo de los dispositivos de sonido?
  2. ¿Lo que está mal? ¿Cómo hacer que funcione? Sería bueno que al menos se reconozca como dispositivo de audio, nada especial.

El error debajo del dispositivo es simplemente un error genérico "Este dispositivo no puede iniciarse".

ingrese la descripción de la imagen aquí

EDIT 1
En realidad, no sé qué tipo de código adjuntar, ya que todo se genera con CubeMX. Puedo dar fragmentos a pedido, si es necesario.
Descripción del dispositivo USB generada por CubeMX.

#define USBD_VID     1155
#define USBD_LANGID_STRING     1033
#define USBD_MANUFACTURER_STRING     "STMicroelectronics"
#define USBD_PID_HS     22336
#define USBD_PRODUCT_STRING_HS     "STM32 Audio Class"
/* USER CODE BEGIN SERIALNUMBER_STRING_HS */
#define USBD_SERIALNUMBER_STRING_HS     "00000000001A"
/* USER CODE END SERIALNUMBER_STRING_HS */
#define USBD_CONFIGURATION_STRING_HS     "AUDIO Config"
#define USBD_INTERFACE_STRING_HS     "AUDIO Interface"

#define USB_SIZ_BOS_DESC            0x0C

EDIT 2
Descubrí que USBD_AUDIO_Init() no se llama en ningún lugar de forma predeterminada y este puede ser el problema. Pero tengo problemas para entender cómo puedo llamarlo cuando es "Static uint8_t", por lo que básicamente no se puede llamar desde main. Aquí está la descripción:

usbd_audio.c

/**
  * @brief  USBD_AUDIO_Init
  *         Initialize the AUDIO interface
  * @param  pdev: device instance
  * @param  cfgidx: Configuration index
  * @retval status
  */
static uint8_t  USBD_AUDIO_Init (USBD_HandleTypeDef *pdev, 
                               uint8_t cfgidx)
{
  bunch of code
}
Estoy atrapado aquí también. El STM-UM1734 indica en la página 47 "Llamar a la función USBD_AUDIO_Init al inicio". Pero, dado que es estático en usbd_audio.c, no se puede llamar desde fuera de ese archivo. Hice grep en todo el proyecto y USBD_AUDIO_Init no se llama desde ningún lado. Puedo eliminar la estática y llamarla desde main como prueba... Pero parece que debo estar haciendo algo mal. ¿Alguien alguna vez solucionó esto?

Respuestas (4)

¿Has probado esta función?

USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id)

La documentación de esta biblioteca se encuentra aquí , pero no es excelente. En general, el HAL le brinda algunas funciones y, si las usa correctamente, muchas otras cosas suceden detrás de escena. Su USBD_AUDIO_Init puede ser una de esas cosas.

USBD_Init() se llama de forma predeterminada dentro de MX_USB_DEVICE_Init() en el código generado por CubeMX. Y verifiqué: usa valores correctos en DescriptorsTypeDef, por lo que la inicialización básica parece estar bien. He leído el pdf al que te refieres, desafortunadamente solo mencionan este USBD_AUDIO_Init, que no tengo idea de cómo llamar, ya que es uint8_t estático.
Si investiga más, probablemente encontrará que es llamado internamente por una de las otras funciones de inicio.

Verifique USBD_malloc()las USBD_AUDIO_Init()asignaciones de memoria solicitada. USBD_AUDIO_HandleTypeDefcontiene:

buffer[AUDIO_TOTAL_BUF_SIZE]
AUDIO_TOTAL_BUF_SIZE = AUDIO_OUT_PACKET * AUDIO_OUT_PACKET_NUM
AUDIO_OUT_PACKET_NUM = 80
AUDIO_OUT_PACKET = (22100 * 2 * 2)/1000

Entonces, el tamaño total de asignación de memoria es de aproximadamente 7100 bytes. Configuré el tamaño del montón en el proyecto CubeMx 10KB (2800h). Después de eso, Windows (yo uso win10) reconoce stm32f4 como dispositivo de audio.

En el administrador de dispositivos, haga clic derecho en el dispositivo de puerto COM virtual y desinstale el dispositivo. Marque eliminar el software del controlador para este dispositivo. Reinicie el dispositivo. Ahora Windows debería instalar el controlador para la clase de dispositivo de audio USB.

Deberá cambiar el PID del nuevo dispositivo. O su dispositivo de audio tendrá el mismo PID que el dispositivo CDC anterior. El sistema reconocerá esos dos dispositivos como el mismo entonces.