GPIO

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


功能概述

在使用GPIO之前,理解GPIO相关的基础知识将更有利于使用它。

GPIO的物理结构

GPIO(通用输入输出)是一种通用的数字输入/输出接口,广泛应用于微处理器、微控制器及其他嵌入式系统中,用于与外部电子元件或设备进行通信。

物理电路结构如下图所示:

../../_images/image_XF3abhhNYotyXAxF4cZc8UMink7.webp

I/O引脚:作为微控制器或微处理器中的实际硬件接口,用于连接外部设备。每个GPIO引脚均可通过编程配置为输入或输出模式。

保护二极管(protection diode):特殊类型的二极管,用于保护微控制器或微处理器的输入/输出引脚免受电压反冲或静电放电的影响。

上拉/下拉电阻:用于设定GPIO引脚在空闲或无输入信号时的状态。上拉电阻将GPIO引脚连接至正电源,使其处于默认高电平状态;下拉电阻将GPIO引脚连接至地线,使其处于默认低电平状态。相关配置由软件通过寄存器控制。

P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使GPIO具备“推挽输出”和“开漏输出”两种工作模式。

TTL施密特触发器:用于处理噪声或不稳定的输入信号。通过设定两个不同的阈值(上阈值和下阈值)来消除数字信号的噪声,从而提供更准确的数字信号。

输出驱动器:控制GPIO引脚在输出模式下的电压和电流。

输入接收器:处理来自GPIO引脚的输入信号。在许多情况下,它可能包括一个施密特触发器,用于消除数字信号的噪声。

工作模式

输入模式

浮空输入

浮空输入模式也称为Hi-Z或高阻抗状态。在此状态下,GPIO引脚不会被拉至任何逻辑电平,而是悬空。由于浮空输入状态下GPIO引脚容易拾取电噪声并可能读取随机值,因此通常不建议使用,除非有特定技术需求。

红色高亮部分显示了数据传输通道:外部电平信号通过编号①I/O端口进入芯片内部,经过编号②施密特触发器整形后,送入③“输入数据寄存器”,在“输入数据寄存器”的另一端(编号④) ,CPU可通过内部数据总线随时读取I/O 端口的电平变化状态。

../../_images/image_W4j4bl6mQou2OfxElCKcL2qknjQ.webp

上拉输入

GPIO引脚和电源电压(VDD)之间连接有上拉电阻。 因此,当GPIO引脚未被设备主动驱动时,它会被“上拉”至逻辑高电平。 当需要GPIO引脚的默认状态为高电平时,需配置为上拉模式。与浮空输入模式相比,上拉输入模式在数据通道上接入了一个上拉电阻,其阻值一般介于30K~50KΩ。在I/O口无信号输入的情况下,输入端的电平可保持在高电平(VDD 经过上拉电阻);当I/O端口输入为低电平时,输入端的电平即为低电平。

../../_images/image_DYedbIb81oaBSqxGyGrclaZ3nlk.webp

下拉输入

GPIO引脚与地(VSS)之间连接有下拉电阻。当GPIO引脚未被设备主动驱动时,将被拉至逻辑低电平。当需要 GPIO引脚的默认状态为低电平时,应配置为下拉模式。

对于输入下拉模式的输入,是在数据通道的下部,接入了一个下拉电阻。这个下拉电阻阻值一般介于30K~50KΩ。

../../_images/image_P477bi1cHoN6VYxhOwjcnjgnnkc.webp

模拟输入

无上下拉电阻,电信号不经过施密特触发器,直接进入模拟输入通道,一般用于ADC数据采集。

../../_images/image_QMVRbtobmoQBlzxHzvLc4FdDnYg.webp

输出模式

开漏输出

在开漏(Open-Drain)输出模式下,GPIO引脚只能主动将电压拉低(通过连接到地线),不能主动将电压拉高。要实现电压的拉高,需要配合一个外部的上拉电阻连接到电源。 开漏输出的一个常见应用是I2C通信,其中多个设备可以共享同一条数据线。

../../_images/image_VhSgbw8YxoBTY1x8812c9Jp4nvc.webp

当CPU在编号①端通过“位设置/ 清除寄存器”或“输出数据寄存器”写入数据后,该数据位将通过编号②的输出控制电路传送到编号④的I/O端口。如果CPU写入的是逻辑“1”,则编号③的N-MOS管将处于关闭状态,此时I/O端口的电平将由外部的上拉电阻决定。如果CPU写入的是逻辑“0”,则编号③的N-MOS管将处于开启状态,此时I/O端口的电平被编号③的N-MOS管拉到了“地”的零电位。

在图中的上半部,施密特触发器处于开启状态,这意味着CPU可以在“输入数据寄存器”的另一端,随时可以监控I/O端口的状态,通过这个特性,还可以实现虚拟的I/O端口双向通信:假如CPU输出逻辑“1”,由于编号③的N-MOS管处于关闭状态,I/O端口的电平将完全由外部电路决定。因此,CPU可以在“输入数据寄存器”读到外部电路的信号,而不是它自己输出的逻辑“1” 。

推挽输出

