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
16#include "common/phal_F4_F7/phal_F4_F7.h"
17
18#if defined(STM32F407xx)
19#elif defined(STM32F732xx)
20//Alternate Function register redifinition
21#define GPIO_AFRL_AFSEL0_Msk GPIO_AFRL_AFRL0_Msk
22#define GPIO_AFRL_AFSEL1_Msk GPIO_AFRL_AFRL1_Msk
23#define GPIO_AFRL_AFSEL2_Msk GPIO_AFRL_AFRL2_Msk
24
25#define GPIO_AFRL_AFSEL0_Pos GPIO_AFRL_AFRL0_Pos
26#define GPIO_AFRL_AFSEL1_Pos GPIO_AFRL_AFRL1_Pos
27#define GPIO_AFRL_AFSEL2_Pos GPIO_AFRL_AFRL2_Pos
28
29//Pull-select register redefinition
30#define GPIO_PUPDR_PUPD0_Msk GPIO_PUPDR_PUPDR0_Msk
31
32#define GPIO_PUPDR_PUPD0_Pos GPIO_PUPDR_PUPDR0_Pos
33#define GPIO_PUPDR_PUPD1_Pos GPIO_PUPDR_PUPDR1_Pos
34
35//Output Speed register redefinition
36#define GPIO_OSPEEDR_OSPEED0_Msk GPIO_OSPEEDR_OSPEEDR0_Msk
37#define GPIO_OSPEEDR_OSPEED1_Msk GPIO_OSPEEDR_OSPEEDR1_Msk
38
39#define GPIO_OSPEEDR_OSPEED0_Pos GPIO_OSPEEDR_OSPEEDR0_Pos
40#define GPIO_OSPEEDR_OSPEED1_Pos GPIO_OSPEEDR_OSPEEDR1_Pos
41
42//Mode register redefinitions
43#define GPIO_MODER_MODE0_Msk GPIO_MODER_MODER0_Msk
44#define GPIO_MODER_MODE1_Msk GPIO_MODER_MODER1_Msk
45
46#define GPIO_MODER_MODE0_Pos GPIO_MODER_MODER0_Pos
47#define GPIO_MODER_MODE1_Pos GPIO_MODER_MODER1_Pos
48#else
49#error "Please define a MCU arch"
50#endif
51
55typedef enum {
56 GPIO_TYPE_INPUT = 0b00, /* Pin input mode */
57 GPIO_TYPE_OUTPUT = 0b01, /* Pin output mode */
58 GPIO_TYPE_AF = 0b10, /* Pin alternate function mode */
59 GPIO_TYPE_ANALOG = 0b11, /* Pin alternate function mode */
61
65typedef enum {
66 GPIO_OUTPUT_LOW_SPEED = 0b00, /* Slew rate control, max 8Mhz */
67 GPIO_OUTPUT_MED_SPEED = 0b01, /* Slew rate control, max 50Mhz */
68 GPIO_OUTPUT_HIGH_SPEED = 0b10, /* Slew rate control, max 100Mhz */
69 GPIO_OUTPUT_ULTRA_SPEED = 0b11, /* Slew rate control, max 180Mhz */
71
75typedef enum {
76 GPIO_OUTPUT_PUSH_PULL = 0b0, /* Drive the output pin high and low */
77 GPIO_OUTPUT_OPEN_DRAIN = 0b1, /* Drive the output pin low, high-z otherwise */
79
83typedef enum {
84 GPIO_INPUT_OPEN_DRAIN = 0b00, /* No internal pull up/down */
85 GPIO_INPUT_PULL_UP = 0b01, /* Weak internal pull-up enabled */
86 GPIO_INPUT_PULL_DOWN = 0b10, /* Weak internal pull-down enabled */
88
92typedef struct
93{
94 GPIO_TypeDef* bank; /* GPIO Bank for configuration */
95 uint8_t pin; /* Pin Number for configruation */
96 GPIOPinType_t type; /* Output type of pin */
97
98 struct
99 {
100 // INPUT ONLY FIELDS
101 GPIOInputPull_t pull; /* Push/Pull selection */
102
103 // OUTPUT ONLY FIELDS
104 GPIOOutputSpeed_t ospeed; /* Output speed (slew rate) */
105 GPIOOutputPull_t otype; /* Output push/pull */
106
107 // AF ONLY FIELDS
108 uint8_t af_num; /* Anternate function type */
109 } config; /* Type specific configuration for pins */
111
119#define GPIO_INIT_INPUT(gpio_bank, pin_num, input_pull_sel) \
120 { \
121 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_INPUT, .config = {.pull = input_pull_sel } \
122 }
123
131#define GPIO_INIT_OUTPUT(gpio_bank, pin_num, ospeed_sel) \
132 { \
133 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_OUTPUT, .config = {.ospeed = ospeed_sel, \
134 .otype = GPIO_OUTPUT_PUSH_PULL } \
135 }
136
137#define GPIO_INIT_OUTPUT_OPEN_DRAIN(gpio_bank, pin_num, ospeed_sel) \
138 { \
139 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_OUTPUT, .config = {.ospeed = ospeed_sel, \
140 .otype = GPIO_OUTPUT_OPEN_DRAIN } \
141 }
148#define GPIO_INIT_ANALOG(gpio_bank, pin_num) \
149 { \
150 .bank = gpio_bank, \
151 .pin = pin_num, \
152 .type = GPIO_TYPE_ANALOG}
153
164#define GPIO_INIT_AF(gpio_bank, pin_num, alt_func_num, ospeed_sel, otype_sel, input_pull_sel) \
165 { \
166 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_AF, .config = {.af_num = alt_func_num, \
167 .ospeed = ospeed_sel, \
168 .otype = otype_sel, \
169 .pull = input_pull_sel } \
170 }
171
172/*
173 Useful defines for GPIO Init struct with commonly used peripheral/pin mappings.
174 If you find yourself adding the same pin mappings to multiple devices, add a macro below
175 to cut down on duplication.
176*/
177#ifdef STM32F407xx
178//CAN
179#define GPIO_INIT_CANRX_PD0 GPIO_INIT_AF(GPIOD, 0, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
180#define GPIO_INIT_CANTX_PD1 GPIO_INIT_AF(GPIOD, 1, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
181
182#define GPIO_INIT_CANRX_PA11 GPIO_INIT_AF(GPIOA, 11, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
183#define GPIO_INIT_CANTX_PA12 GPIO_INIT_AF(GPIOA, 12, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
184
185#define GPIO_INIT_CAN2RX_PB5 GPIO_INIT_AF(GPIOB, 5, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
186#define GPIO_INIT_CAN2TX_PB6 GPIO_INIT_AF(GPIOB, 6, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
187
188#define GPIO_INIT_CAN2RX_PB12 GPIO_INIT_AF(GPIOB, 12, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
189#define GPIO_INIT_CAN2TX_PB13 GPIO_INIT_AF(GPIOB, 13, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
190
191//SPI
192#define GPIO_INIT_SPI2_SCK_PB13 GPIO_INIT_AF(GPIOB, 13, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
193#define GPIO_INIT_SPI2_MISO_PB14 GPIO_INIT_AF(GPIOB, 14, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
194#define GPIO_INIT_SPI2_MOSI_PB15 GPIO_INIT_AF(GPIOB, 15, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
195
196#define GPIO_INIT_SPI2_MISO_PC2 GPIO_INIT_AF(GPIOC, 2, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
197#define GPIO_INIT_SPI2_MOSI_PC3 GPIO_INIT_AF(GPIOC, 3, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
198#define GPIO_INIT_SPI1_SCK_PB3 GPIO_INIT_AF(GPIOB, 3, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
199#define GPIO_INIT_SPI2_MISO_PB4 GPIO_INIT_AF(GPIOB, 4, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
200#define GPIO_INIT_SPI1_MOSI_PB5 GPIO_INIT_AF(GPIOB, 5, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
201
202#define GPIO_INIT_SPI1_SCK_PA5 GPIO_INIT_AF(GPIOA, 5, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
203#define GPIO_INIT_SPI1_MISO_PA6 GPIO_INIT_AF(GPIOA, 6, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
204#define GPIO_INIT_SPI1_MOSI_PA7 GPIO_INIT_AF(GPIOA, 7, 5, GPIO_OUTPUT_HIGH_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_DOWN)
205
206//UART/USART
207#define GPIO_INIT_USART3TX_PC10 GPIO_INIT_AF(GPIOC, 10, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
208#define GPIO_INIT_USART3RX_PC11 GPIO_INIT_AF(GPIOC, 11, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
209
210#define GPIO_INIT_USART2TX_PA2 GPIO_INIT_AF(GPIOA, 2, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
211#define GPIO_INIT_USART2RX_PA3 GPIO_INIT_AF(GPIOA, 3, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
212
213#define GPIO_INIT_USART1TX_PA9 GPIO_INIT_AF(GPIOA, 9, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
214#define GPIO_INIT_USART1RX_PA10 GPIO_INIT_AF(GPIOA, 10, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
215
216#define GPIO_INIT_USART2TX_PD5 GPIO_INIT_AF(GPIOD, 5, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
217#define GPIO_INIT_USART2RX_PD6 GPIO_INIT_AF(GPIOD, 6, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
218
219#define GPIO_INIT_USART6TX_PC6 GPIO_INIT_AF(GPIOC, 6, 8, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
220#define GPIO_INIT_USART6RX_PC7 GPIO_INIT_AF(GPIOC, 7, 8, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
221#endif
222
223// SDIO
224#define GPIO_INIT_SDIO_CLK GPIO_INIT_AF(GPIOC, 12, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
225#define GPIO_INIT_SDIO_CMD GPIO_INIT_AF(GPIOD, 2, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
226#define GPIO_INIT_SDIO_DT0 GPIO_INIT_AF(GPIOC, 8, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
227#define GPIO_INIT_SDIO_DT1 GPIO_INIT_AF(GPIOC, 9, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
228#define GPIO_INIT_SDIO_DT2 GPIO_INIT_AF(GPIOC, 10, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
229#define GPIO_INIT_SDIO_DT3 GPIO_INIT_AF(GPIOC, 11, 12, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_PULL_UP)
230
231// MCO1 (AF0)
232#define GPIO_INIT_MCO1_PA8 GPIO_INIT_AF(GPIOA, 8, 0, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
233
234#ifdef STM32F732xx
235//CAN
236#define GPIO_INIT_CANRX_PA11 GPIO_INIT_AF(GPIOA, 11, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
237#define GPIO_INIT_CANTX_PA12 GPIO_INIT_AF(GPIOA, 12, 9, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
238
239//SPI
240
241// MCO1 (AF0)
242#define GPIO_INIT_MCO1_PA8 GPIO_INIT_AF(GPIOA, 8, 0, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
243
244//UART/USART
245#define GPIO_INIT_UART4TX_PA0 GPIO_INIT_AF(GPIOA, 0, 8, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
246#define GPIO_INIT_UART4RX_PA1 GPIO_INIT_AF(GPIOA, 1, 8, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
247
248#define GPIO_INIT_USART1TX_PA9 GPIO_INIT_AF(GPIOA, 9, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
249#define GPIO_INIT_USART1RX_PA10 GPIO_INIT_AF(GPIOA, 10, 7, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_OPEN_DRAIN, GPIO_INPUT_OPEN_DRAIN)
250#endif
251
261bool PHAL_initGPIO(GPIOInitConfig_t config[], uint8_t config_len);
262
271static inline bool PHAL_readGPIO(GPIO_TypeDef* bank, uint8_t pin) {
272 return (bank->IDR >> pin) & 0b1;
273}
274
282static inline void PHAL_writeGPIO(GPIO_TypeDef* bank, uint8_t pin, bool value) {
283 bank->BSRR |= 1 << ((!value << 4) | pin); // BSRR has "set" as bottom 16 bits and "reset" as top 16
284}
285
286static inline void PHAL_toggleGPIO(GPIO_TypeDef* bank, uint8_t pin) {
287 PHAL_writeGPIO(bank, pin, !PHAL_readGPIO(bank, pin));
288}
289#endif
GPIOOutputPull_t
Output drive mode selection.
Definition gpio.h:75
GPIOPinType_t
Configuration type for GPIO Pin.
Definition gpio.h:55
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
GPIOInputPull_t
Enable internal pullup/down resistors.
Definition gpio.h:83
GPIOOutputSpeed_t
Slew rate control for output pins.
Definition gpio.h:65
GPIOOutputPull_t
Output drive mode selection.
Definition gpio.h:41
GPIOPinType_t
Configuration type for GPIO Pin.
Definition gpio.h:21
GPIOInputPull_t
Enable internal pullup/down resistors.
Definition gpio.h:49
GPIOOutputSpeed_t
Slew rate control for output pins.
Definition gpio.h:31
Configuration entry for GPIO initilization.
Definition gpio.h:93