STM32F042-Drivers-Pub/gpio.h

199 lines
5.1 KiB
C
Raw Permalink Normal View History

2024-05-02 10:18:04 +00:00
/*
* gpio.h
*
* Created on: Mar 6, 2024
* Author: Francesco Gritti
*/
#ifndef GPIO_h
#define GPIO_h
#include "stm32f042x6.h"
/*========================================================================================*
* GPIO DEFINES
*========================================================================================*/
typedef enum {
GPIO_AF_TIM3 = 0x01,
GPIO_AF_TIM2 = 0x02,
}GPIO_AF_enum;
typedef enum {
GPIO_OSPEED_LOW = 0,
GPIO_OSPEED_MEDIUM = 1,
GPIO_OSPEED_HIGH = 3
}GPIO_OSPEED_enum;
#define GPIO_OUTPUT_TYPE_Pos 4U
#define GPIO_OUTPUT_PP (0x0UL << GPIO_OUTPUT_TYPE_Pos)
#define GPIO_OUTPUT_OD (0x1UL << GPIO_OUTPUT_TYPE_Pos)
#define GPIO_PULL_Mask (0x00000003U)
#define GPIO_PULLUP (0x00000001U)
#define GPIO_PULLDOWN (0x00000002U)
#define GPIO_AF_Mask (0x0000000fU)
#define GPIO_AF_Wdth (4U)
#define GPIO_AF0_USART1 ((uint8_t)0x00U)
/* ============ OUTPUT LEVEL SET =========== */
#define GPIO_SET(pin) PRVT_GPIO_SET (pin##_port, pin##_npin)
#define GPIO_CLR(pin) PRVT_GPIO_CLR (pin##_port, pin##_npin)
#define GPIO_TOGGLE(pin) PRVT_GPIO_TOGGLE (pin##_port, pin##_npin)
#define GPIO_SET_OSPEED(pin, speed) PRVT_GPIO_SET_OSPEED(pin##_port, pin##npin, speed)
/* ============ ALTERNATE FUNCTION SET =========== */
#define GPIO_SET_MODE_ALTERNATE(pin) PRVT_GPIO_SET_ALT(pin##_port, pin##npin)
#define GPIO_SET_AFRL(pin, af) PRVT_GPIO_SET_AFRL(pin##_port, pin##_npin, af)
#define GPIO_SET_AFRH(pin, af) PRVT_GPIO_SET_AFRH(pin##_port, pin##_npin, af)
/*========================================================================================*
* GPIO CONTROL MACROS
*========================================================================================*/
#define GPIO_INPUT_GET_VALUE(pin) PRVT_GPIO_INPUT_GET_VALUE(pin##_port, pin##_npin)
#define GPIO_AF_PP(pin) \
PRVT_GPIO_SET_ALT(pin##_port, pin##_npin); \
PRVT_GPIO_SET_OSPEED (pin##_port, pin##_npin, GPIO_OSPEED_HIGH); \
GPIO_SET_OUTPUT_TYPE (pin##_port, pin##_npin, GPIO_OUTPUT_PP); \
GPIO_DISABLE_PULL (pin##_port, pin##_npin)
#define GPIO_OUTPUT_PP_HS(pin) \
GPIO_SET_OUTPUT (pin##_port, pin##_npin); \
PRVT_GPIO_SET_OSPEED (pin##_port, pin##_npin, GPIO_OSPEED_HIGH); \
GPIO_SET_OUTPUT_TYPE (pin##_port, pin##_npin, GPIO_OUTPUT_PP); \
GPIO_DISABLE_PULL (pin##_port, pin##_npin)
#define GPIO_OUTPUT_PP_LS(pin) \
GPIO_SET_OUTPUT (pin##_port, pin##_npin); \
PRVT_GPIO_SET_OSPEED (pin##_port, pin##_npin, GPIO_OSPEED_LOW); \
GPIO_SET_OUTPUT_TYPE (pin##_port, pin##_npin, GPIO_OUTPUT_PP); \
GPIO_DISABLE_PULL (pin##_port, pin##_npin)
#define GPIO_INPUT_NOPULL(pin) \
GPIO_SET_INPUT(pin##_port, pin##_npin) \
GPIO_DISABLE_PULL(pin##_port, pin##_npin)
/*========================================================================================*
* GPIO PRIVATE MACROS: DO NOT USE!
*========================================================================================*/
#define PRVT_GPIO_SET(port, npin) port->BSRR |= (0x1 << npin)
#define PRVT_GPIO_CLR(port, npin) port->BSRR |= (0x1 << (16+npin))
#define PRVT_GPIO_TOGGLE(port, npin) port->ODR ^= (0x1 << (npin))
#define PRVT_GPIO_SET_ALT(port, pin) \
{ \
u32 temp = port->MODER; \
temp &= ~(0b11U << pin*2); \
temp |= (0b10 << pin*2); \
port->MODER = temp; \
}
#define GPIO_SET_INPUT(port, pin) \
{ \
u32 temp = port->MODER; \
temp &= ~(0b11U << pin*2); \
port->MODER = temp; \
}
#define GPIO_SET_OUTPUT(port, pin) \
{ \
u32 temp = port->MODER; \
temp &= ~(0b11U << pin*2); \
temp |= (0b01 << pin*2); \
port->MODER = temp; \
}
#define PRVT_GPIO_SET_OSPEED(port, pin, speed) \
{ \
u32 temp = port->OSPEEDR; \
temp &= ~(0b11U << pin*2); \
temp |= (speed << pin*2); \
port->OSPEEDR = temp; \
}
#define GPIO_SET_OUTPUT_TYPE(port, pin, type) \
{ \
u32 temp = port->OTYPER; \
temp &= ~(0b01U << pin); \
temp |= (type << pin); \
port->OTYPER = temp; \
}
#define GPIO_DISABLE_PULL(port, pin) \
{ \
u32 temp = port->PUPDR; \
temp &= ~(GPIO_PULL_Mask << pin*2); \
port->PUPDR = temp; \
}
#define GPIO_ENABLE_PULLUP(port, pin) \
{ \
u32 temp = port->PUPDR; \
temp &= ~(GPIO_PULL_Mask << pin*2); \
temp |= (GPIO_PULLUP << pin*2); \
port->PUPDR = temp; \
}
#define GPIO_ENABLE_PULLDOWN(port, pin) \
{ \
u32 temp = port->PUPDR; \
temp &= ~(GPIO_PULL_Mask << pin*2); \
temp |= (GPIO_PULLDOWN << pin*2); \
port->PUPDR = temp; \
}
#define PRVT_GPIO_SET_AFRL(port, pin, af) \
{ \
u32 temp = port->AFR[0]; \
temp &= ~(GPIO_AF_Mask << pin*GPIO_AF_Wdth); \
temp |= (af << pin*GPIO_AF_Wdth); \
port->AFR[0] = temp; \
}
#define PRVT_GPIO_SET_AFRH(port, pin, af) \
{ \
u32 temp = port->AFR[1]; \
temp &= ~(GPIO_AF_Mask << (pin-8)*GPIO_AF_Wdth); \
temp |= (af << (pin-8)*GPIO_AF_Wdth); \
port->AFR[1] = temp; \
}
#endif /* GPIO_h */