在推挽(Push-Pull)输出模式下,GPIO引脚可以主动驱动高电平或低电平。这意味着GPIO可以"推"电压到高电平,也可以"拉"电压到低电平。推挽输出可以提供较强的驱动能力,适合驱动LED、电机等负载。

备注

注意: 推挽输出的最大特点是能够真正输出高电平和低电平,在两种电平下都具有驱动能力。

../../_images/image_OTH1bjHBgoqErqxNyCzcrBffn7b.webp

中断框图

../../_images/image_QgONbwADPoWLwSxIvQncR5YGnge.webp

中断屏蔽寄存器(Interrupt Mask Register):此寄存器用于屏蔽或禁用特定的中断,使其不会触发中断服务例程。当某个位设置为1时,对应的中断将被屏蔽。
请求挂起寄存器(Interrupt Pending Register):此寄存器用于存储当前挂起的中断请求。如果对应位为1,则表明相应的中断是挂起状态。
软件中断事件寄存器(Software Interrupt Event Register):此寄存器允许软件生成中断。通过写入此寄存器,可以触发与特定中断源相关联的中断服务例程。
上升沿触发选择寄存器(Rising Edge Trigger Selection Register):此寄存器选择在信号的上升沿时触发中断。
下降沿触发选择寄存器(Falling Edge Trigger Selection Register):此寄存器选择在信号的下降沿时触发中断。
边沿检测电路(Edge Detection Circuit):这是硬件电路,用于检测信号边沿的变化(上升沿或下降沿),从而触发中断。
时间屏蔽寄存器(Timing Mask Register):此寄存器用于屏蔽在特定时间内发生的中断,通常用于消除误触发的中断。
脉冲发生器(Pulse Generator):在硬件中,脉冲发生器可以生成一系列的脉冲,用于触发定时或同步的事件,包括中断。
NVIC(Nested Vectored Interrupt Controller):是ARM Cortex-M核心的一部分,用于管理中断。它支持优先级嵌套的中断,以及中断向量,即指向中断服务例程的指针。

功能复用

在许多微控制器和处理器中,一些特定的物理引脚可以配置成不同的功能,这就是所谓的引脚复用(Pin Multiplexing)。理解引脚复用的关键是理解一些引脚可以在不同的硬件模块间切换,这样可以在硬件设计时提供更大的灵活性。引脚复用的目的主要是节省空间和成本,因为这样可以减少物理引脚的数量。

../../_images/image_Z0NibLT3DoSbtyxY4Pkc8OyVn6c.webp

一个嵌入式芯片的物理引脚可能被设计为在以下几种功能之间切换:

  • 作为GPIO,进行通用的数字输入/输出;

  • 作为SPI接口的一部分,用于与其他SPI设备通信;

  • 作为UART接口的一部分,用于串行通信;

  • 或者,它可能有一些其他特定的功能,如ADC输入,PWM输出等。

在设计嵌入式系统时,你可以根据你的硬件和软件需求配置这些引脚。一些嵌入式平台还允许你在运行时动态切换这些引脚的功能,这为嵌入式系统设计提供了极大的灵活性。

当然,引脚复用也有其局限性。例如,一个引脚不能同时执行两种或更多的功能,因此在设计系统时需要考虑到这一点。引脚复用的管理也可能增加系统的复杂性,并可能需要更多的软件支持来正确配置和使用这些引脚。

按键消抖

按键消抖是在电子系统中处理机械按键输入时的常见问题。由于机械按键的接触特性,当按键被按下或释放时,接触点可能会快速打开和关闭多次,导致短时间内的多次电平变化。这被称为“抖动”。如果不处理抖动,系统可能会误认为按键被多次按下或释放。因此,需要采取措施消除或至少减少这种抖动的影响。

消抖的方法主要分为两类:硬件消抖和软件消抖。

硬件消抖

硬件消抖的主要目标是处理机械按键产生的抖动,从而使电路得到一个稳定、无干扰的电平信号。以下是几种常用的硬件消抖方法:

RC滤波器

构成:

  • 电阻(R): 连接于按键的一端。

  • 电容(C): 从按键的另一端连接到地线。

特性:

  • 低通滤波器: 由于其构造,RC滤波器允许低频信号通过而过滤高频信号。

工作原理:

  • 当按键被按下或释放,电容会开始充电或放电。因此,对于快速的电压变化(如由于接触抖动导致的),RC滤波器会平滑这些变化,从而防止误判。

  • 这种平滑效果的强度由RC时间常数(τ = R×C)决定。此时间常数表示电容充电到其初始电压的63.2%所需的时间。

常用参数:

  • 电阻(R): 通常在1kΩ到10kΩ范围内。

  • 电容(C): 通常在0.1µF到10µF范围内。

优点:

  1. 简单性: 仅需要两个基本组件。

  2. 经济性: 电阻和电容都是低成本元件。

  3. 有效性: 对于大多数常规应用,其消抖能力足够。

缺点:

  1. 延迟: 过大的RC时间常数可能导致按键响应的不必要延迟。

  2. 环境敏感性: 温度和湿度的变化可能影响电容的值,进而影响消抖效果。

  3. 不适用于所有应用: 对于需要快速响应的应用,RC滤波器可能不是最佳选择。

