libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::HPMGPIO Class Referencefinal

HPM 平台 GPIO 驱动实现 / GPIO driver implementation for HPM platform. More...

#include <hpm_gpio.hpp>

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

Public Member Functions

 HPMGPIO (GPIO_Type *gpio, uint32_t port, uint8_t pin, uint32_t irq=kInvalidIrq, uint16_t pad_index=kInvalidPadIndex)
 构造 HPM GPIO 对象 / Construct an HPM GPIO object.
 
bool Read () override
 读取引脚电平 / Read current pin level.
 
void Write (bool value) override
 写引脚电平 / Write output pin level.
 
ErrorCode EnableInterrupt () override
 使能当前引脚中断 / Enable GPIO interrupt for current pin.
 
ErrorCode DisableInterrupt () override
 失能当前引脚中断 / Disable GPIO interrupt for current pin.
 
ErrorCode SetConfig (Configuration config) override
 配置当前引脚模式 / Configure GPIO mode for current pin.
 
ErrorCode SetAnalogHighImpedance ()
 将当前 PAD 配置为模拟高阻 / Configure current pad to analog high-impedance.
 
- 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 port)
 分发某一端口的 GPIO 中断回调 / Dispatch GPIO interrupt callbacks for one port.
 

Static Private Member Functions

static uint16_t ResolvePadIndex (GPIO_Type *gpio, uint32_t port, uint8_t pin)
 根据控制器与端口引脚推导 IOC PAD 编号 / Resolve IOC PAD index from controller/port/pin tuple.
 

Private Attributes

GPIO_Type * gpio_
 GPIO 控制器实例 / GPIO controller instance.
 
uint32_t port_
 GPIO 端口号 / GPIO port index.
 
uint8_t pin_
 GPIO 引脚号 / GPIO pin index.
 
uint32_t irq_
 引脚对应 IRQ 号 / IRQ number for this pin.
 
uint16_t pad_index_
 IOC PAD 编号 / IOC PAD index.
 

Static Private Attributes

static constexpr uint32_t kPortCount = 15
 支持的端口数量 / Supported port count.
 
static constexpr uint32_t kPinCount = 32
 每个端口引脚数 / Pins per port.
 
static constexpr uint32_t kInvalidIrq = 0xFFFFFFFFu
 无效 IRQ 标记 / Invalid IRQ marker.
 
static constexpr uint16_t kInvalidPadIndex = 0xFFFFu
 无效 PAD 标记 / Invalid PAD marker.
 
static HPMGPIOmap [kPortCount][kPinCount] = {}
 GPIO 对象映射表 / GPIO object dispatch map.
 
static GPIO_Type * port_controller_map [kPortCount] = {}
 

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

HPM 平台 GPIO 驱动实现 / GPIO driver implementation for HPM platform.

该类将 LibXR GPIO 抽象接口适配到 HPM SDK GPIO API。 This class adapts the LibXR GPIO abstraction to HPM SDK GPIO APIs.

中断回调由 CheckInterrupt() 统一分发。 Interrupt callbacks are dispatched through CheckInterrupt().

Definition at line 20 of file hpm_gpio.hpp.

Constructor & Destructor Documentation

◆ HPMGPIO()

HPMGPIO::HPMGPIO ( GPIO_Type * gpio,
uint32_t port,
uint8_t pin,
uint32_t irq = kInvalidIrq,
uint16_t pad_index = kInvalidPadIndex )

构造 HPM GPIO 对象 / Construct an HPM GPIO object.

构造 HPM GPIO 对象并注册到中断映射表 / Construct HPM GPIO object and register into interrupt map.

Parameters
gpioGPIO 控制器基地址 / GPIO controller base address.
portGPIO 端口号 / GPIO port index.
pinGPIO 引脚号 / GPIO pin index.
irq该引脚/端口对应的中断号(可选) / IRQ number for this pin/port (optional).
pad_indexIOC PAD 编号,默认值表示自动由 (gpio, port, pin) 推导 / IOC PAD index. Use default value to auto-resolve from (gpio, port, pin).

Definition at line 49 of file hpm_gpio.cpp.

