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