在使用RC滤波器作为按键硬件消抖策略时,关键在于选择合适的R和C值,使得滤波器能够有效地过滤掉抖动,同时不会引入过多的响应延迟。在设计阶段,可能需要进行实验,测试不同的R和C组合,以找到最佳的消抖效果。

Schmitt触发器:

Schmitt触发器 本质上是一个带有双阈值的电压比较器。它可以是独立的组件,也可以是微控制器内部的一部分。

特性:

  • 双阈值: Schmitt触发器的主要特性是其具有两个阈值 — 上阈值(Vt+)和下阈值(Vt-)。

工作原理:

  • 当输入电压上升并超过上阈值(Vt+)时,输出切换到高状态。

  • 当输入电压下降并低于下阈值(Vt-)时,输出切换到低状态。

  • 这种特性可以确保在输入电压发生微小变化(如因抖动)时,输出状态不会改变,从而有效地过滤抖动。

常用参数:

  • 上阈值(Vt+)下阈值(Vt-): 这两个阈值之间的差距称为滞后或死区。

优点:

  1. 消抖效果好: 由于双阈值特性,Schmitt触发器对输入噪声和抖动具有很强的容忍性。

  2. 明确的输出: 输出始终是一个明确的高或低电平,不会在两者之间浮动。

  3. 广泛可用: 很多微控制器的GPIO输入都内置了可选的Schmitt触发器。

缺点:

  1. 可能的延迟: 在某些情况下,如果输入信号的变化速度较慢,触发器可能导致轻微的延迟。

  2. 不适合快速信号: 对于频率较高的信号,Schmitt触发器可能不是最佳选择,因为它可能会导致信号失真。

  3. 成本: 虽然许多微控制器都内置了Schmitt触发器,但如果需要外部触发器,则可能会增加成本。

电容并联

构成:

  • 电容 (C): 直接与按键并联,通常与按键的一个端连接并与地线相连接。

特性:

  • 延迟充电/放电: 由于电容的特性,它需要一定的时间来充电和放电。

工作原理:

  • 当按键未被按下时,电容处于放电状态。

  • 当按键被按下时,电容开始充电,但需要一定的时间才能完全充满。这种充电行为有助于滤除按键按下时可能出现的短时间抖动。

  • 类似地,当按键被释放时,电容也会在一定的时间内放电,从而也可以消除可能的释放抖动。

常用参数:

  • 电容值: 常用的值为1nF到10µF。具体值取决于系统的特定需求和按键抖动的频率。

优点:

  1. 简单: 只需一个电容,且连线也相对简单。

  2. 成本低: 电容是普遍且廉价的元件。

  3. 效果明显: 对于大多数常规的按键抖动,它提供了相当有效的消抖。

缺点:

  1. 可能的延迟: 过大的电容可能导致按钮响应的明显延迟。

  2. 环境敏感: 电容的值可能受到温度和湿度的影响,从而可能影响消抖效果。

  3. 电源噪声: 如果系统中的其他部分产生电源噪声,大的并联电容可能会增大这些噪声。

  4. 不适合所有应用: 在某些需要非常快速响应的应用中,电容并联方法可能不适用。

RS触发器

构成:

  • RS触发器 通常是由两个NAND门或NOR门构成的基础双稳态电路。

  • 有两个输入: R (Reset) 和 S (Set)。

  • 有两个输出: Q~Q (Q的反相)。

特性:

  • 双稳态: RS触发器在任何时候都有两个稳定的输出状态。

工作原理:

  • S 输入为1且 R 输入为0时,Q 输出为1,而 ~Q 输出为0。

  • R 输入为1且 S 输入为0时,Q 输出为0,而 ~Q 输出为1。

  • 当两个输入都为0时,RS触发器保持在当前状态。

  • 当两个输入都为1时,是不被允许的状态,并可能导致不确定的输出。

为了消除按键抖动,RS触发器可以配置为只有在按键真正按下或释放时才改变其状态。与按键相关的任何短暂抖动都不会导致RS触发器的输出发生更改,从而有效地消除了抖动。

常用参数:

  • 输入逻辑级别: 对于NAND版本的RS触发器,正常逻辑级别为1,对于NOR版本的RS触发器,正常逻辑级别为0。

优点:

  1. 高效消抖: RS触发器为按键提供了稳定的输出,无论输入多么嘈杂。

  2. 明确的输出状态: 在任何给定时间,都有一个明确的高或低输出。

  3. 低成本: RS触发器可以使用基础的逻辑门构建。

缺点:

  1. 复杂性: 相对于简单的电容并联或Schmitt触发器方法,这需要更多的组件和更复杂的布线。

  2. 不允许的状态: RS触发器有一个不允许的输入状态,需要小心设计以避免。

  3. 电源需求: 需要为触发器提供适当的电源。

专用消抖电路

市场上也有一些专用的消抖IC,例如MAX6816、MAX6817和MAX6818。这些IC内部包含了滤波和Schmitt触发器,可以直接连接到按键并提供稳定的数字输出。

备注

