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 : public GPIO
34{
35 public:
36 STM32GPIO(GPIO_TypeDef* port, uint16_t pin, IRQn_Type irq = NonMaskableInt_IRQn)
37 : port_(port), pin_(pin), irq_(irq)
38 {
39 if (irq_ != NonMaskableInt_IRQn)
40 {
41 map[STM32_GPIO_EXTI_GetID(pin)] = this;
42 }
43 }
44
45 bool Read() { return HAL_GPIO_ReadPin(port_, pin_) == GPIO_PIN_SET; }
46
47 ErrorCode Write(bool value)
48 {
49 HAL_GPIO_WritePin(port_, pin_, value ? GPIO_PIN_SET : GPIO_PIN_RESET);
50 return ErrorCode::OK;
51 }
52
53 ErrorCode EnableInterrupt()
54 {
55 ASSERT(irq_ != NonMaskableInt_IRQn);
56 HAL_NVIC_EnableIRQ(irq_);
57 return ErrorCode::OK;
58 }
59
60 ErrorCode DisableInterrupt()
61 {
62 ASSERT(irq_ != NonMaskableInt_IRQn);
63 HAL_NVIC_DisableIRQ(irq_);
64 return ErrorCode::OK;
65 }
66
67 ErrorCode SetConfig(Configuration config)
68 {
69 GPIO_InitTypeDef gpio_init = {};
70
71 HAL_GPIO_DeInit(port_, pin_);
72
73 gpio_init.Pin = pin_;
74
75 switch (config.direction)
76 {
78 gpio_init.Mode = GPIO_MODE_INPUT;
79 break;
81 gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
82 break;
84 gpio_init.Mode = GPIO_MODE_OUTPUT_OD;
85 break;
87 gpio_init.Mode = GPIO_MODE_IT_FALLING;
88 break;
90 gpio_init.Mode = GPIO_MODE_IT_RISING;
91 break;
93 gpio_init.Mode = GPIO_MODE_IT_RISING_FALLING;
94 break;
95 }
96
97 switch (config.pull)
98 {
99 case Pull::NONE:
100 gpio_init.Pull = GPIO_NOPULL;
101 break;
102 case Pull::UP:
103 gpio_init.Pull = GPIO_PULLUP;
104 break;
105 case Pull::DOWN:
106 gpio_init.Pull = GPIO_PULLDOWN;
107 break;
108 }
109
110 gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
111
112 HAL_GPIO_Init(port_, &gpio_init);
113
114 return ErrorCode::OK;
115 }
116
117 static STM32GPIO* map[STM32_GPIO_EXTI_NUMBER]; // NOLINT
118
119 private:
120 GPIO_TypeDef* port_;
121 uint16_t pin_;
122 IRQn_Type irq_;
123};
124
125} // namespace LibXR
126
127#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.
ErrorCode Write(bool value)
写入 GPIO 引脚状态。Writes the GPIO pin state.
ErrorCode EnableInterrupt()
使能 GPIO 引脚中断。Enables the GPIO pin interrupt.
ErrorCode DisableInterrupt()
禁用 GPIO 引脚中断。Disables 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