51 : gpio_(gpio),
52 port_(port),
53 pin_(pin),
54 irq_(irq),
55 pad_index_(pad_index == kInvalidPadIndex ? ResolvePadIndex(gpio, port, pin)
56 : pad_index)
57{
58 if (port_ < kPortCount && pin_ < kPinCount)
59 {
60 map[port_][pin_] = this;
61 if (port_controller_map[port_] == nullptr)
62 {
63 port_controller_map[port_] = gpio_;
64 }
65 }
66}
static constexpr uint32_t kPortCount
支持的端口数量 / Supported port count.
Definition hpm_gpio.hpp:102
GPIO_Type * gpio_
GPIO 控制器实例 / GPIO controller instance.
Definition hpm_gpio.hpp:123
static constexpr uint16_t kInvalidPadIndex
无效 PAD 标记 / Invalid PAD marker.
Definition hpm_gpio.hpp:105
static uint16_t ResolvePadIndex(GPIO_Type *gpio, uint32_t port, uint8_t pin)
根据控制器与端口引脚推导 IOC PAD 编号 / Resolve IOC PAD index from controller/port/pin tuple.
Definition hpm_gpio.cpp:275
uint16_t pad_index_
IOC PAD 编号 / IOC PAD index.
Definition hpm_gpio.hpp:127
uint32_t irq_
引脚对应 IRQ 号 / IRQ number for this pin.
Definition hpm_gpio.hpp:126
static HPMGPIO * map[kPortCount][kPinCount]
GPIO 对象映射表 / GPIO object dispatch map.
Definition hpm_gpio.hpp:120
static constexpr uint32_t kPinCount
每个端口引脚数 / Pins per port.
Definition hpm_gpio.hpp:103
uint8_t pin_
GPIO 引脚号 / GPIO pin index.
Definition hpm_gpio.hpp:125
uint32_t port_
GPIO 端口号 / GPIO port index.
Definition hpm_gpio.hpp:124

Member Function Documentation

◆ CheckInterrupt()

void HPMGPIO::CheckInterrupt ( uint32_t port)
static

分发某一端口的 GPIO 中断回调 / Dispatch GPIO interrupt callbacks for one port.

扫描并分发指定端口的 GPIO 中断 / Scan and dispatch GPIO IRQ callbacks for one port.

Parameters
portGPIO 端口号 / GPIO port index.

该函数应在板级 GPIO IRQ Handler 中调用。 This function should be called by board IRQ handlers.

同时会清除触发引脚的中断标志位。 It also clears interrupt flags for triggered pins.

Parameters
portGPIO 端口号 / GPIO port index.

建议在板级 IRQHandler 中仅调用一次该函数:

  • 读取端口中断标志;
  • 逐 pin 清标志;
  • 触发对应对象的 LibXR 回调。 Recommended to call once from board IRQ handler:
  • read port IRQ flags;
  • clear flag per asserted pin;
  • run corresponding LibXR callback.

Definition at line 238 of file hpm_gpio.cpp.

239{
240 if (port >= kPortCount)
241 {
242 return;
243 }
244
245 GPIO_Type* controller = port_controller_map[port];
246 if (controller == nullptr)
247 {
248 return;
249 }
250
251 const uint32_t flags = gpio_get_port_interrupt_flags(controller, port);
252 if (flags == 0u)
253 {
254 return;
255 }
256
257 for (uint8_t pin = 0; pin < kPinCount; ++pin)
258 {
259 if ((flags & (1u << pin)) == 0u)
260 {
261 continue;
262 }
263
264 gpio_clear_pin_interrupt_flag(controller, port, pin);
265 if (auto* gpio = map[port][pin])
266 {
267 gpio->callback_.Run(true);
268 }
269 }
270}

◆ DisableInterrupt()

ErrorCode HPMGPIO::DisableInterrupt ( )
overridevirtual

失能当前引脚中断 / Disable GPIO interrupt for current pin.

失能当前引脚中断 / Disable interrupt for current pin.

Returns
成功返回 ErrorCode::OK,IRQ 无效返回 ErrorCode::ARG_ERR / Returns ErrorCode::OK on success, ErrorCode::ARG_ERR when IRQ is invalid.

