libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::CH32GPIO Class Reference
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)
 
bool Read () override
 读取 GPIO 引脚状态。Reads the GPIO pin state.
 
ErrorCode 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.
 
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}
 

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

Definition at line 87 of file ch32_gpio.hpp.

Constructor & Destructor Documentation

◆ CH32GPIO()

LibXR::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 )
inline

Definition at line 90 of file ch32_gpio.hpp.

93 : port_(port), pin_(pin), irq_(irq)
94 {
95 if (irq_ != NonMaskableInt_IRQn)
96 {
97 NVIC_EnableIRQ(irq_);
98 map[GetEXTIID(pin)] = this;
99 }
100
101 RCC_APB2PeriphClockCmd(CH32GetGPIOPeriph(port_), ENABLE);
102
103 GPIO_InitTypeDef gpio_init = {};
104 gpio_init.GPIO_Pin = pin_;
105 gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
106
107 switch (direction)
108 {
112 case Direction::INPUT:
113 gpio_init.GPIO_Mode = (pull == Pull::UP) ? GPIO_Mode_IPU
114 : (pull == Pull::DOWN) ? GPIO_Mode_IPD
115 : GPIO_Mode_IN_FLOATING;
116 break;
118 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
119 break;
121 gpio_init.GPIO_Mode = GPIO_Mode_Out_OD;
122 break;
123 }
124
125 GPIO_Init(port_, &gpio_init);
126
127 switch (direction)
128 {
130 ConfigureEXTI(EXTI_Trigger_Rising);
131 break;
133 ConfigureEXTI(EXTI_Trigger_Falling);
134 break;
136 ConfigureEXTI(EXTI_Trigger_Rising_Falling);
137 break;
138 default:
139 break;
140 }
141 }
@ 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()

static void LibXR::CH32GPIO::CheckInterrupt ( uint32_t line)
inlinestatic

Definition at line 220 of file ch32_gpio.hpp.

221 {
222 if (EXTI_GetITStatus(line) != RESET)
223 {
224 EXTI_ClearITPendingBit(line);
225 map[GetEXTIID(line)]->OnInterrupt();
226 }
227 }

◆ ConfigureEXTI()

void LibXR::CH32GPIO::ConfigureEXTI ( EXTITrigger_TypeDef trigger)
inlineprivate

Definition at line 236 of file ch32_gpio.hpp.

237 {
238 EXTI_InitTypeDef exti = {};
239 uint8_t pin_source = __builtin_ctz(pin_);
240 uint8_t port_source = 0xFF;
241
242#if defined(GPIOA)
243 if (port_ == GPIOA) port_source = GPIO_PortSourceGPIOA;
244#endif
245#if defined(GPIOB)
246 else if (port_ == GPIOB)
247 {
248 port_source = GPIO_PortSourceGPIOB;
249 }
250#endif
251#if defined(GPIOC)
252 else if (port_ == GPIOC)
253 {
254 port_source = GPIO_PortSourceGPIOC;
255 }
256#endif
257#if defined(GPIOD)
258 else if (port_ == GPIOD)
259 {
260 port_source = GPIO_PortSourceGPIOD;
261 }
262#endif
263#if defined(GPIOE)
264 else if (port_ == GPIOE)
265 {
266 port_source = GPIO_PortSourceGPIOE;
267 }
268#endif
269#if defined(GPIOF)
270 else if (port_ == GPIOF)
271 {
272 port_source = GPIO_PortSourceGPIOF;
273 }
274#endif
275#if defined(GPIOG)
276 else if (port_ == GPIOG)
277 {
278 port_source = GPIO_PortSourceGPIOG;
279 }
280#endif
281#if defined(GPIOH)
282 else if (port_ == GPIOH)
283 {
284 port_source = GPIO_PortSourceGPIOH;
285 }
286#endif
287#if defined(GPIOI)
288 else if (port_ == GPIOI)
289 {
290 port_source = GPIO_PortSourceGPIOI;
291 }
292#endif
293
294 ASSERT(port_source != 0xFF);
295
296 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
297 GPIO_EXTILineConfig(port_source, pin_source);
298
299 exti.EXTI_Line = 1 << pin_source;
300 exti.EXTI_Mode = EXTI_Mode_Interrupt;
301 exti.EXTI_Trigger = trigger;
302 exti.EXTI_LineCmd = ENABLE;
303 EXTI_Init(&exti);
304
305 NVIC_EnableIRQ(irq_);
306 }

