16#include "common/phal_F4_F7/phal_F4_F7.h"
18#if defined(STM32F407xx)
19#elif defined(STM32F732xx)
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
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
30#define GPIO_PUPDR_PUPD0_Msk GPIO_PUPDR_PUPDR0_Msk
32#define GPIO_PUPDR_PUPD0_Pos GPIO_PUPDR_PUPDR0_Pos
33#define GPIO_PUPDR_PUPD1_Pos GPIO_PUPDR_PUPDR1_Pos
36#define GPIO_OSPEEDR_OSPEED0_Msk GPIO_OSPEEDR_OSPEEDR0_Msk
37#define GPIO_OSPEEDR_OSPEED1_Msk GPIO_OSPEEDR_OSPEEDR1_Msk
39#define GPIO_OSPEEDR_OSPEED0_Pos GPIO_OSPEEDR_OSPEEDR0_Pos
40#define GPIO_OSPEEDR_OSPEED1_Pos GPIO_OSPEEDR_OSPEEDR1_Pos
43#define GPIO_MODER_MODE0_Msk GPIO_MODER_MODER0_Msk
44#define GPIO_MODER_MODE1_Msk GPIO_MODER_MODER1_Msk
46#define GPIO_MODER_MODE0_Pos GPIO_MODER_MODER0_Pos
47#define GPIO_MODER_MODE1_Pos GPIO_MODER_MODER1_Pos
49#error "Please define a MCU arch"
56 GPIO_TYPE_INPUT = 0b00,
57 GPIO_TYPE_OUTPUT = 0b01,
59 GPIO_TYPE_ANALOG = 0b11,
66 GPIO_OUTPUT_LOW_SPEED = 0b00,
67 GPIO_OUTPUT_MED_SPEED = 0b01,
68 GPIO_OUTPUT_HIGH_SPEED = 0b10,
69 GPIO_OUTPUT_ULTRA_SPEED = 0b11,
76 GPIO_OUTPUT_PUSH_PULL = 0b0,
77 GPIO_OUTPUT_OPEN_DRAIN = 0b1,
84 GPIO_INPUT_OPEN_DRAIN = 0b00,
85 GPIO_INPUT_PULL_UP = 0b01,
86 GPIO_INPUT_PULL_DOWN = 0b10,
119#define GPIO_INIT_INPUT(gpio_bank, pin_num, input_pull_sel) \
121 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_INPUT, .config = {.pull = input_pull_sel } \
131#define GPIO_INIT_OUTPUT(gpio_bank, pin_num, ospeed_sel) \
133 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_OUTPUT, .config = {.ospeed = ospeed_sel, \
134 .otype = GPIO_OUTPUT_PUSH_PULL } \
137#define GPIO_INIT_OUTPUT_OPEN_DRAIN(gpio_bank, pin_num, ospeed_sel) \
139 .bank = gpio_bank, .pin = pin_num, .type = GPIO_TYPE_OUTPUT, .config = {.ospeed = ospeed_sel, \
140 .otype = GPIO_OUTPUT_OPEN_DRAIN } \
148#define GPIO_INIT_ANALOG(gpio_bank, pin_num) \
152 .type = GPIO_TYPE_ANALOG}
164#define GPIO_INIT_AF(gpio_bank, pin_num, alt_func_num, ospeed_sel, otype_sel, input_pull_sel) \
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 } \
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
232#define GPIO_INIT_MCO1_PA8 GPIO_INIT_AF(GPIOA, 8, 0, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
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)
242#define GPIO_INIT_MCO1_PA8 GPIO_INIT_AF(GPIOA, 8, 0, GPIO_OUTPUT_ULTRA_SPEED, GPIO_OUTPUT_PUSH_PULL, GPIO_INPUT_OPEN_DRAIN)
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)
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)
271static inline bool PHAL_readGPIO(GPIO_TypeDef* bank, uint8_t pin) {
272 return (bank->IDR >> pin) & 0b1;
282static inline void PHAL_writeGPIO(GPIO_TypeDef* bank, uint8_t pin,
bool value) {
283 bank->BSRR |= 1 << ((!value << 4) | pin);
286static inline void PHAL_toggleGPIO(GPIO_TypeDef* bank, uint8_t pin) {
287 PHAL_writeGPIO(bank, pin, !PHAL_readGPIO(bank, pin));
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