libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_gpio.hpp
1#pragma once
2
3#include "gpio.hpp"
4#include "main.h"
5
6#ifdef HAL_GPIO_MODULE_ENABLED
7
8typedef enum
9{
10#if defined(STM32F0) || defined(STM32G0) || defined(STM32L0)
11 STM32_GPIO_EXTI_0_1,
12 STM32_GPIO_EXTI_2_3,
13 STM32_GPIO_EXTI_4_15,
14#elif defined(STM32WB0)
15 STM32_GPIO_EXTI_GPIOA,
16 STM32_GPIO_EXTI_GPIOB,
17#else
18 STM32_GPIO_EXTI_0,
19 STM32_GPIO_EXTI_1,
20 STM32_GPIO_EXTI_2,
21 STM32_GPIO_EXTI_3,
22 STM32_GPIO_EXTI_4,
23 STM32_GPIO_EXTI_5_9,
24 STM32_GPIO_EXTI_10_15,
25#endif
26 STM32_GPIO_EXTI_NUMBER
27} stm32_gpio_exti_t;
28
29stm32_gpio_exti_t STM32_GPIO_EXTI_GetID(uint16_t pin); // NOLINT
30
31namespace LibXR
32{
33class STM32GPIO final : public GPIO
34{
35 public:
36 STM32GPIO(GPIO_TypeDef* port, uint16_t pin, IRQn_Type irq = NonMaskableInt_IRQn);
37
38 inline bool Read() { return (port_->IDR & pin_) != 0u; }
39
40 inline void Write(bool value)
41 {
42 if (value)
43 {
44 port_->BSRR = static_cast<uint32_t>(pin_);
45 }
46 else
47 {
48 port_->BSRR = static_cast<uint32_t>(pin_) << 16;
49 }
50 }
51
52 ErrorCode EnableInterrupt();
53
54 ErrorCode DisableInterrupt();
55
56 inline ErrorCode SetConfig(Configuration config)
57 {
58// LL快速路径,适用于非外部中断的输入/输出配置
59#ifdef USE_FULL_LL_DRIVER
60 if (static_cast<uint8_t>(config.direction) <=
62 {
63 LL_GPIO_InitTypeDef ll = {};
64 ll.Pin = pin_;
65 ll.Speed = LL_GPIO_SPEED_FREQ_HIGH;
66
67 // Pull
68 switch (config.pull)
69 {
70 case Pull::NONE:
71 ll.Pull = LL_GPIO_PULL_NO;
72 break;
73 case Pull::UP:
74 ll.Pull = LL_GPIO_PULL_UP;
75 break;
76 case Pull::DOWN:
77 ll.Pull = LL_GPIO_PULL_DOWN;
78 break;
79 default:
80 ll.Pull = LL_GPIO_PULL_NO;
81 break;
82 }
83
84 // Mode + OutputType
85 switch (config.direction)
86 {
88 ll.Mode = LL_GPIO_MODE_INPUT;
89 break;
90
92 ll.Mode = LL_GPIO_MODE_OUTPUT;
93 ll.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
94 break;
95
97 ll.Mode = LL_GPIO_MODE_OUTPUT;
98 ll.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
99 break;
100
101 default:
102 return ErrorCode::ARG_ERR;
103 }
104
105 LL_GPIO_Init(port_, &ll);
106
107 return ErrorCode::OK;
108 }
109#endif
110
111 GPIO_InitTypeDef gpio_init = {};
112
113 gpio_init.Pin = pin_;
114
115 switch (config.direction)
116 {
117 case Direction::INPUT:
118 gpio_init.Mode = GPIO_MODE_INPUT;
119 break;
121 gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
122 break;
124 gpio_init.Mode = GPIO_MODE_OUTPUT_OD;
125 break;
127 gpio_init.Mode = GPIO_MODE_IT_FALLING;
128 break;
130 gpio_init.Mode = GPIO_MODE_IT_RISING;
131 break;
133 gpio_init.Mode = GPIO_MODE_IT_RISING_FALLING;
134 break;
135 }
136
137 switch (config.pull)
138 {
139 case Pull::NONE:
140 gpio_init.Pull = GPIO_NOPULL;
141 break;
142 case Pull::UP:
143 gpio_init.Pull = GPIO_PULLUP;
144 break;
145 case Pull::DOWN:
146 gpio_init.Pull = GPIO_PULLDOWN;
147 break;
148 }
149
150 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
151
152 HAL_GPIO_Init(port_, &gpio_init);
153
154 return ErrorCode::OK;
155 }
156
157 static STM32GPIO* map[STM32_GPIO_EXTI_NUMBER]; // NOLINT
158
159 private:
160 GPIO_TypeDef* port_;
161 uint16_t pin_;
162 IRQn_Type irq_;
163};
164
165} // namespace LibXR
166
167#endif
通用输入输出(GPIO)接口类。General Purpose Input/Output (GPIO) interface class.
Definition gpio.hpp:13
@ 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.
bool Read()
读取 GPIO 引脚状态。Reads the GPIO pin state.
ErrorCode SetConfig(Configuration config)
配置 GPIO 引脚参数。Configures the GPIO pin settings.
void Write(bool value)
写入 GPIO 引脚状态。Writes the GPIO pin state.
ErrorCode DisableInterrupt()
禁用 GPIO 引脚中断。Disables the GPIO pin interrupt.
ErrorCode EnableInterrupt()
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.
LibXR 命名空间
存储 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