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;
71 HAL_GPIO_WritePin(port_, pin_, value ? GPIO_PIN_SET : GPIO_PIN_RESET);
77 ASSERT(irq_ != NonMaskableInt_IRQn);
78 HAL_NVIC_EnableIRQ(irq_);
84 ASSERT(irq_ != NonMaskableInt_IRQn);
85 HAL_NVIC_DisableIRQ(irq_);
91 GPIO_InitTypeDef gpio_init = {};
93 HAL_GPIO_DeInit(port_, pin_);
100 gpio_init.Mode = GPIO_MODE_INPUT;
103 gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
106 gpio_init.Mode = GPIO_MODE_OUTPUT_OD;
109 gpio_init.Mode = GPIO_MODE_IT_FALLING;
112 gpio_init.Mode = GPIO_MODE_IT_RISING;
115 gpio_init.Mode = GPIO_MODE_IT_RISING_FALLING;
122 gpio_init.Pull = GPIO_NOPULL;
125 gpio_init.Pull = GPIO_PULLUP;
128 gpio_init.Pull = GPIO_PULLDOWN;
132 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
134 HAL_GPIO_Init(port_, &gpio_init);
136 return ErrorCode::OK;
139extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
141 auto id = STM32_GPIO_EXTI_GetID(GPIO_Pin);
142 auto gpio = STM32GPIO::map[id];
146 gpio->callback_.Run(
true);
@ OUTPUT_PUSH_PULL
推挽输出模式。Push-pull output mode.
@ RISING_INTERRUPT
上升沿中断模式。Rising edge interrupt mode.
@ FALL_RISING_INTERRUPT
双沿触发中断模式。Both edge interrupt mode.
@ OUTPUT_OPEN_DRAIN
开漏输出模式。Open-drain output mode.
@ FALL_INTERRUPT
下降沿中断模式。Falling edge interrupt mode.
@ NONE
无上拉或下拉。No pull-up or pull-down.
@ DOWN
下拉模式。Pull-down mode.
ErrorCode Write(bool value)
写入 GPIO 引脚状态。Writes the GPIO pin state.
bool Read()
读取 GPIO 引脚状态。Reads the GPIO pin state.
ErrorCode DisableInterrupt()
禁用 GPIO 引脚中断。Disables the GPIO pin interrupt.
ErrorCode SetConfig(Configuration config)
配置 GPIO 引脚参数。Configures the GPIO pin settings.
ErrorCode EnableInterrupt()
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.
存储 GPIO 配置参数的结构体。Structure storing GPIO configuration parameters.
Pull pull
GPIO 上拉/下拉配置。GPIO pull-up/pull-down configuration.
Direction direction
GPIO 引脚方向。GPIO pin direction.