注意:

  1. 选择的消抖方法和组件值应考虑按键的抖动频率和持续时间。

  2. 如果使用RC滤波器,需要确保RC时间常数既可以消除抖动,又不会过度延迟按键响应。

  3. 当在噪音环境中工作时,可能需要考虑其他因素,如外部电磁干扰。

  4. 测试是关键:在设计完成后,应该对系统进行足够的测试,以确保消抖电路在所有预期条件下都能正常工作。

软件消抖

软件消抖是通过在软件层面使用算法和逻辑来消除按键抖动。与硬件消抖方法相比,软件消抖方法对于不同的应用和条件提供了更多的灵活性,但它也增加了一些处理负担。

以下是一些常见的嵌入式软件消抖技术:

软件延时

工作原理:

当检测到按键的状态改变(例如从未按下变为按下状态),而不是立即响应这一改变,程序会等待一个预定的延迟时间。在这段延迟时间结束后,程序再次检测按键的状态。如果按键状态保持不变,那么这个按键动作被认为是有效的,程序则会响应这一按键动作;否则,它会认为是误报或抖动,所以不会产生响应。

优点:

  1. 简单实现:延时消抖是最简单和直接的软件消抖技术。只需在按键状态改变后添加一个延迟函数,然后再次检测状态。

  2. 不需要额外资源:与其他方法相比,如使用计数器或有限状态机,延时消抖不需要额外的存储或计数资源。

缺点:

  1. 响应延迟:由于需要等待预定的延迟时间来确认按键动作,这会导致用户感知的响应延迟。

  2. CPU时间浪费:如果使用的是忙等待(busy-waiting)来实现延迟,那么CPU将在这段时间里无法进行其他任务,这在资源受限的嵌入式系统中是不可接受的。

  3. 不够可靠:如果抖动的时间超过了预定的延迟时间,这种方法可能仍然会误报。另外,如果设置的延迟时间太长,可能会错过快速的连续按键动作。

计数器

工作原理:

当检测到按键状态改变时,系统并不立刻确认这一改变。相反,它启动一个计数器。在连续的几次检测中,如果按键状态持续保持改变状态,计数器就增加;如果按键返回到原始状态,计数器则重置。只有当计数器值达到一个预设的阈值时,按键状态的改变才被认为是真正的按键动作,并由系统响应。这样,短暂的抖动不会让计数器达到阈值,因此不会被误判为有效的按键动作。

优点:

  1. 可靠性高:与简单的延时消抖相比,计数器消抖能够更可靠地滤除短时间的抖动。

  2. 响应性好:如果按键确实被持续按下,系统可以在较短的时间内确认按键动作,从而提供较好的响应性。

  3. 灵活性:可以根据需要调整计数器的阈值,以适应不同的按键和抖动特性。

缺点:

  1. 资源消耗:需要为每个按键使用一个计数器或为系统使用一个全局计数器。这可能会消耗额外的存储资源和计时资源。

  2. 复杂性增加:相较于简单的延时消抖,计数器消抖在实现上稍微复杂一些,特别是在有多个按键需要处理的场合。

  3. 可能的延迟:如果设定的计数器阈值过高,可能导致系统响应的延迟,降低用户体验。

有限状态机(FSM)

工作原理:

使用有限状态机(FSM)来消抖涉及到为按键定义多个状态,并且基于当前状态和输入来决定下一个状态。

典型的按键FSM可能有以下几种状态:未按下可能按下已按下可能释放。初始状态为 未按下

  • 当按键被按下,FSM转移到 可能按下 状态,并启动计时器。

  • 如果计时器达到指定时间并且按键仍然被按下,FSM转移到 已按下 状态。

  • 当按键释放,FSM转移到 可能释放 状态,再次启动计时器。

  • 如果计时器达到指定时间并且按键仍然是释放状态,FSM返回到 未按下 状态。

这样,只有当按键稳定地保持在一个状态超过指定的时间,它的状态才会被系统确认。短时间的抖动不会导致状态转移,从而达到消抖的效果。

优点:

  1. 高度可靠:FSM能够准确地识别和忽略短暂的抖动。

  2. 灵活性:FSM结构允许开发者添加更多的状态和逻辑,例如双击、长按等特殊情况。

  3. 清晰的逻辑结构:FSM为按键处理提供了清晰、结构化的框架,便于理解和维护。

缺点:

  1. 实现复杂性:相较于其他软件消抖技术,FSM消抖需要更复杂的代码和逻辑。

  2. 资源使用:FSM可能需要使用到计时器或中断,以及额外的存储来保存状态。

  3. 可能的延迟:基于FSM结构和使用的计时器,可能导致按键响应的延迟。

注意事项

电源和地:

  • 确保GPIO所连接的设备和主控制器共享同一个地(GND)。

  • 避免将GPIO引脚连接到超出其指定电压范围的电压,这可能会导致损坏。

电流限制:

  • 每个GPIO引脚都有一个最大源电流和沉电流限制。超出这些限制可能会损坏引脚或整个芯片。

  • 使用适当的电阻来限制连接到GPIO引脚的电流。

输入模式:

  • 当GPIO设置为输入模式时,确保不要向其输出电压。

  • 未连接的(悬空的)输入引脚可能会读取随机值,因此通常建议使用上拉或下拉电阻。

