PER Firmware
Loading...
Searching...
No Matches
gpio.h
Go to the documentation of this file.
1
13#ifndef _PHAL_GPIO_H_
14#define _PHAL_GPIO_H_
15
17
21typedef enum {
22 GPIO_TYPE_INPUT = 0b00, /* Pin input mode */
23 GPIO_TYPE_OUTPUT = 0b01, /* Pin output mode */
24 GPIO_TYPE_AF = 0b10, /* Pin alternate function mode */
25 GPIO_TYPE_ANALOG = 0b11, /* Pin alternate function mode */
27
31typedef enum {
32 GPIO_OUTPUT_LOW_SPEED = 0b00, /* Slew rate control, max 8Mhz */
33 GPIO_OUTPUT_MED_SPEED = 0b01, /* Slew rate control, max 50Mhz */
34 GPIO_OUTPUT_HIGH_SPEED = 0b10, /* Slew rate control, max 100Mhz */
35 GPIO_OUTPUT_ULTRA_SPEED = 0b11, /* Slew rate control, max 180Mhz */
37
41typedef enum {
42 GPIO_OUTPUT_PUSH_PULL = 0b0, /* Drive the output pin high and low */
43 GPIO_OUTPUT_OPEN_DRAIN = 0b1, /* Drive the output pin low, high-z otherwise */
45
49typedef enum {
50 GPIO_INPUT_OPEN_DRAIN = 0b00, /* No internal pull up/down */
51 GPIO_INPUT_PULL_UP = 0b01, /* Weak internal pull-up enabled */
52 GPIO_INPUT_PULL_DOWN = 0b10, /* Weak internal pull-down enabled */
54
58typedef struct
59{
60 GPIO_TypeDef* bank; /* GPIO Bank for configuration */
61 uint8_t pin; /* Pin Number for configruation */
62 GPIOPinType_t type; /* Output type of pin */
63
64 struct
65 {
66 // INPUT ONLY FIELDS
67 GPIOInputPull_t pull; /* Push/Pull selection */
68
69 // OUTPUT ONLY FIELDS
70 GPIOOutputSpeed_t ospeed; /* Output speed (slew rate) */
71 GPIOOutputPull_t otype; /* Output push/pull */
72
73 // AF ONLY FIELDS
74 uint8_t af_num; /* Anternate function type */
75 } config; /* Type specific configuration for pins */
77
85#define GPIO_INIT_INPUT(gpio_bank, pin_num, input_pull_sel) \
86 { \
87 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_INPUT, .config = {.pull = input_pull_sel } \
88 }
89
97#define GPIO_INIT_OUTPUT(gpio_bank, pin_num, ospeed_sel) \
98 { \
99 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_OUTPUT, .config = {.ospeed = ospeed_sel, \
100 .otype = GPIO_OUTPUT_PUSH_PULL } \
101 }
102
103#define GPIO_INIT_OUTPUT_OPEN_DRAIN(gpio_bank, pin_num, ospeed_sel) \
104 { \
105 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_OUTPUT, .config = {.ospeed = ospeed_sel, \
106 .otype = GPIO_OUTPUT_OPEN_DRAIN } \
107 }
114#define GPIO_INIT_ANALOG(gpio_bank, pin_num) \
115 { \
116 .bank = gpio_bank, \
117 .pin = pin_num, \
118 .type = GPIO_TYPE_ANALOG}
119
130#define GPIO_INIT_AF(gpio_bank, pin_num, alt_func_num, ospeed_sel, otype_sel, input_pull_sel) \
131 { \
132 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_AF, .config = {.af_num = alt_func_num, \
133 .ospeed = ospeed_sel, \
134 .otype = otype_sel, \
135 .pull = input_pull_sel } \
136 }
137
138/*
139 Useful defines for GPIO Init struct with commonly used peripheral/pin mappings.
140 If you find yourself adding the same pin mappings to multiple devices, add a macro below
141 to cut down on duplication.
142*/
143#ifdef STM32F407xx
144//CAN
145#define GPIO_INIT_CANRX_PD0 GPIO_INIT_AF(GPIOD, 0, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
146#define GPIO_INIT_CANTX_PD1 GPIO_INIT_AF(GPIOD, 1, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
147
148#define GPIO_INIT_CANRX_PA11 GPIO_INIT_AF(GPIOA, 11, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
149#define GPIO_INIT_CANTX_PA12 GPIO_INIT_AF(GPIOA, 12, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
150
151#define GPIO_INIT_CAN2RX_PB5 GPIO_INIT_AF(GPIOB, 5, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
152#define GPIO_INIT_CAN2TX_PB6 GPIO_INIT_AF(GPIOB, 6, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
153
154#define GPIO_INIT_CAN2RX_PB12 GPIO_INIT_AF(GPIOB, 12, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
155#define GPIO_INIT_CAN2TX_PB13 GPIO_INIT_AF(GPIOB, 13, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
156
157//SPI
158#define GPIO_INIT_SPI2_SCK_PB13 GPIO_INIT_AF(GPIOB, 13, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
159#define GPIO_INIT_SPI2_MISO_PB14 GPIO_INIT_AF(GPIOB, 14, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
160#define GPIO_INIT_SPI2_MOSI_PB15 GPIO_INIT_AF(GPIOB, 15, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
161
162#define GPIO_INIT_SPI2_MISO_PC2 GPIO_INIT_AF(GPIOC, 2, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
163#define GPIO_INIT_SPI2_MOSI_PC3 GPIO_INIT_AF(GPIOC, 3, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
164#define GPIO_INIT_SPI1_SCK_PB3 GPIO_INIT_AF(GPIOB, 3, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
165#define GPIO_INIT_SPI2_MISO_PB4 GPIO_INIT_AF(GPIOB, 4, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
166#define GPIO_INIT_SPI1_MOSI_PB5 GPIO_INIT_AF(GPIOB, 5, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
167
168#define GPIO_INIT_SPI1_SCK_PA5 GPIO_INIT_AF(GPIOA, 5, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
169#define GPIO_INIT_SPI1_MISO_PA6 GPIO_INIT_AF(GPIOA, 6, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
170#define GPIO_INIT_SPI1_MOSI_PA7 GPIO_INIT_AF(GPIOA, 7, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
171
172//UART/USART
173#define GPIO_INIT_USART3TX_PC10 GPIO_INIT_AF(GPIOC, 10, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
174#define GPIO_INIT_USART3RX_PC11 GPIO_INIT_AF(GPIOC, 11, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
175
176#define GPIO_INIT_USART2TX_PA2 GPIO_INIT_AF(GPIOA, 2, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
177#define GPIO_INIT_USART2RX_PA3 GPIO_INIT_AF(GPIOA, 3, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
178
179#define GPIO_INIT_USART1TX_PA9 GPIO_INIT_AF(GPIOA, 9, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
180#define GPIO_INIT_USART1RX_PA10 GPIO_INIT_AF(GPIOA, 10, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
181
182#define GPIO_INIT_USART2TX_PD5 GPIO_INIT_AF(GPIOD, 5, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
183#define GPIO_INIT_USART2RX_PD6 GPIO_INIT_AF(GPIOD, 6, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
184
185#define GPIO_INIT_USART6TX_PC6 GPIO_INIT_AF(GPIOC, 6, 8, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
186#define GPIO_INIT_USART6RX_PC7 GPIO_INIT_AF(GPIOC, 7, 8, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
187#endif
188
189// SDIO
190#define GPIO_INIT_SDIO_CLK GPIO_INIT_AF(GPIOC, 12, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
191#define GPIO_INIT_SDIO_CMD GPIO_INIT_AF(GPIOD, 2, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
192#define GPIO_INIT_SDIO_DT0 GPIO_INIT_AF(GPIOC, 8, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
193#define GPIO_INIT_SDIO_DT1 GPIO_INIT_AF(GPIOC, 9, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
194#define GPIO_INIT_SDIO_DT2 GPIO_INIT_AF(GPIOC, 10, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
195#define GPIO_INIT_SDIO_DT3 GPIO_INIT_AF(GPIOC, 11, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
196
197// MCO1 (AF0)
198#define GPIO_INIT_MCO1_PA8 GPIO_INIT_AF(GPIOA, 8, 0, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
199
209bool PHAL_initGPIO(GPIOInitConfig_t config[], uint8_t config_len);
210
219static inline bool PHAL_GPIO_read(GPIO_TypeDef* bank, uint8_t pin) {
220 return (bank->IDR >> pin) & 0b1;
221}
222
230static inline void PHAL_GPIO_write(GPIO_TypeDef* bank, uint8_t pin, bool value) {
231 bank->BSRR |= 1 << ((!value << 4) | pin); // BSRR has "set" as bottom 16 bits and "reset" as top 16
232}
233
234static inline void PHAL_GPIO_toggle(GPIO_TypeDef* bank, uint8_t pin) {
235 PHAL_GPIO_write(bank, pin, !PHAL_GPIO_read(bank, pin));
236}
237#endif
static ethernet_config_t config
Definition ethernet.c:22
GPIOOutputPull_t
Output drive mode selection.
Definition gpio.h:41
@ GPIO_OUTPUT_OPEN_DRAIN
Definition gpio.h:43
@ GPIO_OUTPUT_PUSH_PULL
Definition gpio.h:42
static void PHAL_GPIO_write(GPIO_TypeDef *bank, uint8_t pin, bool value)
Write a logic value to an output pin.
Definition gpio.h:230
GPIOPinType_t
Configuration type for GPIO Pin.
Definition gpio.h:21
@ GPIO_TYPE_AF
Definition gpio.h:24
@ GPIO_TYPE_INPUT
Definition gpio.h:22
@ GPIO_TYPE_OUTPUT
Definition gpio.h:23
@ GPIO_TYPE_ANALOG
Definition gpio.h:25
bool PHAL_initGPIO(GPIOInitConfig_t config[], uint8_t config_len)
Initilize the GPIO perpheral given a list of configuration fields for all of the GPIO pins....
Definition gpio.c:3
static void PHAL_GPIO_toggle(GPIO_TypeDef *bank, uint8_t pin)
Definition gpio.h:234
static bool PHAL_GPIO_read(GPIO_TypeDef *bank, uint8_t pin)
Read the state of the input register for the specific GPIO pin.
Definition gpio.h:219
GPIOInputPull_t
Enable internal pullup/down resistors.
Definition gpio.h:49
@ GPIO_INPUT_PULL_UP
Definition gpio.h:51
@ GPIO_INPUT_OPEN_DRAIN
Definition gpio.h:50
@ GPIO_INPUT_PULL_DOWN
Definition gpio.h:52
GPIOOutputSpeed_t
Slew rate control for output pins.
Definition gpio.h:31
@ GPIO_OUTPUT_HIGH_SPEED
Definition gpio.h:34
@ GPIO_OUTPUT_MED_SPEED
Definition gpio.h:33
@ GPIO_OUTPUT_LOW_SPEED
Definition gpio.h:32
@ GPIO_OUTPUT_ULTRA_SPEED
Definition gpio.h:35
Configuration entry for GPIO initilization.
Definition gpio.h:59
GPIOPinType_t type
Definition gpio.h:62
GPIOOutputPull_t otype
Definition gpio.h:71
uint8_t af_num
Definition gpio.h:74
GPIOInputPull_t pull
Definition gpio.h:67
GPIOOutputSpeed_t ospeed
Definition gpio.h:70
GPIO_TypeDef * bank
Definition gpio.h:60
uint8_t pin
Definition gpio.h:61