Red de conocimiento informático - Material del sitio web - Cómo utilizar stm32 para desarrollar aplicaciones USB

Cómo utilizar stm32 para desarrollar aplicaciones USB

Analiza principalmente la rutina oficial Custom_HID. Se recomienda encarecidamente analizar el código fuente junto con el protocolo USB2.0. Lo que es particularmente bueno es que el puerto se puede modificar después del análisis. Además, hay un conjunto de 80 videos sobre STM32 producidos por Yuanxiang Technology, que explican detalladamente el USB y otros periféricos avanzados, y el efecto también es muy bueno cuando se combina con el aprendizaje de la placa de desarrollo Atom. El video en el sitio web oficial de Yuanxiang Technology es bastante caro, jaja. Finalmente, descubrí en Taobao que el más barato en las tiendas recién abiertas cuesta solo 10 yuanes. El jefe es un muy buen estudiante de posgrado y me ayudó mucho a aprender USB. Sin más preámbulos, aquí tienes los pasos para modificar la rutina oficial: Programa USB adjunto

un archivo usb_desc.c

Modificar según el método de comunicación utilizado por tu programa. El archivo usb_desc.h se define de acuerdo con el tamaño de la matriz en el archivo usb_desc.c; ConfigDescriptor[SIZ_CONFIG_DESC] agrega los puntos finales que deben procesarse, agrega o elimina descriptores de informes (utilizados principalmente para HID) y descriptores de interfaz CDC; (utilizado principalmente para implementar USB al puerto serie), etc. Para métodos específicos, puede utilizar el ejemplo escrito en D12 para descargar un "Círculo informático".

2. Archivo usb_conf.h:

1. Modificar las interrupciones que deben procesarse

CNTR_CTRM

Después de procesar correctamente el Control de transmisión de datos, como responder al host

CNTR_DOVRM

/* DMA OVeR/underrun Mask */

.

CNTR_ERRM

/*Máscara ERRor*/

CNTR_WKUPM 0

/*Máscara WaKe UP*/

CNTR_SUSPM

/* SUSPend Mask */

CNTR_ RESETM

Maneja principalmente algunas tareas de inicialización después del reinicio del USB*/

CNTR_SOFM

/* Máscara de inicio de fotograma*/

CNTR_ESOFM

/* Máscara de inicio de fotograma esperada*/

Por ejemplo,

#define IMR_MSK (CNTR_CTRM | CNTR_SOFM | CNTR_RESETM ) se utiliza en usb_conf.h para determinar si las interrupciones relacionadas con USB en el registro USB_CNTR están habilitadas o enmascaradas.

2. Aumente la dirección del búfer del punto final según sea necesario y modifíquela de acuerdo con la dirección del búfer para evitar la superposición de datos.

Lo siguiente se basa en que el tamaño de cada búfer es de 64 bytes. Modificación:

#defineENDP1_TXADDR

(0xC0)

#defineENDP1_RXADDR

(0xD0)

#defineENDP2_TXADDR

(0x100)

#define

#define ENDP2_TXADDR

(0x100)

#define ENDP2_RXADDR

(0x140)

#definir ENDP3_TXADDR

#definir ENDP3_TXADDR

(0x180)

#definir ENDP3_RXADDR

(0x1C0)

3. Modifique EPX_IN_Callback y EPX_OUT_Callback en /* rutina de servicio CTR*/. Anota la función a procesar. NOP_Process significa que no hay procesamiento.

Tres archivos usb_prop.c

1. Modificar void XX_Reset (void) (como: void Joystick_Reset (void))

Generalmente/* Punto final de inicialización 0 */ no es necesario modificarlo. A continuación se toma la inicialización del punto final 1 como ejemplo para describir otros puertos. El principio es el mismo para otros puertos.

SetEPType(ENDP1, EP_INTERRUPT); //Establece el tipo de punto final 1

/*EP_BULK

Punto final masivo

Control EP_CONTROL Punto final

Punto final de sincronización EP_ISOCHRNOUS

Punto final de interrupción EP_Interrupt

Punto final de interrupción EP_INTERRUPT

Punto final de interrupción INTERRUPT en inglés*/

SetEPTxAddr(ENDP1, ENDP1_TXADDR); //Establecer la dirección base del búfer del punto final 1

SetEPTxCount(ENDP1, 64); //Configurar el contador del búfer de Tx

SetEPRxStatus( ENDP1, EP_RX_DIS); // // Establecer endpoint RX para deshabilitar

SetEPTxStatus(ENDP1, EP_TX_NAK) // // Establecer EndPoint 1 para no enviar una respuesta

/*

#define EP_RX_DIS

(0x0000) // EndPoint RX DISabled La recepción del endpoint está cerrada

#defineEP_RX_STALL

(0x1000) // EndPoint RX STALLed Retardo de recepción del endpoint

#define EP_RX_NAK

(0x2000) // EndPoint RX NAKed Endpoint recibido no respondido

#defineEP_RX_VALID

(0x3000) // EndPoint RX VÁLIDO La recepción de EndPoint es válida

#define EP_TX_DIS

(0x0000) // EndPoint TX DISabled

#define EP_TX_STALL

( 0x0010) // EndPoint TX ESTALLADO

#define EP_TX_NAK

(0x0020) // EndPoint TX NAKed

#define EP_TX_VALID

( 0x0030) // EndPoint TX VÁLIDO */

2. Eliminar descriptores irrelevantes, etc.

Por ejemplo, los dispositivos USB personalizados no requieren la siguiente inicialización de estructura:

ONE_DESCRIPTOR Joystick_Report_Descriptor

ONE_DESCRIPTOR Mouse_Hid_Descriptor

3, modificar RESULTADO XX_Data_Setup(u8 RequestNo) se utiliza para el procesamiento de solicitudes de clases de datos.

Destinatario == (STANDARD_REQUEST | INTERFACE_RECIPIENT))

&& (pInformation->USBwIndex0 == 0))

{

if (pInformation -> USBwValue1 = = REPORT_DESCRIPTOR)

{

CopyRoutine = Joystick_GetReportDescriptor;

}

si no (pInformación->.USBwValue1 == HID_DESCRIPTOR_TYPE )

{

CopyRoutine = Joystick_GetHIDDescriptor;

4. Elimine la función de retorno de descriptor irrelevante

Si no es necesaria para dispositivos USB personalizados. Las siguientes funciones:

Joystick_GetReportDescriptor

Joystick_GetHIDDescriptor

4. Archivo usb_endp.C

5.

6.archivo usb_endp.C