输出模式:

  • 不要将两个GPIO输出引脚直接相连,否则当它们输出不同的电平时,可能会导致短路。

  • 当引脚设置为输出模式时,避免对其施加外部电压。

防抖动:

  • 当使用GPIO读取机械开关或按钮时,可能会出现抖动。使用硬件或软件的防抖动技术来处理。

具体实现参考 消抖章节

中断:

  • 对于需要快速响应的应用,使用GPIO中断而不是轮询GPIO状态。

  • 确保中断处理程序(ISR)尽可能短,并避免在其中进行长时间的处理。

保护电路:

  • 使用适当的保护,如瞬态电压抑制器(TVS)二极管,以保护GPIO引脚免受电压尖峰的影响。

  • 对于需要处理模拟信号的应用,考虑使用RC滤波器。

外设冲突:

  • 在某些微控制器上,一些GPIO引脚可能与其他功能(如PWM、ADC、通信接口)共用。确保在设计时考虑这些潜在的冲突。

热设计:

  • 当大电流通过GPIO引脚时,需要考虑其对温度的影响,因为这可能导致过热。

固件/软件考虑因素:

  • 在修改GPIO的配置或状态前,清楚地了解当前的设置。

  • 在启动期间,初始化所有GPIO到一个已知状态,以避免不确定行为。

EMI/RFI:

  • GPIO线可能成为电磁干扰(EMI)或射频干扰(RFI)的源或受害者。考虑使用适当的布局、接地和屏蔽技术来减少干扰。

API说明

头文件

头文件

描述

qosa_pinctrl.h

包含引脚功能配置相关接口,用于设置引脚复用模式、上拉/下拉等物理特性

qosa_gpio.h

包含GPIO功能操作接口,电平读写、中断触发及回调注册等GPIO功能。

qosa_dev_eigen.h

包含EIGEN平台特有接口、设置GPIO电压域 qosa_gpio_set_voltage()

GPIO函数表

函数名

描述

qosa_gpio_init()

GPIO初始化函数

qosa_gpio_deinit()

GPIO反初始化函数

qosa_get_pin_default_cfg()

获取Pin脚的默认配置

qosa_pin_set_func()

用于配置对应模组引脚的功能

qosa_pin_get_func()

用于获取对应模组引脚的功能

qosa_gpio_set_direction()

设置GPIO的输入/输出模式

qosa_gpio_get_direction()

获取GPIO的配置模式

qosa_gpio_set_pull()

设置GPIO的上拉/下拉模式

qosa_gpio_get_pull()

获取GPIO的上下拉模式

qosa_gpio_set_level()

设置GPIO的输出电平

qosa_gpio_get_level()

读取引脚当前电平

qosa_interrupt_register()

注册GPIO中断回调函数

qosa_interrupt_unregister()

用于取消注册中断回调函数,仅对输入引脚有效

qosa_interrupt_enable()

用于使能中断回调函数

qosa_interrupt_disable()

用于禁用中断回调函数

qosa_gpio_set_voltage()

用于设置GPIO电压域,仅EIGEN平台可用

函数定义

qosa_pinctrl_set_option

函数原型:

qosa_pinctrl_error_e qosa_pinctrl_set_option(qosa_pin_num_e pin_num, pinctrl_option_t option)

功能描述: 此功能用于配置指定引脚的功能选择、上拉/下拉以及驱动强度等属性。

参数描述:

  • pin_num 需要配置功能的pin脚号,qosa_pin_num_e 类型。

  • optionpinctrl_option_t 类型,包含以下内容的引脚配置选项结构:

名称

取值范围

描述

func(bit0~bit3)

0~15

引脚功能选择

pull(bit4~bit5)

0~2

配置上下拉模式,0=关闭,1=下拉,2=上拉

driver(bit5~bit7)

0~7

引脚的驱动强度

smit(bit8)

0~1

Smit触发器配置,0=关闭,1=开启

reserved(bit9~bit31)

0

保留位,必须设置为0

返回值:

  • qosa_pinctrl_error_e 类型,成功返回 QOSA_PINCTRL_SUCCESS,失败返回具体错误码。

示例

qosa_pin_num_e pin_num;
pinctrl_option_t pin_opt;

qosa_get_pin_default_cfg(pin_num, &pin_cfg);
qosa_pin_set_func(pin_num, pin_cfg.gpio_func);

qosa_pin_set_func

函数原型:

qosa_pinctrl_error_e qosa_pin_set_func(qosa_pin_num_e pin_num, qosa_uint8_t func_sel)

功能描述: 用于配置对应模组引脚的功能。

参数描述:

  • pin_num 需要配置功能的pin脚号,qosa_pin_num_e 类型。

  • func_sel 需要配置的功能,qosa_uint8_t 类型,可从引脚默认配置获取。

返回值:

  • qosa_pinctrl_error_e 类型,成功返回 QOSA_PINCTRL_SUCCESS

示例

qosa_pin_num_e pin_num;
qosa_pin_cfg_t pin_cfg;

qosa_get_pin_default_cfg(pin_num, &pin_cfg);
qosa_pin_set_func(pin_num, pin_cfg.gpio_func);

qosa_pin_get_func

函数原型

