libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
LibXR::CH32GPIO Class Referencefinal

CH32 GPIO 驱动实现 / CH32 GPIO driver implementation. More...

#include <ch32_gpio.hpp>

Inheritance diagram for LibXR::CH32GPIO:
[legend]
Collaboration diagram for LibXR::CH32GPIO:
[legend]

Public Member Functions

 CH32GPIO (GPIO_TypeDef *port, uint16_t pin, GPIO::Direction direction=GPIO::Direction::OUTPUT_PUSH_PULL, GPIO::Pull pull=GPIO::Pull::NONE, IRQn_Type irq=NonMaskableInt_IRQn)
 构造 GPIO 对象 / Construct GPIO object
 
bool Read () override
 读取 GPIO 引脚状态 / Reads the GPIO pin state.
 
void Write (bool value) override
 写入 GPIO 引脚状态 / Writes the GPIO pin state.
 
ErrorCode EnableInterrupt () override
 使能 GPIO 引脚中断 / Enables the GPIO pin interrupt.
 
ErrorCode DisableInterrupt () override
 禁用 GPIO 引脚中断 / Disables the GPIO pin interrupt.
 
ErrorCode SetConfig (Configuration config) override
 配置 GPIO 引脚参数 / Configures the GPIO pin settings.
 
void OnInterrupt ()
 
- Public Member Functions inherited from LibXR::GPIO
 GPIO ()
 默认构造函数 / Default constructor.
 
virtual ~GPIO ()=default
 虚析构函数 / Virtual destructor.
 
ErrorCode RegisterCallback (Callback callback)
 注册 GPIO 事件回调函数 / Registers a callback function for GPIO events.
 

Static Public Member Functions

static void CheckInterrupt (uint32_t line)
 

Static Public Attributes

static CH32GPIO * map_ [16] = {nullptr}
 EXTI 线路映射表 / EXTI line map.
 

Additional Inherited Members

- Public Types inherited from LibXR::GPIO
enum class  Direction : uint8_t {
  INPUT , OUTPUT_PUSH_PULL , OUTPUT_OPEN_DRAIN , FALL_INTERRUPT ,
  RISING_INTERRUPT , FALL_RISING_INTERRUPT
}
 定义 GPIO 引脚的方向类型 / Defines the direction types for GPIO pins. More...
 
enum class  Pull : uint8_t { NONE , UP , DOWN }
 定义 GPIO 引脚的上拉/下拉模式。 Defines the pull-up/pull-down configurations for GPIO pins. More...
 
using Callback = LibXR::Callback<>
 
- Public Attributes inherited from LibXR::GPIO
Callback callback_
 GPIO 事件的回调函数 / Callback function for GPIO events.
 

Detailed Description

CH32 GPIO 驱动实现 / CH32 GPIO driver implementation.

Definition at line 48 of file ch32_gpio.hpp.

Constructor & Destructor Documentation

◆ CH32GPIO()

CH32GPIO::CH32GPIO ( GPIO_TypeDef * port,
uint16_t pin,
GPIO::Direction direction = GPIO::Direction::OUTPUT_PUSH_PULL,
GPIO::Pull pull = GPIO::Pull::NONE,
IRQn_Type irq = NonMaskableInt_IRQn )

构造 GPIO 对象 / Construct GPIO object

Definition at line 95 of file ch32_gpio.cpp.

97 : port_(port), pin_(pin), irq_(irq)
98{
99 if (irq_ != NonMaskableInt_IRQn)
100 {
101 map_[GetEXTIID(pin)] = this;
102 }
103
104 RCC_APB2PeriphClockCmd(ch32_get_gpio_periph(port_), ENABLE);
105
106 GPIO_InitTypeDef gpio_init = {};
107 gpio_init.GPIO_Pin = pin_;
108 gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
109
110 switch (direction)
111 {
115 case Direction::INPUT:
116 gpio_init.GPIO_Mode = (pull == Pull::UP) ? GPIO_Mode_IPU
117 : (pull == Pull::DOWN) ? GPIO_Mode_IPD
118 : GPIO_Mode_IN_FLOATING;
119 break;
121 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
122 break;
124 gpio_init.GPIO_Mode = GPIO_Mode_Out_OD;
125 break;
126 }
127
128 GPIO_Init(port_, &gpio_init);
129
130 switch (direction)
131 {
133 ConfigureEXTI(EXTI_Trigger_Rising);
134 break;
136 ConfigureEXTI(EXTI_Trigger_Falling);
137 break;
139 ConfigureEXTI(EXTI_Trigger_Rising_Falling);
140 break;
141 default:
142 break;
143 }
144}
static CH32GPIO * map_[16]
EXTI 线路映射表 / EXTI line map.
@ 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.
Pull
定义 GPIO 引脚的上拉/下拉模式。 Defines the pull-up/pull-down configurations for GPIO pins.
Definition gpio.hpp:36
@ DOWN
下拉模式 / Pull-down mode.
@ UP
上拉模式 / Pull-up mode.

