PER Firmware
Loading...
Searching...
No Matches
gpio_priv.h
Go to the documentation of this file.
1
6#ifndef PHAL_G4_GPIO_PRIV_H
7#define PHAL_G4_GPIO_PRIV_H
8
10
11// GPIO config registers (MODER, OSPEEDR, OTYPER, PUPDR, AFR) pack one fixed-width
12// field per pin, back-to-back starting at pin 0
13static constexpr uint32_t GPIO_PRIV_MODER_FIELD_BITS = 2U;
14static constexpr uint32_t GPIO_PRIV_OSPEEDR_FIELD_BITS = 2U;
15static constexpr uint32_t GPIO_PRIV_OTYPER_FIELD_BITS = 1U;
16static constexpr uint32_t GPIO_PRIV_PUPDR_FIELD_BITS = 2U;
17static constexpr uint32_t GPIO_PRIV_AFR_FIELD_BITS = 4U;
18
19// GPIOA-GPIOG sit back-to-back with each taking this many bytes of register space
20static constexpr uint32_t GPIO_PRIV_PORT_STRIDE = 0x400U;
21
22// Indexed by (bank_base - GPIOA_BASE) / GPIO_PRIV_PORT_STRIDE
23// Each entry is the actual RCC enable bit for that port
24static constexpr uint32_t GPIO_PRIV_RCC_ENABLE_BITS[] = {
25 RCC_AHB2ENR_GPIOAEN,
26 RCC_AHB2ENR_GPIOBEN,
27 RCC_AHB2ENR_GPIOCEN,
28 RCC_AHB2ENR_GPIODEN,
29 RCC_AHB2ENR_GPIOEEN,
30 RCC_AHB2ENR_GPIOFEN,
31 RCC_AHB2ENR_GPIOGEN,
32};
33static constexpr uint32_t GPIO_PRIV_NUM_PORTS = sizeof(GPIO_PRIV_RCC_ENABLE_BITS) / sizeof(GPIO_PRIV_RCC_ENABLE_BITS[0]);
34
35
40bool PHAL_GPIO_priv_enableClock(GPIO_TypeDef *bank);
41
43void PHAL_GPIO_priv_setMode(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_PinType_t type);
44
46void PHAL_GPIO_priv_setOutputSpeed(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_OutputSpeed_t speed);
47
49void PHAL_GPIO_priv_setOutputType(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_OutputPull_t otype);
50
52void PHAL_GPIO_priv_setPull(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_InputPull_t pull);
53
55void PHAL_GPIO_priv_setAltFunction(GPIO_TypeDef *bank, uint8_t pin, uint8_t af_num);
56
57
59bool PHAL_GPIO_priv_read(const GPIO_TypeDef *bank, uint8_t pin);
60
62void PHAL_GPIO_priv_write(GPIO_TypeDef *bank, uint8_t pin, bool value);
63
65void PHAL_GPIO_priv_toggle(GPIO_TypeDef *bank, uint8_t pin);
66
67
68static_assert(GPIO_MODER_MODE1_Pos - GPIO_MODER_MODE0_Pos == GPIO_PRIV_MODER_FIELD_BITS,
69 "MODER field width doesn't match GPIO_PRIV_MODER_FIELD_BITS");
70static_assert(GPIO_OSPEEDR_OSPEED1_Pos - GPIO_OSPEEDR_OSPEED0_Pos == GPIO_PRIV_OSPEEDR_FIELD_BITS,
71 "OSPEEDR field width doesn't match GPIO_PRIV_OSPEEDR_FIELD_BITS");
72static_assert(GPIO_OTYPER_OT1_Pos - GPIO_OTYPER_OT0_Pos == GPIO_PRIV_OTYPER_FIELD_BITS,
73 "OTYPER field width doesn't match GPIO_PRIV_OTYPER_FIELD_BITS");
74static_assert(GPIO_PUPDR_PUPD1_Pos - GPIO_PUPDR_PUPD0_Pos == GPIO_PRIV_PUPDR_FIELD_BITS,
75 "PUPDR field width doesn't match GPIO_PRIV_PUPDR_FIELD_BITS");
76static_assert(GPIO_AFRL_AFSEL1_Pos - GPIO_AFRL_AFSEL0_Pos == GPIO_PRIV_AFR_FIELD_BITS,
77 "AFR field width doesn't match GPIO_PRIV_AFR_FIELD_BITS");
78
79static_assert(GPIOB_BASE - GPIOA_BASE == GPIO_PRIV_PORT_STRIDE, "GPIO port base address spacing changed");
80static_assert(GPIOC_BASE - GPIOB_BASE == GPIO_PRIV_PORT_STRIDE, "GPIO port base address spacing changed");
81static_assert(GPIOD_BASE - GPIOC_BASE == GPIO_PRIV_PORT_STRIDE, "GPIO port base address spacing changed");
82static_assert(GPIOE_BASE - GPIOD_BASE == GPIO_PRIV_PORT_STRIDE, "GPIO port base address spacing changed");
83static_assert(GPIOF_BASE - GPIOE_BASE == GPIO_PRIV_PORT_STRIDE, "GPIO port base address spacing changed");
84static_assert(GPIOG_BASE - GPIOF_BASE == GPIO_PRIV_PORT_STRIDE, "GPIO port base address spacing changed");
85
86#endif // PHAL_G4_GPIO_PRIV_H
static constexpr uint32_t GPIO_PRIV_PUPDR_FIELD_BITS
Definition gpio_priv.h:16
static constexpr uint32_t GPIO_PRIV_AFR_FIELD_BITS
Definition gpio_priv.h:17
void PHAL_GPIO_priv_toggle(GPIO_TypeDef *bank, uint8_t pin)
Read then invert pin via BSRR. Caller must have validated pin <= 15.
Definition gpio_priv.c:134
bool PHAL_GPIO_priv_read(const GPIO_TypeDef *bank, uint8_t pin)
Read IDR's bit for pin. Caller must have validated pin <= 15.
Definition gpio_priv.c:118
static constexpr uint32_t GPIO_PRIV_MODER_FIELD_BITS
Definition gpio_priv.h:13
void PHAL_GPIO_priv_setAltFunction(GPIO_TypeDef *bank, uint8_t pin, uint8_t af_num)
Set AFR's field for pin. Caller must have validated pin <= 15.
Definition gpio_priv.c:108
static constexpr uint32_t GPIO_PRIV_PORT_STRIDE
Definition gpio_priv.h:20
void PHAL_GPIO_priv_setPull(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_InputPull_t pull)
Set PUPDR's field for pin. Caller must have validated pin <= 15.
Definition gpio_priv.c:101
static constexpr uint32_t GPIO_PRIV_RCC_ENABLE_BITS[]
Definition gpio_priv.h:24
void PHAL_GPIO_priv_setOutputSpeed(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_OutputSpeed_t speed)
Set OSPEEDR's field for pin. Caller must have validated pin <= 15.
Definition gpio_priv.c:85
static constexpr uint32_t GPIO_PRIV_NUM_PORTS
Definition gpio_priv.h:33
void PHAL_GPIO_priv_write(GPIO_TypeDef *bank, uint8_t pin, bool value)
Write BSRR to atomically set/reset pin. Caller must have validated pin <= 15.
Definition gpio_priv.c:123
bool PHAL_GPIO_priv_enableClock(GPIO_TypeDef *bank)
Enable the AHB2 clock for bank's port (GPIOA-GPIOG).
Definition gpio_priv.c:59
static constexpr uint32_t GPIO_PRIV_OSPEEDR_FIELD_BITS
Definition gpio_priv.h:14
void PHAL_GPIO_priv_setMode(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_PinType_t type)
Set MODER's field for pin to type. Caller must have validated pin <= 15.
Definition gpio_priv.c:77
void PHAL_GPIO_priv_setOutputType(GPIO_TypeDef *bank, uint8_t pin, PHAL_GPIO_OutputPull_t otype)
Set OTYPER's field for pin. Caller must have validated pin <= 15.
Definition gpio_priv.c:93
static constexpr uint32_t GPIO_PRIV_OTYPER_FIELD_BITS
Definition gpio_priv.h:15
G4 GPIO public API.
PHAL_GPIO_OutputSpeed_t
Output pin slew rate / maximum toggle frequency.
Definition gpio.h:29
PHAL_GPIO_PinType_t
GPIO pin mode.
Definition gpio.h:19
PHAL_GPIO_InputPull_t
Input pin pull-up/pull-down resistor selection.
Definition gpio.h:46
PHAL_GPIO_OutputPull_t
Output pin drive type.
Definition gpio.h:38