qosa_pinctrl_error_e qosa_pin_get_func(qosa_pin_num_e pin_num, qosa_uint8_t *func_sel)

功能描述: 用于获取对应模组引脚的功能。

参数描述:

  • pin_num :需要获取配置功能的pin脚号,qosa_pin_num_e 类型。

  • func_sel:用于接收获取到的配置功能,qosa_uint8_t* 类型。

返回值:

  • qosa_pinctrl_error_e 类型,成功返回 QOSA_PINCTRL_SUCCESS

示例

qosa_pin_num_e pin_num;
qosa_uint8_t   func_sel;

qosa_pin_get_func(pin_num, &func_sel)

qosa_gpio_init

函数原型

qosa_gpio_error_e qosa_gpio_init(qosa_gpio_num_e gpio_num, qosa_gpio_direction_e gpio_direction, qosa_gpio_pull_e gpio_pull, qosa_gpio_level_e gpio_level)

功能描述: 配置GPIO初始化配置,包括方向、上拉/下拉和输出电平。

参数描述:

  • gpio_num 需要初始化的GPIO引脚号,qosa_gpio_num_e 类型。

  • gpio_direction 输入输出模式,qosa_gpio_direction_e 类型。

  • gpio_pull 上拉下拉模式,qosa_gpio_pull_e 类型。

  • gpio_level 引脚电平,qosa_gpio_level_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_init(QOSA_GPIO_0, QOSA_GPIO_DIRECTION_INPUT, QOSA_GPIO_PULL_DOWN, QOSA_GPIO_LEVEL_LOW);  // Configure as input with pull-down
qosa_gpio_init(QOSA_GPIO_1, QOSA_GPIO_DIRECTION_OUTPUT, QOSA_GPIO_PULL_UP, QOSA_GPIO_LEVEL_HIGH);   // Configure as output with high level

qosa_gpio_deinit

函数原型

qosa_gpio_error_e qosa_gpio_deinit(qosa_gpio_num_e gpio_num)

功能描述: 去初始化GPIO配置。

参数描述:

  • gpio_num 需要取消初始化的GPIO引脚号,qosa_gpio_num_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_deinit(QOSA_GPIO_0);
qosa_gpio_deinit(QOSA_GPIO_1);

qosa_get_pin_default_cfg

函数原型

qosa_gpio_error_e qosa_get_pin_default_cfg(qosa_uint8_t pin_num, qosa_pin_cfg_t *pin_cfg)

功能描述: 用于获取对应pin脚的默认配置。

参数描述:

  • pin_num 需要获取默认配置的pin脚号,qosa_uint8_t 类型。

  • pin_cfg 用于接收获取的默认配置,qosa_pin_cfg_t * 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_uint8_t   pin_num;
qosa_pin_cfg_t pin_cfg;

qosa_get_pin_default_cfg(pin_num, &pin_cfg);

qosa_gpio_set_level

函数原型

qosa_gpio_error_e qosa_gpio_set_level(qosa_gpio_num_e gpio_num, qosa_gpio_level_e gpio_level)

功能描述: 用于设置指定GPIO的引脚电平。

参数描述:

  • gpio_num 需要设置引脚电平的GPIO引脚号,仅对输出引脚有效,qosa_gpio_num_e 类型。

  • gpio_level 需要设置的输出电平,qosa_gpio_level_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

备注

注意: 设置高低电平前需要保证引脚为输出模式。

示例

qosa_gpio_set_level(QOSA_GPIO_0, QOSA_GPIO_LEVEL_LOW);
qosa_gpio_set_level(QOSA_GPIO_1, QOSA_GPIO_LEVEL_HIGH);

qosa_gpio_get_level

函数原型

qosa_gpio_error_e qosa_gpio_get_level(qosa_gpio_num_e gpio_num, qosa_gpio_level_e *gpio_level)

功能描述: 用于获取指定GPIO的引脚电平。

参数描述:

  • gpio_num 需要获取引脚电平的GPIO引脚号,qosa_gpio_num_e 类型。

  • gpio_level 用于接收当前引脚电平,qosa_gpio_level_e* 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_level_e  gpio_level;
qosa_gpio_get_level(QOSA_GPIO_0, &gpio_level);

qosa_gpio_set_direction

函数原型

qosa_gpio_error_e qosa_gpio_set_direction(qosa_gpio_num_e gpio_num, qosa_gpio_direction_e gpio_direction)

功能描述: 用于设置GPIO引脚输入/输出方向。

参数描述:

  • gpio_num 需要设置输入输出模式的GPIO引脚号,qosa_gpio_num_e 类型。

  • gpio_direction 需要设置的配置模式值,qosa_gpio_direction_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_set_direction(QOSA_GPIO_0, QOSA_GPIO_DIRECTION_INPUT);
qosa_gpio_set_direction(QOSA_GPIO_1, QOSA_GPIO_DIRECTION_OUTPUT);

qosa_gpio_get_direction

函数原型

qosa_gpio_error_e qosa_gpio_get_direction(qosa_gpio_num_e gpio_num, qosa_gpio_direction_e *gpio_direction)

功能描述: 用于获取指定GPIO的引脚输入/输出方向。