Member Function Documentation

◆ CheckInterrupt()

void CH32GPIO::CheckInterrupt ( uint32_t line)
static

Definition at line 166 of file ch32_gpio.cpp.

167{
168 if (EXTI_GetITStatus(line) != RESET)
169 {
170 EXTI_ClearITPendingBit(line);
171
172 const uint8_t ID = GetEXTIID(static_cast<uint16_t>(line));
173 if (auto* gpio = map_[ID])
174 {
175 gpio->OnInterrupt();
176 }
177 }
178}

◆ DisableInterrupt()

ErrorCode CH32GPIO::DisableInterrupt ( )
overridevirtual

禁用 GPIO 引脚中断 / Disables the GPIO pin interrupt.

Returns
操作结果的错误码 / Error code indicating the result of the operation.

Implements LibXR::GPIO.

Definition at line 152 of file ch32_gpio.cpp.

153{
154 EXTI->INTENR &= ~static_cast<uint32_t>(pin_);
155 return ErrorCode::OK;
156}
@ OK
操作成功 / Operation successful

◆ EnableInterrupt()

ErrorCode CH32GPIO::EnableInterrupt ( )
overridevirtual

使能 GPIO 引脚中断 / Enables the GPIO pin interrupt.

Returns
操作结果的错误码 / Error code indicating the result of the operation.

Implements LibXR::GPIO.

Definition at line 146 of file ch32_gpio.cpp.

147{
148 EXTI->INTENR |= static_cast<uint32_t>(pin_);
149 return ErrorCode::OK;
150}

◆ OnInterrupt()

void CH32GPIO::OnInterrupt ( )

Definition at line 158 of file ch32_gpio.cpp.

159{
160 if (!callback_.Empty())
161 {
162 callback_.Run(true);
163 }
164}
bool Empty() const
检查回调是否为空 / Check whether the callback is empty
Definition libxr_cb.hpp:245
Callback callback_
GPIO 事件的回调函数 / Callback function for GPIO events.
Definition gpio.hpp:57

◆ Read()

bool LibXR::CH32GPIO::Read ( )
inlineoverridevirtual

读取 GPIO 引脚状态 / Reads the GPIO pin state.

Returns
返回引脚状态,true 表示高电平,false 表示低电平。 Returns the pin state, true for high, false for low.

Implements LibXR::GPIO.

Definition at line 58 of file ch32_gpio.hpp.

58{ return (port_->INDR & pin_) != (uint32_t)Bit_RESET; }

◆ SetConfig()

ErrorCode LibXR::CH32GPIO::SetConfig ( Configuration config)
inlineoverridevirtual

配置 GPIO 引脚参数 / Configures the GPIO pin settings.

Parameters
config需要应用的 GPIO 配置 / The GPIO configuration to apply.
Returns
操作结果的错误码 / Error code indicating the result of the operation.

Implements LibXR::GPIO.

Definition at line 76 of file ch32_gpio.hpp.

77 {
78 GPIO_InitTypeDef gpio_init = {};
79 gpio_init.GPIO_Pin = pin_;
80 gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
81
82 switch (config.direction)
83 {
88 gpio_init.GPIO_Mode = (config.pull == Pull::UP) ? GPIO_Mode_IPU
89 : (config.pull == Pull::DOWN) ? GPIO_Mode_IPD
90 : GPIO_Mode_IN_FLOATING;
91 break;
92
94 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
95 break;
96
98 gpio_init.GPIO_Mode = GPIO_Mode_Out_OD;
99 break;
100 }
101
102 GPIO_Init(port_, &gpio_init);
103
104 switch (config.direction)
105 {
107 ConfigureEXTI(EXTI_Trigger_Rising);
108 break;
110 ConfigureEXTI(EXTI_Trigger_Falling);
111 break;
113 ConfigureEXTI(EXTI_Trigger_Rising_Falling);
114 break;
115 default:
116 break;
117 }
118
119 return ErrorCode::OK;
120 }

◆ Write()

void LibXR::CH32GPIO::Write ( bool value)
inlineoverridevirtual

写入 GPIO 引脚状态 / Writes the GPIO pin state.

Parameters
value要写入的状态,true 表示高电平,false 表示低电平。 The value to write, true for high, false for low.

Implements LibXR::GPIO.

Definition at line 60 of file ch32_gpio.hpp.

61 {
62 if (value)
63 {
64 port_->BSHR = pin_;
65 }
66 else
67 {
68 port_->BCR = pin_;
69 }
70 }

Member Data Documentation

◆ map_

CH32GPIO* LibXR::CH32GPIO::map_[16] = {nullptr}
inlinestatic

EXTI 线路映射表 / EXTI line map.

Definition at line 127 of file ch32_gpio.hpp.

127{nullptr};

The documentation for this class was generated from the following files: