/* * 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 */