参数描述:

  • gpio_num 需要获取模式的GPIO引脚号,qosa_gpio_num_e 类型。

  • gpio_direction 用于接收获取的配置模式值,qosa_gpio_direction_e* 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_direction_e gpio_direction;
qosa_gpio_get_direction(QOSA_GPIO_0, &gpio_direction);

qosa_gpio_set_pull

函数原型

qosa_gpio_error_e qosa_gpio_set_pull(qosa_gpio_num_e gpio_num, qosa_gpio_pull_e gpio_pull)

功能描述: 用于配置指定GPIO的上下拉设置,仅对输入引脚有效。

参数描述:

  • gpio_num 需要设置输入输出模式的GPIO引脚号,qosa_gpio_num_e 类型。

  • gpio_pull 需要设置的上下拉模式,qosa_gpio_pull_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_set_pull(QOSA_GPIO_0, QOSA_GPIO_PULL_DOWN);
qosa_gpio_set_pull(QOSA_GPIO_1, QOSA_GPIO_PULL_UP);

qosa_gpio_get_pull

函数原型

qosa_gpio_error_e qosa_gpio_get_pull(qosa_gpio_num_e gpio_num, qosa_gpio_pull_e *gpio_pull)

功能描述: 用于获取指定GPIO的上下拉属性。

参数描述:

  • gpio_num 需要获取模式的GPIO引脚号,qosa_gpio_num_e 类型。

  • gpio_pull 用于接收获取的上下拉模式值,qosa_gpio_pull_e* 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

示例

qosa_gpio_pull_e  gpio_pull
qosa_gpio_get_pull(QOSA_GPIO_0, &gpio_pull);

qosa_interrupt_register

函数原型

qosa_gpio_error_e qosa_interrupt_register(qosa_int_cfg_t *int_cfg)

功能描述: 该函数用于为指定的GPIO引脚注册中断配置,包括中断触发模式和中断回调函数。注册后,当GPIO引脚产生中断时,系统将调用相应的回调函数进行处理。

参数描述:

  • int_cfg:指向中断配置结构体的指针,qosa_int_cfg_t * 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

备注

注意:

  1. 该函数会初始化GPIO为输入模式,并根据配置设置上拉/下拉电阻。

  2. 注册中断后需要调用相应的中断使能函数才能真正触发中断。

  3. 该函数应在 qosa_interrupt_enable() 之前调用以完成中断配置。

qosa_interrupt_unregister

函数原型

qosa_gpio_error_e qosa_interrupt_unregister(qosa_gpio_num_e gpio_num)

功能描述: 用于取消注册中断回调函数,仅对输入引脚有效。

参数描述:

  • gpio_num 配置要操作的GPIO引脚,qosa_gpio_num_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

qosa_interrupt_enable

函数原型

qosa_gpio_error_e qosa_interrupt_enable(qosa_gpio_num_e gpio_num, qosa_gpio_trigger_e pin_edge)

功能描述: 用于使能中断回调函数。

参数描述:

  • gpio_num 配置要操作的GPIO引脚,qosa_gpio_num_e 类型。

  • pin_edge 更新配置中断触发边缘,qosa_gpio_trigger_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

qosa_interrupt_disable

函数原型:

qosa_gpio_error_e qosa_interrupt_disable(qosa_gpio_num_e gpio_num)

功能描述: 用于禁用中断回调函数。

参数描述:

  • gpio_num 配置要操作的GPIO引脚,qosa_gpio_num_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

qosa_gpio_set_voltage

函数原型:

qosa_gpio_error_e qosa_gpio_set_voltage(qosa_gpio_vol_e gpio_vol);

功能描述: 用于EIGEN平台设置GPIO电压域。

参数描述:

  • gpio_vol 需要配置的电压域,qosa_gpio_vol_e 类型。

返回值:

  • qosa_gpio_error_e 类型,成功返回 QOSA_GPIO_SUCCESS

数据结构定义

qosa_pin_cfg_t

定义了pin脚对应的默认配置,原型如下:

typedef struct
{
    qosa_uint8_t          pin_num;      /*!<PIN NUM number to operate*/
    qosa_uint8_t          default_func; /*!<Default fun of PIN NUM to operate*/
    qosa_uint8_t          gpio_func;    /*!<GPIO fun corresponding to PIN NUM to operate */
    qosa_gpio_num_e       gpio_num;     /*!<GPIO NUM corresponding to PIN NUM to operate */
    qosa_gpio_direction_e gpio_dir;     /*!<Direction of PIN NUM to operate, input or output */
    qosa_gpio_pull_e      gpio_pull;    /*!<Default pull-up/pull-down of PIN NUM to operate */
    qosa_gpio_level_e     gpio_lvl;     /*!<Default output level of PIN NUM to operate */
} qosa_pin_cfg_t;

qosa_int_cfg_t

typedef struct
{
    qosa_gpio_num_e      gpio_num;      /*!<GPIO NUM number to operate*/
    qosa_gpio_debounce_e gpio_debounce; /*!<Hardware debounce switch*/
    qosa_gpio_pull_e     gpio_pull;     /*!<Configure GPIO pull-up or pull-down mode*/
    gpio_interrupt_cb    interrupt_cb;  /*!<GPIO interrupt callback function pointer*/
    qosa_uint32_t        options;       /*!<Whether to enable single or multiple interrupt mode--bit0*/
    void                *user_ctx;      /*!<User-defined context data, used to pass parameters in interrupt callback function*/
} qosa_int_cfg_t;

