1#include "stm32_gpio.hpp"
3#ifdef HAL_GPIO_MODULE_ENABLED
7STM32GPIO* STM32GPIO::map[STM32_GPIO_EXTI_NUMBER] = {
nullptr};
15stm32_gpio_exti_t STM32_GPIO_EXTI_GetID(uint16_t pin)
17 uint8_t pin_num = __builtin_ctz(pin);
19 if (pin == 0 || pin_num > 15)
22 return STM32_GPIO_EXTI_NUMBER;
25#if defined(STM32F0) || defined(STM32G0) || defined(STM32L0)
28 return STM32_GPIO_EXTI_0_1;
30 else if (pin_num <= 3)
32 return STM32_GPIO_EXTI_2_3;
36 return STM32_GPIO_EXTI_4_15;
42 return static_cast<stm32_gpio_exti_t
>(pin_num);
44 else if (pin_num <= 9)
46 return STM32_GPIO_EXTI_5_9;
50 return STM32_GPIO_EXTI_10_15;
55 return STM32_GPIO_EXTI_NUMBER;
58STM32GPIO::STM32GPIO(GPIO_TypeDef* port, uint16_t pin, IRQn_Type irq)
59 : port_(port), pin_(pin), irq_(irq)
61 if (irq_ != NonMaskableInt_IRQn)
63 map[STM32_GPIO_EXTI_GetID(pin)] =
this;
69 ASSERT(irq_ != NonMaskableInt_IRQn);
70 HAL_NVIC_EnableIRQ(irq_);
76 ASSERT(irq_ != NonMaskableInt_IRQn);
77 HAL_NVIC_DisableIRQ(irq_);
81extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
83 auto id = STM32_GPIO_EXTI_GetID(GPIO_Pin);
84 auto gpio = STM32GPIO::map[id];
88 gpio->callback_.Run(
true);
ErrorCode DisableInterrupt()
禁用 GPIO 引脚中断。Disables the GPIO pin interrupt.
ErrorCode EnableInterrupt()
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.