libxr  1.0
Want to be the best embedded framework
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 CH32GPIOmap_ [16] = {nullptr}
 EXTI 线路映射表 / EXTI line map.
 

Private Member Functions

void ConfigureEXTI (EXTITrigger_TypeDef trigger)
 

Static Private Member Functions

static uint8_t GetEXTIID (uint16_t pin)
 

Private Attributes

GPIO_TypeDef * port_
 
uint16_t pin_
 
IRQn_Type irq_
 

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<>
 
- Data Fields 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:35
@ 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}

◆ ConfigureEXTI()

void CH32GPIO::ConfigureEXTI ( EXTITrigger_TypeDef trigger)
private

Definition at line 180 of file ch32_gpio.cpp.

181{
182 EXTI_InitTypeDef exti = {};
183 uint8_t pin_source = GetEXTIID(pin_);
184 uint8_t port_source = 0xFF;
185
186#if defined(GPIOA)
187 if (port_ == GPIOA)
188 {
189 port_source = GPIO_PortSourceGPIOA;
190#endif
191#if defined(GPIOB)
192 }
193 else if (port_ == GPIOB)
194 {
195 port_source = GPIO_PortSourceGPIOB;
196 }
197#endif
198#if defined(GPIOC)
199 else if (port_ == GPIOC)
200 {
201 port_source = GPIO_PortSourceGPIOC;
202 }
203#endif
204#if defined(GPIOD)
205 else if (port_ == GPIOD)
206 {
207 port_source = GPIO_PortSourceGPIOD;
208 }
209#endif
210#if defined(GPIOE)
211 else if (port_ == GPIOE)
212 {
213 port_source = GPIO_PortSourceGPIOE;
214 }
215#endif
216#if defined(GPIOF)
217 else if (port_ == GPIOF)
218 {
219 port_source = GPIO_PortSourceGPIOF;
220 }
221#endif
222#if defined(GPIOG)
223 else if (port_ == GPIOG)
224 {
225 port_source = GPIO_PortSourceGPIOG;
226 }
227#endif
228#if defined(GPIOH)
229 else if (port_ == GPIOH)
230 {
231 port_source = GPIO_PortSourceGPIOH;
232 }
233#endif
234#if defined(GPIOI)
235 else if (port_ == GPIOI)
236 {
237 port_source = GPIO_PortSourceGPIOI;
238 }
239#endif
240
241 ASSERT(port_source != 0xFF);
242
243 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
244 GPIO_EXTILineConfig(port_source, pin_source);
245
246 exti.EXTI_Line = 1 << pin_source;
247 exti.EXTI_Mode = EXTI_Mode_Interrupt;
248 exti.EXTI_Trigger = trigger;
249 exti.EXTI_LineCmd = ENABLE;
250 EXTI_Init(&exti);
251
252 NVIC_EnableIRQ(irq_);
253}

◆ 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}

◆ GetEXTIID()

uint8_t CH32GPIO::GetEXTIID ( uint16_t pin)
staticprivate

Definition at line 255 of file ch32_gpio.cpp.

256{
257 ASSERT(pin != 0 && (pin & static_cast<uint16_t>(pin - 1)) == 0);
258 return __builtin_ctz(pin);
259}

◆ 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:247
Callback callback_
GPIO 事件的回调函数。Callback function for GPIO events.
Definition gpio.hpp:56

◆ 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 }

Field Documentation

◆ irq_

IRQn_Type LibXR::CH32GPIO::irq_
private

Definition at line 132 of file ch32_gpio.hpp.

◆ map_

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

EXTI 线路映射表 / EXTI line map.

Definition at line 127 of file ch32_gpio.hpp.

127{nullptr};

◆ pin_

uint16_t LibXR::CH32GPIO::pin_
private

Definition at line 131 of file ch32_gpio.hpp.

◆ port_

GPIO_TypeDef* LibXR::CH32GPIO::port_
private

Definition at line 130 of file ch32_gpio.hpp.


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