qosa_gpio_basic_isr_info_t

GPIO中断回调函数信息结构,原型如下:

typedef struct
{
    qosa_gpio_num_e   gpio_num;      /*!<GPIO NUM that generated interrupt callback*/
    qosa_gpio_level_e trigger_level; /*!<Level of corresponding GPIO*/
} qosa_gpio_basic_isr_info_t;

枚举定义

qosa_gpio_num_e

qosa_gpio_num_e 定义了GPIO引脚号,原型如下(仅展示部分):

typedef enum
{
    QOSA_GPIO_0 = 0,
    QOSA_GPIO_1,
    QOSA_GPIO_2,
    QOSA_GPIO_3,
    QOSA_GPIO_4,
    QOSA_GPIO_5,
    QOSA_GPIO_6,
    ......
    QOSA_GPIO_MAX
}qosa_gpio_num_e;

qosa_gpio_direction_e

qosa_gpio_direction_e 定义了GPIO引脚的输入输出模式,原型如下:

typedef enum
{
    QOSA_GPIO_DIRECTION_INPUT, /*!< GPIO PIN input */
    QOSA_GPIO_DIRECTION_OUTPUT /*!< GPIO PIN output */
} qosa_gpio_direction_e;

qosa_gpio_pull_e

qosa_gpio_pull_e 定义了GPIO引脚的上拉下拉模式,原型如下:

typedef enum
{
    QOSA_GPIO_PULL_NONE, /*!< GPIO PIN input pull none */
    QOSA_GPIO_PULL_DOWN, /*!< GPIO PIN input pull down */
    QOSA_GPIO_PULL_UP    /*!< GPIO PIN input pull up */
} qosa_gpio_pull_e;

qosa_gpio_level_e

qosa_gpio_level_e 定义了GPIO引脚的高低电平,原型如下:

typedef enum
{
    QOSA_GPIO_LEVEL_LOW, /*!<GPIO PIN output low level*/
    QOSA_GPIO_LEVEL_HIGH /*!<GPIO PIN output high level*/
} qosa_gpio_level_e;

qosa_gpio_error_e

qosa_gpio_error_e 定义了GPIO操作的错误代码,原型如下:

typedef enum
{
    QOSA_GPIO_SUCCESS = 0,                                       /*!<Indicates GPIO operation successful*/
    QOSA_GPIO_EXECUTE_ERR = 1 | (QOSA_COMPONENT_BSP_GPIO << 16), /*!<Indicates GPIO operation execution failed*/
    QOSA_GPIO_CFG_NOT_SUPPORT_ERR,                               /*!<Indicates GPIO operation not supported*/
    QOSA_GPIO_INVALID_PARAM_ERR,                                 /*!<Indicates GPIO operation parameter invalid*/
    QOSA_GPIO_OPEN_ERR,                                          /*!<Indicates GPIO operation open failed*/
    QOSA_GPIO_CONFIG_ERR,                                        /*!<Indicates GPIO operation configuration failed*/
    QOSA_GPIO_CALLBACK_ERR,                                      /*!<Indicates GPIO operation callback failed*/
    QOSA_GPIO_LEVEL_TRIGGER_ERR,                                 /*!<Indicates GPIO operation trigger mode setting failed*/
    QOSA_GPIO_MEM_NULL_ERR,                                      /*!<Indicates GPIO operation memory is null*/
    QOSA_GPIO_SET_DRVING_ERR,                                    /*!<Indicates GPIO operation driving capability setting failed*/
} qosa_gpio_error_e;

qosa_gpio_trigger_e

定义了GPIO中断的触发模式,原型如下:

typedef enum
{
    QOSA_GPIO_TRIGGER_DISABLED,     /*!<Disable interrupt*/
    QOSA_GPIO_TRIGGER_LOW_LEVEL,    /*!<Low-level interrupt*/
    QOSA_GPIO_TRIGGER_HIGH_LEVEL,   /*!<High-level interrupt*/
    QOSA_GPIO_TRIGGER_FALLING_EDGE, /*!<Falling edge interrupt*/
    QOSA_GPIO_TRIGGER_RISING_EDGE,  /*!<Rising edge interrupt*/
    QOSA_GPIO_TRIGGER_BOTH_EDGE     /*!<Falling and rising edge interrupt*/
} qosa_gpio_trigger_e;

qosa_gpio_debounce_e

GPIO中断去抖处理,原型如下:

typedef enum
{
    QOSA_GPIO_DEBOUNCE_DIS, /*!<GPIO PIN debounce disable*/
    QOSA_GPIO_DEBOUNCE_EN   /*!<GPIO PIN debounce enable*/
} qosa_gpio_debounce_e;

qosa_gpio_vol_e

可选电压域,原型如下:

typedef enum
{
    VOL_1_80V, /* 1.8V */
    VOL_3_30V /* 3.3V */
}qosa_gpio_vol_e;

应用示例

请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/gpio/gpio_demo.c