先关闭 GPIO 事件,再关闭 PLIC 路由,避免在关中断过程中出现残留触发。 Disable GPIO event first, then PLIC routing, to avoid residual triggers while disabling.

Implements LibXR::GPIO.

Definition at line 96 of file hpm_gpio.cpp.

97{
98 if (irq_ == kInvalidIrq)
99 {
100 return ErrorCode::ARG_ERR;
101 }
102 gpio_disable_pin_interrupt(gpio_, port_, pin_);
103 intc_m_disable_irq(irq_);
104 return ErrorCode::OK;
105}
static constexpr uint32_t kInvalidIrq
无效 IRQ 标记 / Invalid IRQ marker.
Definition hpm_gpio.hpp:104

◆ EnableInterrupt()

ErrorCode HPMGPIO::EnableInterrupt ( )
overridevirtual

使能当前引脚中断 / Enable GPIO interrupt for current pin.

使能当前引脚中断 / Enable interrupt for current pin.

Returns
成功返回 ErrorCode::OK,IRQ 无效返回 ErrorCode::ARG_ERR / Returns ErrorCode::OK on success, ErrorCode::ARG_ERR when IRQ is invalid.

对于从 STM32 迁移的开发者:

  • gpio_enable_pin_interrupt() 只打开 GPIO 侧事件;
  • intc_m_enable_irq_with_priority() 打开 PLIC 路由并设置优先级。 For STM32-oriented users:
  • gpio_enable_pin_interrupt() enables GPIO-side event generation only.
  • intc_m_enable_irq_with_priority() enables PLIC routing and IRQ priority.

Implements LibXR::GPIO.

Definition at line 78 of file hpm_gpio.cpp.

79{
80 if (irq_ == kInvalidIrq)
81 {
82 return ErrorCode::ARG_ERR;
83 }
84 gpio_enable_pin_interrupt(gpio_, port_, pin_);
85 intc_m_enable_irq_with_priority(irq_, 1);
86 return ErrorCode::OK;
87}

◆ Read()

bool LibXR::HPMGPIO::Read ( )
inlineoverridevirtual

读取引脚电平 / Read current pin level.

Returns
true 高电平,false 低电平 / true for high level, false for low level.

Implements LibXR::GPIO.

Definition at line 39 of file hpm_gpio.hpp.

40 {
41 const uint32_t level = gpio_read_pin(gpio_, port_, pin_);
42 return level == 1u;
43 }

◆ ResolvePadIndex()

uint16_t HPMGPIO::ResolvePadIndex ( GPIO_Type * gpio,
uint32_t port,
uint8_t pin )
staticprivate

根据控制器与端口引脚推导 IOC PAD 编号 / Resolve IOC PAD index from controller/port/pin tuple.

推导指定 GPIO 对应的 IOC PAD 编号 / Resolve IOC PAD index for a GPIO pin.

Parameters
gpioGPIO 控制器基地址 / GPIO controller base address.
portGPIO 端口号 / GPIO port index.
pinGPIO 引脚号 / GPIO pin index.
Returns
有效 PAD 编号,无法推导时返回 kInvalidPadIndex / Resolved PAD index, or kInvalidPadIndex if unavailable. 端口-引脚到对象实例的静态映射,用于中断分发 / Static port-pin to object map for interrupt dispatch.

Definition at line 275 of file hpm_gpio.cpp.

276{
277 if (gpio != HPM_GPIO0 && gpio != HPM_FGPIO)
278 {
279 return kInvalidPadIndex;
280 }
281
282 switch (port)
283 {
284 case GPIO_DI_GPIOA:
285 return static_cast<uint16_t>(IOC_PAD_PA00 + pin);
286 case GPIO_DI_GPIOB:
287 return static_cast<uint16_t>(IOC_PAD_PB00 + pin);
288 case GPIO_DI_GPIOX:
289 return pin < 8u ? static_cast<uint16_t>(IOC_PAD_PX00 + pin) : kInvalidPadIndex;
290 case GPIO_DI_GPIOY:
291 return pin < 8u ? static_cast<uint16_t>(IOC_PAD_PY00 + pin) : kInvalidPadIndex;
292 default:
293 return kInvalidPadIndex;
294 }
295}

