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 45 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 )

Definition at line 69 of file ch32_gpio.cpp.

71 : port_(port), pin_(pin), irq_(irq)
72{
73 if (irq_ != NonMaskableInt_IRQn)
74 {
75 NVIC_EnableIRQ(irq_);
76 map[GetEXTIID(pin)] = this;
77 }
78
79 RCC_APB2PeriphClockCmd(CH32GetGPIOPeriph(port_), ENABLE);
80
81 GPIO_InitTypeDef gpio_init = {};
82 gpio_init.GPIO_Pin = pin_;
83 gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
84
85 switch (direction)
86 {
91 gpio_init.GPIO_Mode = (pull == Pull::UP) ? GPIO_Mode_IPU
92 : (pull == Pull::DOWN) ? GPIO_Mode_IPD
93 : GPIO_Mode_IN_FLOATING;
94 break;
96 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
97 break;
99 gpio_init.GPIO_Mode = GPIO_Mode_Out_OD;
100 break;
101 }
102
103 GPIO_Init(port_, &gpio_init);
104
105 switch (direction)
106 {
108 ConfigureEXTI(EXTI_Trigger_Rising);
109 break;
111 ConfigureEXTI(EXTI_Trigger_Falling);
112 break;
114 ConfigureEXTI(EXTI_Trigger_Rising_Falling);
115 break;
116 default:
117 break;
118 }
119}
@ 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 198 of file ch32_gpio.cpp.

199{
200 if (EXTI_GetITStatus(line) != RESET)
201 {
202 EXTI_ClearITPendingBit(line);
203 map[GetEXTIID(line)]->OnInterrupt();
204 }
205}

◆ ConfigureEXTI()

void CH32GPIO::ConfigureEXTI ( EXTITrigger_TypeDef trigger)
private

Definition at line 207 of file ch32_gpio.cpp.

208{
209 EXTI_InitTypeDef exti = {};
210 uint8_t pin_source = __builtin_ctz(pin_);
211 uint8_t port_source = 0xFF;
212
213#if defined(GPIOA)
214 if (port_ == GPIOA) port_source = GPIO_PortSourceGPIOA;
215#endif
216#if defined(GPIOB)
217 else if (port_ == GPIOB)
218 {
219 port_source = GPIO_PortSourceGPIOB;
220 }
221#endif
222#if defined(GPIOC)
223 else if (port_ == GPIOC)
224 {
225 port_source = GPIO_PortSourceGPIOC;
226 }
227#endif
228#if defined(GPIOD)
229 else if (port_ == GPIOD)
230 {
231 port_source = GPIO_PortSourceGPIOD;
232 }
233#endif
234#if defined(GPIOE)
235 else if (port_ == GPIOE)
236 {
237 port_source = GPIO_PortSourceGPIOE;
238 }
239#endif
240#if defined(GPIOF)
241 else if (port_ == GPIOF)
242 {
243 port_source = GPIO_PortSourceGPIOF;
244 }
245#endif
246#if defined(GPIOG)
247 else if (port_ == GPIOG)
248 {
249 port_source = GPIO_PortSourceGPIOG;
250 }
251#endif
252#if defined(GPIOH)
253 else if (port_ == GPIOH)
254 {
255 port_source = GPIO_PortSourceGPIOH;
256 }
257#endif
258#if defined(GPIOI)
259 else if (port_ == GPIOI)
260 {
261 port_source = GPIO_PortSourceGPIOI;
262 }
263#endif
264
265 ASSERT(port_source != 0xFF);
266
267 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
268 GPIO_EXTILineConfig(port_source, pin_source);
269
270 exti.EXTI_Line = 1 << pin_source;
271 exti.EXTI_Mode = EXTI_Mode_Interrupt;
272 exti.EXTI_Trigger = trigger;
273 exti.EXTI_LineCmd = ENABLE;
274 EXTI_Init(&exti);
275
276 NVIC_EnableIRQ(irq_);
277}

◆ 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 138 of file ch32_gpio.cpp.

139{
140 EXTI->INTENR &= ~(1 << GetEXTIID(pin_));
141 return ErrorCode::OK;
142}

◆ 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 132 of file ch32_gpio.cpp.

133{
134 EXTI->INTENR |= (1 << GetEXTIID(pin_));
135 return ErrorCode::OK;
136}

◆ GetEXTIID()

uint8_t CH32GPIO::GetEXTIID ( uint16_t pin)
staticprivate

Definition at line 279 of file ch32_gpio.cpp.

279{ return __builtin_ctz(pin); }

◆ OnInterrupt()

void CH32GPIO::OnInterrupt ( )

Definition at line 190 of file ch32_gpio.cpp.

191{
192 if (!callback_.Empty())
193 {
194 callback_.Run(true);
195 }
196}
void Run(bool in_isr, PassArgs &&...args) const
执行回调函数,并传递参数。 Executes the callback function, passing the arguments.
Definition libxr_cb.hpp:207
bool Empty() const
检查回调是否为空。 Checks if the callback is empty.
Definition libxr_cb.hpp:222
Callback callback_
GPIO 事件的回调函数。Callback function for GPIO events.
Definition gpio.hpp:56

◆ Read()

bool CH32GPIO::Read ( )
overridevirtual

读取 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 121 of file ch32_gpio.cpp.

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

◆ SetConfig()

ErrorCode CH32GPIO::SetConfig ( Configuration config)
overridevirtual

配置 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 144 of file ch32_gpio.cpp.

145{
146 GPIO_InitTypeDef gpio_init = {};
147 gpio_init.GPIO_Pin = pin_;
148 gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
149
150 switch (config.direction)
151 {
152 case Direction::INPUT:
153 gpio_init.GPIO_Mode = (config.pull == Pull::UP) ? GPIO_Mode_IPU
154 : (config.pull == Pull::DOWN) ? GPIO_Mode_IPD
155 : GPIO_Mode_IN_FLOATING;
156 break;
158 gpio_init.GPIO_Mode = GPIO_Mode_Out_PP;
159 break;
161 gpio_init.GPIO_Mode = GPIO_Mode_Out_OD;
162 break;
166 gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
167 break;
168 }
169
170 GPIO_Init(port_, &gpio_init);
171
172 switch (config.direction)
173 {
175 ConfigureEXTI(EXTI_Trigger_Rising);
176 break;
178 ConfigureEXTI(EXTI_Trigger_Falling);
179 break;
181 ConfigureEXTI(EXTI_Trigger_Rising_Falling);
182 break;
183 default:
184 break;
185 }
186
187 return ErrorCode::OK;
188}

◆ Write()

ErrorCode CH32GPIO::Write ( bool value)
overridevirtual

写入 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 123 of file ch32_gpio.cpp.

124{
125 if (value)
126 GPIO_SetBits(port_, pin_);
127 else
128 GPIO_ResetBits(port_, pin_);
129 return ErrorCode::OK;
130}

Field Documentation

◆ irq_

IRQn_Type LibXR::CH32GPIO::irq_
private

Definition at line 71 of file ch32_gpio.hpp.

◆ map

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

Definition at line 66 of file ch32_gpio.hpp.

66{nullptr};

◆ pin_

uint16_t LibXR::CH32GPIO::pin_
private

Definition at line 70 of file ch32_gpio.hpp.

◆ port_

GPIO_TypeDef* LibXR::CH32GPIO::port_
private

Definition at line 69 of file ch32_gpio.hpp.


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