87 const bool IS_NON_IRQ_DIRECTION =
91 if (IS_NON_IRQ_DIRECTION)
93 const uint32_t PIN_POS =
static_cast<uint32_t
>(__builtin_ctz(pin_));
95#if XR_STM32_GPIO_HAS_F1_LAYOUT
97 volatile uint32_t* cr = (PIN_POS < 8u) ? &port_->CRL : &port_->CRH;
98 const uint32_t SHIFT = (PIN_POS & 0x7u) * 4u;
99 uint32_t mode_cnf = 0u;
109 port_->BSRR =
static_cast<uint32_t
>(pin_);
113 port_->BSRR =
static_cast<uint32_t
>(pin_) << 16u;
134 reg &= ~(0xFu << SHIFT);
135 reg |= (mode_cnf << SHIFT);
139#elif XR_STM32_GPIO_HAS_MODER_LAYOUT
142 const uint32_t SHIFT = PIN_POS * 2u;
143 const uint32_t MASK2 = 0x3u << SHIFT;
145 uint32_t moder = port_->MODER;
149 moder |= (0x1u << SHIFT);
151 port_->MODER = moder;
155 const uint32_t PIN_MASK = 0x1u << PIN_POS;
158 port_->OTYPER |= PIN_MASK;
162 port_->OTYPER &= ~PIN_MASK;
165#if XR_STM32_GPIO_HAS_OSPEEDR
166 uint32_t ospeedr = port_->OSPEEDR;
168 ospeedr |= (0x3u << SHIFT);
169 port_->OSPEEDR = ospeedr;
173 uint32_t pupdr = port_->PUPDR;
177 pupdr |= (0x1u << SHIFT);
181 pupdr |= (0x2u << SHIFT);
183 port_->PUPDR = pupdr;
188 GPIO_InitTypeDef gpio_init = {};
190 gpio_init.Pin = pin_;
195 gpio_init.Mode = GPIO_MODE_INPUT;
198 gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
201 gpio_init.Mode = GPIO_MODE_OUTPUT_OD;
204 gpio_init.Mode = GPIO_MODE_IT_FALLING;
207 gpio_init.Mode = GPIO_MODE_IT_RISING;
210 gpio_init.Mode = GPIO_MODE_IT_RISING_FALLING;
217 gpio_init.Pull = GPIO_NOPULL;
220 gpio_init.Pull = GPIO_PULLUP;
223 gpio_init.Pull = GPIO_PULLDOWN;
227 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
229 HAL_GPIO_Init(port_, &gpio_init);