libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_gpio.cpp
1#include "stm32_gpio.hpp"
2
3#ifdef HAL_GPIO_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32GPIO* STM32GPIO::map[STM32_GPIO_EXTI_NUMBER] = {nullptr};
8
15stm32_gpio_exti_t STM32_GPIO_EXTI_GetID(uint16_t pin)
16{ // NOLINT
17 uint8_t pin_num = __builtin_ctz(pin);
18
19 if (pin == 0 || pin_num > 15)
20 {
21 ASSERT(false);
22 return STM32_GPIO_EXTI_NUMBER;
23 }
24
25#if defined(STM32F0) || defined(STM32G0) || defined(STM32L0)
26 if (pin_num <= 1)
27 {
28 return STM32_GPIO_EXTI_0_1;
29 }
30 else if (pin_num <= 3)
31 {
32 return STM32_GPIO_EXTI_2_3;
33 }
34 else
35 {
36 return STM32_GPIO_EXTI_4_15;
37 }
38
39#else
40 if (pin_num <= 4)
41 {
42 return static_cast<stm32_gpio_exti_t>(pin_num);
43 }
44 else if (pin_num <= 9)
45 {
46 return STM32_GPIO_EXTI_5_9;
47 }
48 else
49 {
50 return STM32_GPIO_EXTI_10_15;
51 }
52
53#endif
54
55 return STM32_GPIO_EXTI_NUMBER;
56}
57
58STM32GPIO::STM32GPIO(GPIO_TypeDef* port, uint16_t pin, IRQn_Type irq)
59 : port_(port), pin_(pin), irq_(irq)
60{
61 if (irq_ != NonMaskableInt_IRQn)
62 {
63 map[STM32_GPIO_EXTI_GetID(pin)] = this;
64 }
65}
66
67bool STM32GPIO::Read() { return HAL_GPIO_ReadPin(port_, pin_) == GPIO_PIN_SET; }
68
69ErrorCode STM32GPIO::Write(bool value)
70{
71 HAL_GPIO_WritePin(port_, pin_, value ? GPIO_PIN_SET : GPIO_PIN_RESET);
72 return ErrorCode::OK;
73}
74
76{
77 ASSERT(irq_ != NonMaskableInt_IRQn);
78 HAL_NVIC_EnableIRQ(irq_);
79 return ErrorCode::OK;
80}
81
83{
84 ASSERT(irq_ != NonMaskableInt_IRQn);
85 HAL_NVIC_DisableIRQ(irq_);
86 return ErrorCode::OK;
87}
88
90{
91 GPIO_InitTypeDef gpio_init = {};
92
93 HAL_GPIO_DeInit(port_, pin_);
94
95 gpio_init.Pin = pin_;
96
97 switch (config.direction)
98 {
100 gpio_init.Mode = GPIO_MODE_INPUT;
101 break;
103 gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
104 break;
106 gpio_init.Mode = GPIO_MODE_OUTPUT_OD;
107 break;
109 gpio_init.Mode = GPIO_MODE_IT_FALLING;
110 break;
112 gpio_init.Mode = GPIO_MODE_IT_RISING;
113 break;
115 gpio_init.Mode = GPIO_MODE_IT_RISING_FALLING;
116 break;
117 }
118
119 switch (config.pull)
120 {
121 case Pull::NONE:
122 gpio_init.Pull = GPIO_NOPULL;
123 break;
124 case Pull::UP:
125 gpio_init.Pull = GPIO_PULLUP;
126 break;
127 case Pull::DOWN:
128 gpio_init.Pull = GPIO_PULLDOWN;
129 break;
130 }
131
132 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
133
134 HAL_GPIO_Init(port_, &gpio_init);
135
136 return ErrorCode::OK;
137}
138
139extern "C" void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
140{
141 auto id = STM32_GPIO_EXTI_GetID(GPIO_Pin);
142 auto gpio = STM32GPIO::map[id];
143
144 if (gpio)
145 {
146 gpio->callback_.Run(true);
147 }
148}
149
150#endif
@ 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.
@ INPUT
输入模式。Input mode.
@ FALL_INTERRUPT
下降沿中断模式。Falling edge interrupt mode.
@ NONE
无上拉或下拉。No pull-up or pull-down.
@ DOWN
下拉模式。Pull-down mode.
@ UP
上拉模式。Pull-up 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.
LibXR 命名空间
Definition ch32_gpio.hpp:9
存储 GPIO 配置参数的结构体。Structure storing GPIO configuration parameters.
Definition gpio.hpp:46
Pull pull
GPIO 上拉/下拉配置。GPIO pull-up/pull-down configuration.
Definition gpio.hpp:48
Direction direction
GPIO 引脚方向。GPIO pin direction.
Definition gpio.hpp:47