Cómo utilizar stm32 para desarrollar aplicaciones USB
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 p>
(0x140)
#definir ENDP3_TXADDR
#definir ENDP3_TXADDR
(0x180)
#definir ENDP3_RXADDR p>
(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