1#include "stm32_gpio.hpp"
3#ifdef HAL_GPIO_MODULE_ENABLED
10static inline uint8_t STM32_GPIO_PinToLine(uint16_t pin)
12 ASSERT(pin != 0 && (pin & (pin - 1)) == 0);
13 const uint8_t LINE =
static_cast<uint8_t
>(__builtin_ctz(
static_cast<unsigned>(pin)));
18 : port_(port), pin_(pin), irq_(irq)
20 if (irq_ != NonMaskableInt_IRQn)
22 map[STM32_GPIO_PinToLine(pin)] =
this;
28 ASSERT(irq_ != NonMaskableInt_IRQn);
29 HAL_NVIC_EnableIRQ(irq_);
35 ASSERT(irq_ != NonMaskableInt_IRQn);
36 HAL_NVIC_DisableIRQ(irq_);
40static void STM32_GPIO_EXTI_Dispatch(uint16_t pin)
42 const uint8_t LINE = STM32_GPIO_PinToLine(pin);
43 if (
auto* gpio = STM32GPIO::map[LINE])
45 gpio->callback_.Run(
true);
49extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
51 STM32_GPIO_EXTI_Dispatch(GPIO_Pin);
54extern "C" void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
56 STM32_GPIO_EXTI_Dispatch(GPIO_Pin);
59extern "C" void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
61 STM32_GPIO_EXTI_Dispatch(GPIO_Pin);
STM32 GPIO 驱动实现 / STM32 GPIO driver implementation.
STM32GPIO(GPIO_TypeDef *port, uint16_t pin, IRQn_Type irq=NonMaskableInt_IRQn)
构造 GPIO 对象 / Construct GPIO object
ErrorCode DisableInterrupt()
禁用 GPIO 引脚中断 / Disables the GPIO pin interrupt.
ErrorCode EnableInterrupt()
使能 GPIO 引脚中断 / Enables the GPIO pin interrupt.
LibXR 命名空间 / LibXR namespace.
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ OK
操作成功 / Operation successful