199 lines
5.1 KiB
C
199 lines
5.1 KiB
C
|
/*
|
||
|
* 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 */
|