◆ DisableInterrupt()

ErrorCode LibXR::CH32GPIO::DisableInterrupt ( )
inlineoverridevirtual

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

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

Implements LibXR::GPIO.

Definition at line 160 of file ch32_gpio.hpp.

161 {
162 EXTI->INTENR &= ~(1 << GetEXTIID(pin_));
163 return ErrorCode::OK;
164 }

◆ EnableInterrupt()

ErrorCode LibXR::CH32GPIO::EnableInterrupt ( )
inlineoverridevirtual

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

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

Implements LibXR::GPIO.

Definition at line 154 of file ch32_gpio.hpp.

155 {
156 EXTI->INTENR |= (1 << GetEXTIID(pin_));
157 return ErrorCode::OK;
158 }

◆ GetEXTIID()

static uint8_t LibXR::CH32GPIO::GetEXTIID ( uint16_t pin)
inlinestaticprivate

Definition at line 308 of file ch32_gpio.hpp.

308{ return __builtin_ctz(pin); }

◆ OnInterrupt()

void LibXR::CH32GPIO::OnInterrupt ( )
inline

Definition at line 212 of file ch32_gpio.hpp.

213 {
214 if (!callback_.Empty())
215 {
216 callback_.Run(true);
217 }
218 }
void Run(bool in_isr, PassArgs &&...args) const
执行回调函数,并传递参数。 Executes the callback function, passing the arguments.
Definition libxr_cb.hpp:208
bool Empty() const
检查回调是否为空。 Checks if the callback is empty.
Definition libxr_cb.hpp:223
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 143 of file ch32_gpio.hpp.

143{ return GPIO_ReadInputDataBit(port_, pin_) == Bit_SET; }

◆ 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 166 of file ch32_gpio.hpp.

167 {
168 GPIO_InitTypeDef gpio_init = {};
169 gpio_init.GPIO_Pin = pin_;
170 gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
171
172 switch (config.direction)
173 {
174 case Direction::INPUT:
175 gpio_init.GPIO_Mode = (config.pull == Pull::UP) ? GPIO_Mode_IPU
176 : (config.pull == Pull::DOWN) ? GPIO_Mode_IPD
177 : GPIO_Mode_IN_FLOATING;
178 break;
180 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
181 break;
183 gpio_init.GPIO_Mode = GPIO_Mode_Out_OD;
184 break;
188 gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
189 break;
190 }
191
192 GPIO_Init(port_, &gpio_init);
193
194 switch (config.direction)
195 {
197 ConfigureEXTI(EXTI_Trigger_Rising);
198 break;
200 ConfigureEXTI(EXTI_Trigger_Falling);
201 break;
203 ConfigureEXTI(EXTI_Trigger_Rising_Falling);
204 break;
205 default:
206 break;
207 }
208
209 return ErrorCode::OK;
210 }

◆ Write()

ErrorCode 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.
Returns
操作结果的错误码。Error code indicating the result of the operation.

Implements LibXR::GPIO.

Definition at line 145 of file ch32_gpio.hpp.

146 {
147 if (value)
148 GPIO_SetBits(port_, pin_);
149 else
150 GPIO_ResetBits(port_, pin_);
151 return ErrorCode::OK;
152 }

Field Documentation

◆ irq_

IRQn_Type LibXR::CH32GPIO::irq_
private

Definition at line 234 of file ch32_gpio.hpp.

◆ map

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

Definition at line 229 of file ch32_gpio.hpp.

229{nullptr};

◆ pin_

uint16_t LibXR::CH32GPIO::pin_
private

Definition at line 233 of file ch32_gpio.hpp.

◆ port_

GPIO_TypeDef* LibXR::CH32GPIO::port_
private

Definition at line 232 of file ch32_gpio.hpp.


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