/* ---------------------------------------------------------------------- * Copyright (C) 2013 ARM Limited. All rights reserved. * * $Date: 26. August 2013 * $Revision: V1.2 * * Project: GPIO Driver definitions for ST STM32F10x * -------------------------------------------------------------------- */ #ifndef __GPIO_STM32F10X_H #define __GPIO_STM32F10X_H #include #include "stm32f10x.h" #if defined (__CC_ARM) #define __FORCE_INLINE static __forceinline #else #define __FORCE_INLINE __STATIC_INLINE #endif /// GPIO Pin identifier typedef struct _GPIO_PIN_ID { GPIO_TypeDef *port; uint8_t num; } GPIO_PIN_ID; /// Port Mode typedef enum { GPIO_MODE_INPUT = 0x00, /// GPIO is input GPIO_MODE_OUT10MHZ = 0x01, /// Max output Speed 10MHz GPIO_MODE_OUT2MHZ = 0x02, /// Max output Speed 2MHz GPIO_MODE_OUT50MHZ = 0x03 /// Max output Speed 50MHz } GPIO_MODE; /// Port Conf typedef enum { GPIO_OUT_PUSH_PULL = 0x00, /// general purpose output push-pull GPIO_OUT_OPENDRAIN = 0x01, /// general purpose output open-drain GPIO_AF_PUSHPULL = 0x02, /// alternate function push-pull GPIO_AF_OPENDRAIN = 0x03, /// alternate function open-drain GPIO_IN_ANALOG = 0x00, /// input analog GPIO_IN_FLOATING = 0x01, /// input floating GPIO_IN_PULL_DOWN = 0x02, /// alternate function push-pull GPIO_IN_PULL_UP = 0x03 /// alternate function pull up } GPIO_CONF; /* Alternate function definition macro */ #define AFIO_FUNC_DEF(bit, mask, val, reg) ((bit) | (mask << 5) | (val << 8) | (reg << 12)) /// Alternate function I/O remap typedef enum { /* AF remap and debug I/O config register */ AFIO_SPI1_NO_REMAP = AFIO_FUNC_DEF (0, 1, 0, 0), AFIO_SPI1_REMAP = AFIO_FUNC_DEF (0, 1, 1, 0), AFIO_I2C1_NO_REMAP = AFIO_FUNC_DEF (1, 1, 0, 0), AFIO_I2C1_REMAP = AFIO_FUNC_DEF (1, 1, 1, 0), AFIO_USART1_NO_REMAP = AFIO_FUNC_DEF (2, 1, 0, 0), AFIO_USART1_REMAP = AFIO_FUNC_DEF (2, 1, 1, 0), AFIO_USART2_NO_REMAP = AFIO_FUNC_DEF (3, 1, 0, 0), AFIO_USART2_REMAP = AFIO_FUNC_DEF (3, 1, 1, 0), AFIO_USART3_NO_REMAP = AFIO_FUNC_DEF (4, 3, 0, 0), AFIO_USART3_REMAP_PARTIAL = AFIO_FUNC_DEF (4, 3, 1, 0), AFIO_USART3_REMAP_FULL = AFIO_FUNC_DEF (4, 3, 3, 0), AFIO_TIM1_NO_REMAP = AFIO_FUNC_DEF (6, 3, 0, 0), AFIO_TIM1_REMAP_PARTIAL = AFIO_FUNC_DEF (6, 3, 1, 0), AFIO_TIM1_REMAP_FULL = AFIO_FUNC_DEF (6, 3, 3, 0), AFIO_TIM2_NO_REMAP = AFIO_FUNC_DEF (8, 3, 0, 0), AFIO_TIM2_REMAP_PARTIAL_1 = AFIO_FUNC_DEF (8, 3, 1, 0), AFIO_TIM2_REMAP_PARTIAL_2 = AFIO_FUNC_DEF (8, 3, 2, 0), AFIO_TIM2_REMAP_FULL = AFIO_FUNC_DEF (8, 3, 3, 0), AFIO_TIM3_NO_REMAP = AFIO_FUNC_DEF (10, 3, 0, 0), AFIO_TIM3_REMAP_PARTIAL = AFIO_FUNC_DEF (10, 3, 2, 0), AFIO_TIM3_REMAP_FULL = AFIO_FUNC_DEF (10, 3, 3, 0), AFIO_TIM4_NO_REMAP = AFIO_FUNC_DEF (12, 1, 0, 0), AFIO_TIM4_REMAP = AFIO_FUNC_DEF (12, 1, 1, 0), AFIO_CAN_PA11_PA12 = AFIO_FUNC_DEF (13, 3, 0, 0), AFIO_CAN_PB8_PB9 = AFIO_FUNC_DEF (13, 3, 2, 0), AFIO_CAN_PD0_PD1 = AFIO_FUNC_DEF (13, 3, 3, 0), AFIO_PD01_NO_REMAP = AFIO_FUNC_DEF (15, 1, 0, 0), AFIO_PD01_REMAP = AFIO_FUNC_DEF (15, 1, 1, 0), AFIO_TIM5CH4_NO_REMAP = AFIO_FUNC_DEF (16, 1, 0, 0), AFIO_TIM5CH4_REMAP = AFIO_FUNC_DEF (16, 1, 1, 0), AFIO_ADC1_ETRGINJ_NO_REMAP = AFIO_FUNC_DEF (17, 1, 0, 0), AFIO_ADC1_ETRGINJ_REMAP = AFIO_FUNC_DEF (17, 1, 1, 0), AFIO_ADC1_ETRGREG_NO_REMAP = AFIO_FUNC_DEF (18, 1, 0, 0), AFIO_ADC1_ETRGREG_REMAP = AFIO_FUNC_DEF (18, 1, 1, 0), AFIO_ADC2_ETRGINJ_NO_REMAP = AFIO_FUNC_DEF (19, 1, 0, 0), AFIO_ADC2_ETRGINJ_REMAP = AFIO_FUNC_DEF (19, 1, 1, 0), AFIO_ADC2_ETRGREG_NO_REMAP = AFIO_FUNC_DEF (20, 1, 0, 0), AFIO_ADC2_ETRGREG_REMAP = AFIO_FUNC_DEF (20, 1, 1, 0), #if defined(STM32F10X_CL) AFIO_ETH_NO_REMAP = AFIO_FUNC_DEF (21, 1, 0, 0), AFIO_ETH_REMAP = AFIO_FUNC_DEF (21, 1, 1, 0), AFIO_CAN2_NO_REMAP = AFIO_FUNC_DEF (22, 1, 0, 0), AFIO_CAN2_REMAP = AFIO_FUNC_DEF (22, 1, 1, 0), AFIO_ETH_MII_SEL = AFIO_FUNC_DEF (23, 1, 0, 0), AFIO_ETH_RMII_SEL = AFIO_FUNC_DEF (23, 1, 1, 0), #endif AFIO_SWJ_FULL = AFIO_FUNC_DEF (24, 7, 0, 0), AFIO_SWJ_FULL_NO_NJTRST = AFIO_FUNC_DEF (24, 7, 1, 0), AFIO_SWJ_JTAG_NO_SW = AFIO_FUNC_DEF (24, 7, 2, 0), AFIO_SWJ_NO_JTAG_NO_SW = AFIO_FUNC_DEF (24, 7, 4, 0), #if defined(STM32F10X_CL) AFIO_SPI3_NO_REMAP = AFIO_FUNC_DEF (28, 1, 0, 0), AFIO_SPI3_REMAP = AFIO_FUNC_DEF (28, 1, 1, 0), AFIO_TIM2ITR_NO_REMAP = AFIO_FUNC_DEF (29, 1, 0, 0), AFIO_TIM2ITR_REMAP = AFIO_FUNC_DEF (29, 1, 1, 0), AFIO_PTP_PPS_NO_REMAP = AFIO_FUNC_DEF (30, 1, 0, 0), AFIO_PTP_PPS_REMAP = AFIO_FUNC_DEF (30, 1, 1, 0), #endif /* AF remap and debug I/O config register 2 */ AFIO_TIM15_NO_REMAP = AFIO_FUNC_DEF (0, 1, 0, 1), AFIO_TIM15_REMAP = AFIO_FUNC_DEF (0, 1, 1, 1), AFIO_TIM16_NO_REMAP = AFIO_FUNC_DEF (1, 1, 0, 1), AFIO_TIM16_REMAP = AFIO_FUNC_DEF (1, 1, 1, 1), AFIO_TIM17_NO_REMAP = AFIO_FUNC_DEF (2, 1, 0, 1), AFIO_TIM17_REMAP = AFIO_FUNC_DEF (2, 1, 1, 1), AFIO_CEC_NO_REMAP = AFIO_FUNC_DEF (3, 1, 0, 1), AFIO_CEC_REMAP = AFIO_FUNC_DEF (3, 1, 1, 1), AFIO_TIM1_DMA_NO_REMAP = AFIO_FUNC_DEF (4, 1, 0, 1), AFIO_TIM1_DMA_REMAP = AFIO_FUNC_DEF (4, 1, 1, 1), AFIO_TIM9_NO_REMAP = AFIO_FUNC_DEF (5, 1, 0, 1), AFIO_TIM9_REMAP = AFIO_FUNC_DEF (5, 1, 1, 1), AFIO_TIM10_NO_REMAP = AFIO_FUNC_DEF (6, 1, 0, 1), AFIO_TIM10_REMAP = AFIO_FUNC_DEF (6, 1, 1, 1), AFIO_TIM11_NO_REMAP = AFIO_FUNC_DEF (7, 1, 0, 1), AFIO_TIM11_REMAP = AFIO_FUNC_DEF (7, 1, 1, 1), AFIO_TIM13_NO_REMAP = AFIO_FUNC_DEF (8, 1, 0, 1), AFIO_TIM13_REMAP = AFIO_FUNC_DEF (8, 1, 0, 1), AFIO_TIM14_NO_REMAP = AFIO_FUNC_DEF (9, 1, 0, 1), AFIO_TIM14_REMAP = AFIO_FUNC_DEF (9, 1, 1, 1), AFIO_FSMC_NADV_NO_REMAP = AFIO_FUNC_DEF (10, 1, 0, 1), AFIO_FSMC_NADV_REMAP = AFIO_FUNC_DEF (10, 1, 1, 1), AFIO_TIM67_DAC_DMA_NO_REMAP = AFIO_FUNC_DEF(11, 1, 0, 1), AFIO_TIM67_DAC_DMA_REMAP = AFIO_FUNC_DEF (11, 1, 1, 1), AFIO_TIM12_NO_REMAP = AFIO_FUNC_DEF (12, 1, 0, 1), AFIO_TIM12_REMAP = AFIO_FUNC_DEF (12, 1, 1, 1), AFIO_MISC_NO_REMAP = AFIO_FUNC_DEF (13, 1, 0, 1), AFIO_MISC_REMAP = AFIO_FUNC_DEF (13, 1, 1, 1), /* Reserved value */ AFIO_UNAVAILABLE_REMAP = AFIO_FUNC_DEF (0, 0, 0, 0) } AFIO_REMAP; /** \fn void GPIO_PortClock (GPIO_TypeDef *GPIOx, bool en) \brief Port Clock Control \param[in] GPIOx Pointer to GPIO peripheral \param[in] enable Enable or disable clock */ extern void GPIO_PortClock (GPIO_TypeDef *GPIOx, bool enable); /** \fn bool GPIO_GetPortClockState (GPIO_TypeDef *GPIOx) \brief Get GPIO port clock state \param[in] GPIOx Pointer to GPIO peripheral \return true - enabled false - disabled */ extern bool GPIO_GetPortClockState (GPIO_TypeDef *GPIOx); /** \fn bool GPIO_PinConfigure (GPIO_TypeDef *GPIOx, uint32_t num, GPIO_CONF conf, GPIO_MODE mode) \brief Configure port pin \param[in] GPIOx Pointer to GPIO peripheral \param[in] num Port pin number \param[in] mode \ref GPIO_MODE \param[in] conf \ref GPIO_CONF \return true - success false - error */ bool GPIO_PinConfigure(GPIO_TypeDef *GPIOx, uint32_t num, GPIO_CONF conf, GPIO_MODE mode); /** \fn void GPIO_PinWrite (GPIO_TypeDef *GPIOx, uint32_t num, uint32_t val) \brief Write port pin \param[in] GPIOx Pointer to GPIO peripheral \param[in] num Port pin number \param[in] val Port pin value (0 or 1) */ __FORCE_INLINE void GPIO_PinWrite (GPIO_TypeDef *GPIOx, uint32_t num, uint32_t val) { if (val & 1) { GPIOx->BSRR = (1UL << num); // set } else { GPIOx->BSRR = (1UL << (num + 16)); // clr } } /** \fn uint32_t GPIO_PinRead (GPIO_TypeDef *GPIOx, uint32_t num) \brief Read port pin \param[in] GPIOx Pointer to GPIO peripheral \param[in] num Port pin number \return pin value (0 or 1) */ __FORCE_INLINE uint32_t GPIO_PinRead (GPIO_TypeDef *GPIOx, uint32_t num) { return ((GPIOx->IDR >> num) & 1); } /** \fn void GPIO_PortWrite (GPIO_TypeDef *GPIOx, uint16_t mask, uint16_t val) \brief Write port pins \param[in] GPIOx Pointer to GPIO peripheral \param[in] mask Selected pins \param[in] val Pin values */ __FORCE_INLINE void GPIO_PortWrite (GPIO_TypeDef *GPIOx, uint16_t mask, uint16_t val) { GPIOx->ODR = (GPIOx->ODR & ~mask) | val; } /** \fn uint16_t GPIO_PortRead (GPIO_TypeDef *GPIOx) \brief Read port pins \param[in] GPIOx Pointer to GPIO peripheral \return port pin inputs */ __FORCE_INLINE uint16_t GPIO_PortRead (GPIO_TypeDef *GPIOx) { return (GPIOx->IDR); } /** \fn void GPIO_AFConfigure (AFIO_REMAP af_type) \brief Configure alternate functions \param[in] af_type Alternate function remap type */ void GPIO_AFConfigure (AFIO_REMAP af_type); #endif /* __GPIO_STM32F10X_H */