◆ SetAnalogHighImpedance()

ErrorCode HPMGPIO::SetAnalogHighImpedance ( )

将当前 PAD 配置为模拟高阻 / Configure current pad to analog high-impedance.

将引脚切换为模拟高阻 / Put current pin into analog high-impedance mode.

Returns
成功返回 ErrorCode::OK,PAD 不可解析返回 ErrorCode::NOT_SUPPORT / Returns ErrorCode::OK on success, ErrorCode::NOT_SUPPORT when PAD is unavailable.

用途:

  • 该引脚仅作为外部网络连接点,不希望其数字输入/上下拉影响外部 PWM 信号;
  • 例如 PB10 外部跳线到 PA10 时,PA10 需保持高阻避免“分流”。 Usage:
  • Keep this pin from loading an externally driven signal (PWM/analog net);
  • Example: PB10 externally jumpered to PA10, PA10 should stay high-Z.

Definition at line 200 of file hpm_gpio.cpp.

201{
202 if (port_ >= kPortCount || pin_ >= kPinCount)
203 {
204 return ErrorCode::ARG_ERR;
205 }
206
208 {
209 return ErrorCode::NOT_SUPPORT;
210 }
211
212 gpio_disable_pin_interrupt(gpio_, port_, pin_);
213 gpio_set_pin_input(gpio_, port_, pin_);
214
215 HPM_IOC->PAD[pad_index_].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
216
217 uint32_t pad_ctl = HPM_IOC->PAD[pad_index_].PAD_CTL;
218 pad_ctl &= ~(IOC_PAD_PAD_CTL_PE_MASK | IOC_PAD_PAD_CTL_OD_MASK);
219 HPM_IOC->PAD[pad_index_].PAD_CTL = pad_ctl;
220
221 return ErrorCode::OK;
222}

◆ SetConfig()

ErrorCode HPMGPIO::SetConfig ( Configuration config)
overridevirtual

配置当前引脚模式 / Configure GPIO mode for current pin.

配置 GPIO 方向、中断模式与上下拉 / Configure GPIO direction, interrupt mode, and pull.

Parameters
configGPIO 配置参数 / GPIO configuration.
Returns
成功返回 ErrorCode::OK,失败返回对应错误码 / Returns ErrorCode::OK on success, error code otherwise.
Note
该接口会将 PAD 复用强制切换为 GPIO,不负责外设复用配置 / This API forces pad mux to GPIO function (no peripheral alternate-function setup).
在可解析到 PAD 时会自动开启 IOC loopback,用于输出模式下直接通过 Read() 读取实际引脚电平 / When PAD can be resolved, IOC loopback is enabled so Read() can return the actual pad level even in output mode.

与 STM32 HAL 的常见用法对齐:

  • Direction 对应 GPIO 模式(输入/输出/中断边沿)
  • Pull 对应上拉/下拉配置 Aligned with common STM32 HAL usage:
  • Direction maps to GPIO mode (input/output/IRQ edge)
  • Pull maps to pull-up / pull-down configuration

Implements LibXR::GPIO.

Definition at line 118 of file hpm_gpio.cpp.

