Skip to content

Integration for STM32 without XPD

IntergatedCircuits edited this page Mar 10, 2018 · 1 revision

As the STM32_XPD drivers break CMSIS compliance, any existing CMSIS-based STM32 software is incompatible with XPD. In order to be able to integrate this library as part of an existing software, a workaround solution is described below.

1. Copy the USB peripheral driver(s) from the XPD repo

Whichever STM32 device you may be using, it has either one of the two possible USB peripheral IPs, the USB or the OTG_FS/OTG_HS. Therefore the peripheral drivers contained in STM32L4_XPD will be suitable for any STM32. The following files are required:

  • inc/xpd_common.h
  • inc/xpd_usb.h
  • inc/xpd_usb_otg.h
  • src/xpd_usb.c
  • src/xpd_usb_otg.c

2. Create missing header files

These copied files include a list of headers that need to be created. The list of headers with their contents follow:

xpd_syscfg.h

[empty]

xpd_rcc_pc.h

[empty]

xpd_rcc.h

(Assuming that the clock enabling is done separately.)

#define RCC_vClockEnable(A)
#define RCC_vClockDisable(A)

xpd_utils.h

If the USB_eChargerDetect() API is used, then the following two functions have to be implemented:

void            XPD_vDelay_ms           (uint32_t ulMilliseconds);
XPD_ReturnType  XPD_eWaitForDiff        (volatile uint32_t * pulVarAddress, uint32_t ulBitSelector,
                                         uint32_t            ulMatch,       uint32_t * pulTimeout);

In other cases simply define them as empty macros:

#define XPD_vDelay_ms(A)
#define XPD_eWaitForDiff(A, B, C, D)

xpd_config.h

This header file will be responsible for uniting the XPD USB peripheral driver with the CMSIS-compliant device header. The final step to complete this file is to copy the USB peripherals structures (which are mentioned in the comments) from a device header in STM32_XPD/CMSIS/Device/ST. You should be able to find a supported device which has the same peripheral version as yours. In general for USB this device is recommended, while for USB_OTG this device is.

/* TODO Include the proper CMSIS device header */
#include "stm32l4xx.h"

/* Replace type definitions */
#define USB_TypeDef                __USB_TypeDef
#define USB_OTG_INEndpointTypeDef  __USB_OTG_INEndpointTypeDef
#define USB_OTG_OUTEndpointTypeDef __USB_OTG_OUTEndpointTypeDef
#define USB_OTG_HostChannelTypeDef __USB_OTG_HostChannelTypeDef
#define USB_OTG_TypeDef            __USB_OTG_TypeDef

#undef  USB
#define USB ((__USB_TypeDef*)USB_BASE)

/* TODO Copy USB peripheral registers structures from a compatible device header */
/* typedef of USB_TypeDef */
/* AND/OR */
/* typedef of USB_OTG_INEndpointTypeDef
   typedef of USB_OTG_OUTEndpointTypeDef
   typedef of USB_OTG_HostChannelTypeDef
   typedef of USB_OTG_TypeDef */

3. Build

After these files are copied and created, the USBDevice is ready to be built. Remember to add /PDs/STM32_XPD to the include directories as well.