89 const bool IS_NON_IRQ_DIRECTION =
93 if (IS_NON_IRQ_DIRECTION)
95 const uint32_t PIN_POS =
static_cast<uint32_t
>(__builtin_ctz(pin_));
97#if XR_STM32_GPIO_HAS_F1_LAYOUT
99 volatile uint32_t* cr = (PIN_POS < 8u) ? &port_->CRL : &port_->CRH;
100 const uint32_t SHIFT = (PIN_POS & 0x7u) * 4u;
101 uint32_t mode_cnf = 0u;
111 port_->BSRR =
static_cast<uint32_t
>(pin_);
115 port_->BSRR =
static_cast<uint32_t
>(pin_) << 16u;
136 reg &= ~(0xFu << SHIFT);
137 reg |= (mode_cnf << SHIFT);
141#elif XR_STM32_GPIO_HAS_MODER_LAYOUT
144 const uint32_t SHIFT = PIN_POS * 2u;
145 const uint32_t MASK2 = 0x3u << SHIFT;
147 uint32_t moder = port_->MODER;
151 moder |= (0x1u << SHIFT);
153 port_->MODER = moder;
157 const uint32_t PIN_MASK = 0x1u << PIN_POS;
160 port_->OTYPER |= PIN_MASK;
164 port_->OTYPER &= ~PIN_MASK;
167#if XR_STM32_GPIO_HAS_OSPEEDR
168 uint32_t ospeedr = port_->OSPEEDR;
170 ospeedr |= (0x3u << SHIFT);
171 port_->OSPEEDR = ospeedr;
175 uint32_t pupdr = port_->PUPDR;
179 pupdr |= (0x1u << SHIFT);
183 pupdr |= (0x2u << SHIFT);
185 port_->PUPDR = pupdr;
190 GPIO_InitTypeDef gpio_init = {};
192 gpio_init.Pin = pin_;
197 gpio_init.Mode = GPIO_MODE_INPUT;
200 gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
203 gpio_init.Mode = GPIO_MODE_OUTPUT_OD;
206 gpio_init.Mode = GPIO_MODE_IT_FALLING;
209 gpio_init.Mode = GPIO_MODE_IT_RISING;
212 gpio_init.Mode = GPIO_MODE_IT_RISING_FALLING;
219 gpio_init.Pull = GPIO_NOPULL;
222 gpio_init.Pull = GPIO_PULLUP;
225 gpio_init.Pull = GPIO_PULLDOWN;
229 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
231 HAL_GPIO_Init(port_, &gpio_init);