119{
120 if (port_ >= kPortCount || pin_ >= kPinCount)
121 {
122 return ErrorCode::ARG_ERR;
123 }
124
126 {
127 // 保持接口自洽:先确保 PAD 复用到 GPIO / Keep API self-contained: force GPIO mux
128 // first.
129 HPM_GPIO_ConfigMuxToGPIO(gpio_, port_, pad_index_);
130 }
131
132 switch (config.direction)
133 {
134 case Direction::INPUT:
135 gpio_set_pin_input(gpio_, port_, pin_);
136 break;
139 gpio_set_pin_output(gpio_, port_, pin_);
140 break;
142 gpio_set_pin_input(gpio_, port_, pin_);
143 gpio_config_pin_interrupt(gpio_, port_, pin_, gpio_interrupt_trigger_edge_falling);
144 break;
146 gpio_set_pin_input(gpio_, port_, pin_);
147 gpio_config_pin_interrupt(gpio_, port_, pin_, gpio_interrupt_trigger_edge_rising);
148 break;
150 gpio_set_pin_input(gpio_, port_, pin_);
151 gpio_config_pin_interrupt(gpio_, port_, pin_, gpio_interrupt_trigger_edge_both);
152 break;
153 default:
154 return ErrorCode::ARG_ERR;
155 }
156
158 {
159 uint32_t pad_ctl = HPM_IOC->PAD[pad_index_].PAD_CTL;
160
161 // 仅更新上下拉与开漏位,保留其他电气属性 / Update pull + open-drain bits only.
162 pad_ctl &=
163 ~(IOC_PAD_PAD_CTL_PE_MASK | IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_OD_MASK);
164
165 switch (config.pull)
166 {
167 case Pull::NONE:
168 break;
169 case Pull::UP:
170 pad_ctl |= IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
171 break;
172 case Pull::DOWN:
173 pad_ctl |= IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(0);
174 break;
175 default:
176 return ErrorCode::ARG_ERR;
177 }
178
179 if (config.direction == Direction::OUTPUT_OPEN_DRAIN)
180 {
181 pad_ctl |= IOC_PAD_PAD_CTL_OD_SET(1);
182 }
183
184 HPM_IOC->PAD[pad_index_].PAD_CTL = pad_ctl;
185 }
186
187 return ErrorCode::OK;
188}
@ 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.

◆ Write()

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

写引脚电平 / Write output pin level.

Parameters
valuetrue 高电平,false 低电平 / true for high level, false for low level.

Implements LibXR::GPIO.

Definition at line 50 of file hpm_gpio.hpp.

51 {
52 gpio_write_pin(gpio_, port_, pin_, value ? 1u : 0u);
53 }

Field Documentation

◆ gpio_

GPIO_Type* LibXR::HPMGPIO::gpio_
private

GPIO 控制器实例 / GPIO controller instance.

Definition at line 123 of file hpm_gpio.hpp.

◆ irq_

uint32_t LibXR::HPMGPIO::irq_
private

引脚对应 IRQ 号 / IRQ number for this pin.

Definition at line 126 of file hpm_gpio.hpp.

◆ kInvalidIrq

uint32_t LibXR::HPMGPIO::kInvalidIrq = 0xFFFFFFFFu
staticconstexprprivate

无效 IRQ 标记 / Invalid IRQ marker.

Definition at line 104 of file hpm_gpio.hpp.

◆ kInvalidPadIndex

uint16_t LibXR::HPMGPIO::kInvalidPadIndex = 0xFFFFu
staticconstexprprivate

无效 PAD 标记 / Invalid PAD marker.

Definition at line 105 of file hpm_gpio.hpp.

◆ kPinCount

uint32_t LibXR::HPMGPIO::kPinCount = 32
staticconstexprprivate

每个端口引脚数 / Pins per port.

Definition at line 103 of file hpm_gpio.hpp.

◆ kPortCount

uint32_t LibXR::HPMGPIO::kPortCount = 15
staticconstexprprivate

支持的端口数量 / Supported port count.

Definition at line 102 of file hpm_gpio.hpp.

◆ map

HPMGPIO * HPMGPIO::map = {}
staticprivate

GPIO 对象映射表 / GPIO object dispatch map.

按端口和引脚保存对象指针,供中断入口快速找到具体实例并触发回调。 Stores instance pointers by port/pin so IRQ entry can dispatch callbacks quickly.

Definition at line 120 of file hpm_gpio.hpp.

◆ pad_index_

uint16_t LibXR::HPMGPIO::pad_index_
private

IOC PAD 编号 / IOC PAD index.

Definition at line 127 of file hpm_gpio.hpp.

◆ pin_

uint8_t LibXR::HPMGPIO::pin_
private

GPIO 引脚号 / GPIO pin index.

Definition at line 125 of file hpm_gpio.hpp.

◆ port_

uint32_t LibXR::HPMGPIO::port_
private

GPIO 端口号 / GPIO port index.

Definition at line 124 of file hpm_gpio.hpp.

◆ port_controller_map

GPIO_Type * HPMGPIO::port_controller_map = {}
staticprivate

Definition at line 121 of file hpm_gpio.hpp.


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