GPIO- 通用输入输出
基础知识
了解GPIO基础知识更有益于我们使用它。
框图
GPIO(通用输入输出)是指一种通用的数字输入/输出接口,用于与外部电子元件或设备进行通信。它通常存在于微处理器、微控制器和其他嵌入式系统中。
物理电路结构如下图所示:
I/O pin: 微控制器或微处理器中的实际硬件接口,用于连接外部设备。每一个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 端口的电平变化的状态
上拉输入
GPIO 引脚和电源电压 (VDD) 之间连接有上拉电阻。 因此,当 GPIO 引脚未被设备主动驱动时,它会被“上拉”至逻辑高电平。 当需要 GPIO 引脚的默认状态为高电平时,需配置为上拉模式。
与前面介绍的浮空输入模式相比,仅仅是在数据通道上面,接入了一个上拉电阻,这个上拉电阻阻值一般介于30K~50KΩ。在I/O口无信号输入的情况下,输入端的电平可以保持在高电平(VDD经过上拉电阻);并且在I/O端口输入为低电平的时候,输入端的电平就是低电平(可以理解为电阻分压)。
下拉输入
GPIO 引脚与地 (VSS) 之间连接有下拉电阻。 当 GPIO 引脚未被设备主动驱动时,这会将其拉至逻辑低电平。 当需要GPIO 引脚的默认状态为低电平时,需配置为下拉模式。
对于输入下拉模式的输入,是在数据通道的下部,接入了一个下拉电阻。这个下拉电阻阻值一般介于30K~50KΩ。
模拟输入
无上下拉电阻,电信号不经过施密特触发器,直接进入模拟输入通道,一般用于ADC数据采集。
开漏输出
在开漏(Open-Drain)输出模式下,GPIO引脚只能主动将电压拉低(通过连接到地线),不能主动将电压拉高。要实现电压的拉高,需要配合一个外部的上拉电阻连接到电源。 开漏输出的一个常见应用是I²C通信,其中多个设备可以共享同一条数据线。
当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、电机等负载。
推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。
中断框图
中断屏蔽寄存器(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)。理解引脚复用的关键是理解一些引脚可以在不同的硬件模块间切换,这样可以在硬件设计时提供更大的灵活性。引脚复用的目的主要是节省空间和成本,因为这样可以减少物理引脚的数量。
一个嵌入式芯片的物理引脚可能被设计为在以下几种功能之间切换:
- 作为 GPIO,进行通用的数字输入/输出;
- 作为 SPI 接口的一部分,用于与其他 SPI 设备通信;
- 作为 UART 接口的一部分,用于串行通信;
- 或者,它可能有一些其他特定的功能,如 ADC 输入,PWM 输出等。
在设计嵌入式系统时,你可以根据你的硬件和软件需求配置这些引脚。一些嵌入式平台还允许你在运行时动态切换这些引脚的功能,这为嵌入式系统设计提供了极大的灵活性。
当然,引脚复用也有其局限性。例如,一个引脚不能同时执行两种或更多的功能,因此在设计系统时需要考虑到这一点。引脚复用的管理也可能增加系统的复杂性,并可能需要更多的软件支持来正确配置和使用这些引脚。
消抖
按键消抖是在电子系统中处理机械按键输入时的常见问题。由于机械按键的接触特性,当按键被按下或释放时,接触点可能会快速打开和关闭多次,导致短时间内的多次电平变化。这被称为“抖动”。如果不处理抖动,系统可能会误认为按键被多次按下或释放。因此,需要采取措施消除或至少减少这种抖动的影响。
消抖的方法主要分为两类:硬件消抖和软件消抖。
硬件消抖
硬件消抖的主要目标是处理机械按键产生的抖动,从而使电路得到一个稳定、无干扰的电平信号。以下是几种常用的硬件消抖方法:
RC滤波器
构成:
- 电阻(R): 连接于按键的一端。
- 电容(C): 从按键的另一端连接到地线。
特性:
- 低通滤波器: 由于其构造,RC滤波器允许低频信号通过而过滤高频信号。
工作原理:
- 当按键被按下或释放,电容C会开始充电或放电。因此,对于快速的电压变化(如由于接触抖动导致的),RC滤波器会平滑这些变化,从而防止误判。
- 这种平滑效果的强度由RC时间常数(τ = R×C)决定。此时间常数表示电容充电到其初始电压的63.2%所需的时间。
常用参数:
- 电阻(R): 通常在1kΩ到10kΩ范围内。
- 电容(C): 通常在0.1µF到10µF范围内。
优点:
- 简单性: 仅需要两个基本组件。
- 经济性: 电阻和电容都是低成本元件。
- 有效性: 对于大多数常规应用,其消抖能力足够。
缺点:
- 延迟: 过大的RC时间常数可能导致按键响应的不必要延迟。
- 环境敏感性: 温度和湿度的变化可能影响电容的值,进而影响消抖效果。
- 不适用于所有应用: 对于需要快速响应的应用,RC滤波器可能不是最佳选择。
在使用RC滤波器作为按键硬件消抖策略时,关键在于选择合适的R和C值,使得滤波器能够有效地过滤掉抖动,同时不会引入过多的响应延迟。在设计阶段,可能需要进行实验,测试不同的R和C组合,以找到最佳的消抖效果。
Schmitt触发器:
构成:
- Schmitt触发器 本质上是一个带有双阈值的电压比较器。它可以是独立的组件,也可以是微控制器内部的一部分。
特性:
- 双阈值: Schmitt触发器的主要特性是其具有两个阈值 — 上阈值(Vt+)和下阈值(Vt-)。
工作原理:
- 当输入电压上升并超过上阈值(Vt+)时,输出切换到高状态。
- 当输入电压下降并低于下阈值(Vt-)时,输出切换到低状态。
- 这种特性可以确保在输入电压发生微小变化(如因抖动)时,输出状态不会改变,从而有效地过滤抖动。
常用参数:
- 上阈值(Vt+) 和 下阈值(Vt-): 这两个阈值之间的差距称为滞后或死区。
优点:
- 消抖效果好: 由于双阈值特性,Schmitt触发器对输入噪声和抖动具有很强的容忍性。
- 明确的输出: 输出始终是一个明确的高或低电平,不会在两者之间浮动。
- 广泛可用: 很多微控制器的GPIO输入都内置了可选的Schmitt触发器。
缺点:
- 可能的延迟: 在某些情况下,如果输入信号的变化速度较慢,触发器可能导致轻微的延迟。
- 不适合快速信号: 对于频率较高的信号,Schmitt触发器可能不是最佳选择,因为它可能会导致信号失真。
- 成本: 虽然许多微控制器都内置了Schmitt触发器,但如果需要外部触发器,则可能会增加成本。
注意点:
- 选择的消抖方法和组件值应考虑按键的抖动频率和持续时间。
- 如果使用RC滤波器,需要确保RC时间常数既可以消除抖动,又不会过度延迟按键响应。
- 当在噪音环境中工作时,可能需要考虑其他因素,如外部电磁干扰。
- 测试是关键:在设计完成后,应该对系统进行足够的测试,以确保消抖电路在所有预期条件下都能正常工作。
电容并联
构成:
- 电容 (C): 直接与按键并联,通常与按键的一个端连接并与地线相连接。
特性:
- 延迟充电/放电: 由于电容的特性,它需要一定的时间来充电和放电。
工作原理:
- 当按键未被按下时,电容处于放电状态。
- 当按键被按下时,电容开始充电,但需要一定的时间才能完全充满。这种充电行为有助于滤除按键按下时可能出现的短时间抖动。
- 类似地,当按键被释放时,电容也会在一定的时间内放电,从而也可以消除可能的释放抖动。
常用参数:
- 电容值 (C): 常用的值为1nF到10µF。具体值取决于系统的特定需求和按键抖动的频率。
优点:
- 简单: 只需一个电容,且连线也相对简单。
- 成本低: 电容是普遍且廉价的元件。
- 效果明显: 对于大多数常规的按键抖动,它提供了相当有效的消抖。
缺点:
- 可能的延迟: 过大的电容可能导致按钮响应的明显延迟。
- 环境敏感: 电容的值可能受到温度和湿度的影响,从而可能影响消抖效果。
- 电源噪声: 如果系统中的其他部分产生电源噪声,大的并联电容可能会增大这些噪声。
- 不适合所有应用: 在某些需要非常快速响应的应用中,电容并联方法可能不适用。
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。
优点:
- 高效消抖: RS触发器为按键提供了稳定的输出,无论输入多么嘈杂。
- 明确的输出状态: 在任何给定时间,都有一个明确的高或低输出。
- 低成本: RS触发器可以使用基础的逻辑门构建。
缺点:
- 复杂性: 相对于简单的电容并联或Schmitt触发器方法,这需要更多的组件和更复杂的布线。
- 不允许的状态: RS触发器有一个不允许的输入状态,需要小心设计以避免。
- 电源需求: 需要为触发器提供适当的电源。
专用消抖电路
市场上也有一些专用的消抖IC,例如MAX6816、MAX6817和MAX6818。这些IC内部包含了滤波和Schmitt触发器,可以直接连接到按键并提供稳定的数字输出
注意点:
- 选择的消抖方法和组件值应考虑按键的抖动频率和持续时间。
- 如果使用RC滤波器,需要确保RC时间常数既可以消除抖动,又不会过度延迟按键响应。
- 当在噪音环境中工作时,可能需要考虑其他因素,如外部电磁干扰。
- 测试是关键:在设计完成后,应该对系统进行足够的测试,以确保消抖电路在所有预期条件下都能正常工作。
软件消抖
软件消抖是通过在软件层面使用算法和逻辑来消除按键抖动。与硬件消抖方法相比,软件消抖方法对于不同的应用和条件提供了更多的灵活性,但它也增加了一些处理负担。
以下是一些常见的嵌入式软件消抖技术:
延时
工作原理:
当检测到按键的状态改变(例如从未按下变为按下状态),而不是立即响应这一改变,程序会等待一个预定的延迟时间。在这段延迟时间结束后,程序再次检测按键的状态。如果按键状态保持不变,那么这个按键动作被认为是有效的,程序则会响应这一按键动作;否则,它会认为是误报或抖动,所以不会产生响应。
优点:
- 简单实现:延时消抖是最简单和直接的软件消抖技术。只需在按键状态改变后添加一个延迟函数,然后再次检测状态。
- 不需要额外资源:与其他方法相比,如使用计数器或有限状态机,延时消抖不需要额外的存储或计数资源。
缺点:
- 响应延迟:由于需要等待预定的延迟时间来确认按键动作,这会导致用户感知的响应延迟。
- CPU时间浪费:如果使用的是忙等待(busy-waiting)来实现延迟,那么CPU将在这段时间里无法进行其他任务,这在资源受限的嵌入式系统中是不可接受的。
- 不够可靠:如果抖动的时间超过了预定的延迟时间,这种方法可能仍然会误报。另外,如果设置的延迟时间太长,可能会错过快速的连续按键动作。
计数器
工作原理:
当检测到按键状态改变时,系统并不立刻确认这一改变。相反,它启动一个计数器。在连续的几次检测中,如果按键状态持续保持改变状态,计数器就增加;如果按键返回到原始状态,计数器则重置。只有当计数器值达到一个预设的阈值时,按键状态的改变才被认为是真正的按键动作,并由系统响应。这样,短暂的抖动不会让计数器达到阈值,因此不会被误判为有效的按键动作。
优点:
- 可靠性高:与简单的延时消抖相比,计数器消抖能够更可靠地滤除短时间的抖动。
- 响应性好:如果按键确实被持续按下,系统可以在较短的时间内确认按键动作,从而提供较好的响应性。
- 灵活性:可以根据需要调整计数器的阈值,以适应不同的按键和抖动特性。
缺点:
- 资源消耗:需要为每个按键使用一个计数器或为系统使用一个全局计数器。这可能会消耗额外的存储资源和计时资源。
- 复杂性增加:相较于简单的延时消抖,计数器消抖在实现上稍微复杂一些,特别是在有多个按键需要处理的场合。
- 可能的延迟:如果设定的计数器阈值过高,可能导致系统响应的延迟,降低用户体验。
有限状态机(FSM)
工作原理:
使用有限状态机(FSM)来消抖涉及到为按键定义多个状态,并且基于当前状态和输入来决定下一个状态。
典型的按键FSM可能有以下几种状态:未按下
、可能按下
、已按下
、可能释放
。初始状态为未按下
。
- 当按键被按下,FSM转移到
可能按下
状态,并启动计时器。 - 如果计时器达到指定时间并且按键仍然被按下,FSM转移到
已按下
状态。 - 当按键释放,FSM转移到
可能释放
状态,再次启动计时器。 - 如果计时器达到指定时间并且按键仍然是释放状态,FSM返回到
未按下
状态。
这样,只有当按键稳定地保持在一个状态超过指定的时间,它的状态才会被系统确认。短时间的抖动不会导致状态转移,从而达到消抖的效果。
优点:
- 高度可靠:FSM能够准确地识别和忽略短暂的抖动。
- 灵活性:FSM结构允许开发者添加更多的状态和逻辑,例如双击、长按等特殊情况。
- 清晰的逻辑结构:FSM为按键处理提供了清晰、结构化的框架,便于理解和维护。
缺点:
- 实现复杂性:相较于其他软件消抖技术,FSM消抖需要更复杂的代码和逻辑。
- 资源使用:FSM可能需要使用到计时器或中断,以及额外的存储来保存状态。
- 可能的延迟:基于FSM结构和使用的计时器,可能导致按键响应的延迟。
支持情况
QuecPython系列模组支持情况如下:
详细可参考每个模组对应的GPIO复用表
模组 | 浮空输入 | 上拉输入 | 下拉输入 | 开漏输出 | 推挽输出 | 支持数量 |
---|---|---|---|---|---|---|
EC200U | √ | √ | √ | × | √ | 47 |
EC600U | √ | √ | √ | × | √ | 47 |
EG912U | √ | √ | √ | × | √ | 41 |
EG915U | √ | √ | √ | × | √ | 41 |
EC600G | √ | √ | √ | × | √ | 46 |
EC800G | √ | √ | √ | × | √ | 50 |
EG912N | √ | √ | √ | × | √ | 40 |
EG915N | √ | √ | √ | × | √ | 41 |
EC600N | √ | √ | √ | × | √ | 41 |
EC600S | √ | √ | √ | × | √ | 41 |
EC800N | √ | √ | √ | × | √ | 37 |
EC600M | √ | √ | √ | × | √ | 45 |
EC800M | √ | √ | √ | × | √ | 44 |
EG810M | √ | √ | √ | × | √ | 44 |
EC200A | √ | √ | √ | × | √ | 26 |
UC200A | √ | √ | √ | × | √ | 26 |
EC600E | √ | √ | √ | × | √ | 41 |
EC800E | √ | √ | √ | × | √ | 40 |
BG95_XX | √ | √ | √ | × | √ | 21 |
BG600L | √ | √ | √ | × | √ | 25 |
注释:
- √:支持
- ×:不支持
功能概述
主要分为两类:GPIO 与 ExtInt
GPIO
主要介绍QuecPython GPIO使用以及注意事项。
QuecPython具体GPIO相关API使用介绍:machine.Pin
创建对象
GPIO的输入输出,上下拉,默认电平等均可在这一步骤种实现。
class machine.Pin(GPIOn, [dir], [pull], [value])
参数介绍以及GPIO引脚编号与物理映射关系请参考machine.Pin
引脚在通信模组中可用,因此请确保先导入它。然后您可以使用以下方法创建一个引脚:
>>> pin = machine.Pin(1)
此处,“1”是您要访问引脚对应的GPIO号。通常您希望将引脚配置为输入或输出,并且在构造它时执行此操作。要使输入引脚使用:
>>> pin = machine.Pin(1, machine.Pin.IN, machine.Pin.PULL_PU)
您可以使用 PULL_PU
PULL_PD
或 PULL_DISABLE
作为输入拉模式。
读取电平
Pin.read()
方法详细使用请参考Pin.read
当GPIO被配置为输入时,其内部结构允许它检测并反应于施加于其上的电压。你可以查询微控制器的内部寄存器或使用提供的Pin.read方法来读取该状态。
高电平 (HIGH): 这通常意味着GPIO的电压接近或等于供电电压,例如1.8V或3.3V。
低电平 (LOW): 这意味着GPIO的电压接近或等于地线 (GND)。
应用场景:
- 按钮或开关输入: 通过读取GPIO的电平状态,可以检测按钮是否被按下或开关是否被打开/关闭。
- 从其他数字设备接收信号: 可以读取传感器、模块或其他微控制器发送的信号。
注意事项:
- 上拉和下拉电阻: 在某些情况下,外部设备可能不会提供明确的高或低状态。为了避免不确定的"浮动"状态,可以使用内部或外部的上拉或下拉电阻。
- 输入电压范围: 为了避免损坏微控制器,确保连接到GPIO的输入电压在允许的范围内。
输出电平
Pin.write(value)
方法详细使用请参考Pin.write
当GPIO被配置为输出模式时,它可以输出高电平或低电平
- 高电平 (HIGH): 当GPIO输出高电平时,其电压接近或等于其供电电压,例如3.3V或5V。
- 低电平 (LOW): 当GPIO输出低电平时,其电压接近或等于地线 (GND)。
驱动能力:
当GPIO被配置为输出时,它具有一定的驱动能力。这意味着它可以提供或沉降一定量的电流,但这个能力是有限的。如果需要驱动较大的负载,可能需要外部电路如晶体管或继电器来协助。
应用场景:
- LED指示: 通过将GPIO设置为高或低,可以控制LED的开和关。
- 驱动继电器: 可以控制更大的设备,如电机、灯或其他家用电器。
- 与其他数字设备通信: 例如,通过串行通信、SPI、I2C等。
注意事项:
- 最大输出电流: 每个GPIO都有最大输出电流的限制。尝试从GPIO引脚获取过多的电流可能会损坏微控制器。
- 输出类型: 有些GPIO支持开漏/开源输出,这意味着它们只能向上或向下拉电压,而不能双向驱动。
方向
Pin.set_dir(value)
方法详细使用请参考Pin.set_dir
方向选择:
- 输入 (IN): 当GPIO配置为输入时,它用于读取外部设备的状态,例如检测按钮是否被按下。
- 输出 (OUT): 当GPIO配置为输出时,它可以控制外部设备,例如开启或关闭LED。
方向重要性:
- 电气保护:如果一个引脚被错误地配置为输出并尝试驱动一个信号,而这个信号与另一个正在尝试驱动相同线路的设备冲突,可能会造成短路或损坏。
- 功能:不同的方向配置激活了不同的内部电路。例如,当配置为输入时,GPIO可能会启用一个高阻值的电路,使其不影响连接到它上的设备。
注意事项:
- 在连接任何外部设备之前,确保GPIO的方向已正确设置。
- 记得考虑整体电路的设计。例如,如果一个GPIO被配置为输入并连接到一个按钮,确保当按钮被按下时GPIO不会被连接到过高的电压。
中断
该类用于配置I/O引脚在发生外部事件时中断。
创建对象
class machine.ExtInt(GPIOn, mode, pull, callback)
方法详细使用请参考machine.ExtInt
中断触发类型:
上升沿中断 (Rising Edge Interrupt)
- 应用场景: 检测按钮从未按下到按下的瞬间,或者检测从空闲状态到激活状态的传感器。
下降沿中断 (Falling Edge Interrupt)
- 应用场景: 检测按钮从按下到释放的瞬间,或者检测从激活状态到空闲状态的传感器。
双边沿中断 (Both Edges Interrupt)
- 应用场景: 对于需要检测状态变化的应用,例如旋转编码器,它可能同时需要上升沿和下降沿的信息
内部上下拉电阻配置:
通信模组允许在初始化GPIO时配置内部的上拉或下拉电阻 。
如果按钮或开关连接到GPIO,并且没有外部上拉或下拉电阻,内部电阻可以帮助确保GPIO在未被驱动时处于已知状态
回调函数:
当中断被触发时,通信模组需要知道要执行的特定操作或函数。这就是回调函数的角色。这是一个用户定义的函数,当特定的中断条件满足时会被自动调用。
注意: 回调函数通常应该尽可能简短和快速,以避免长时间阻止其他中断或主程序逻辑。
使能/失能
extint.enable()
extint.disable()
方法详细使用请参考Eextint.enable和Extint.disable
使能:
- 定义:允许GPIO引脚对特定的事件(如上升沿、下降沿等)做出响应。
- 用途:当系统准备好处理来自特定GPIO引脚的中断时,应使能该中断。例如,系统初始化后,或在处理完前一个中断后。
- 操作:通信有特定的寄存器或命令来使能特定的GPIO中断。
失能:
- 定义:阻止GPIO引脚对特定事件做出响应,即使该事件发生也不会产生中断。
- 用途:在执行关键代码段,如固件更新、系统校准或其他需要确保不被中断打断的操作时,应失能中断。失能中断还常用于中断服务例程(ISR)开始时,以防止在处理中断时再次触发相同的中断。
- 操作:与使能中断类似,大多数微控制器都提供了特定的寄存器或命令来失能特定的GPIO中断。
注意事项:
- 时间关键性:在某些情况下,尤其是时间关键的应用中,可能需要非常快速地使能或失能中断。
- 全局与局部:在一些系统中,你可以选择失能所有中断(全局失能)或仅失能特定的中断源(局部失能)。
- 安全性:在失能中断后,务必记得在适当的时候再次使能它,否则可能会导致系统无法响应某些关键事件。
其它方法使用请详细参考WiKi machine.ExtInt
应用示例
主要介绍 GPIO 具体的应用示例:
示例 | 描述与应用 |
---|---|
LED控制 | 描述:GPIO配置为输出,驱动LED进行开或关操作。 应用:显示系统状态、通知、警告灯等。 |
按键 | 描述:GPIO配置为中断输入,对外部事件做出响应。 应用:外部设备通知、实时事件检测、按键去抖动等。 |
单总线 | 描述:特定通信协议 应用:用于温度监控,身份验证,设备配置等场景。 本示例基于One-Wire驱动DS18B20温度传感器 |
一线通 | 描述:SIF通讯协议 应用:一线通,多用于电动自行车通信。 <br / |
示例种包含对各个应用场景的描述以及实现过程。包含相应协议详细介绍
注意事项
电源和地:
- 确保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)的源或受害者。考虑使用适当的布局、接地和屏蔽技术来减少干扰。
常见问题
复用表使用
GPIO复用表通常是一种表格或文档,用于描述特定的芯片、微控制器或系统中的GPIO引脚的不同功能和复用选项。在许多芯片和微控制器中,GPIO引脚通常具有多个功能和复用选项。这意味着每个GPIO引脚可以被配置为不同的输入或输出功能,如数字输入、数字输出、模拟输入、模拟输出或特定的外设功能(如SPI、UART、I2C等)。
QuecPython的GPIO复用表提供了每个GPIO引脚的功能和复用选项的详细说明以及引脚在开机过程的状态变化。该表列出了每个引脚的编号、默认功能以及可用的复用选项。以便于用户正确配置和使用GPIO引脚。这对于连接外部设备、驱动显示器、控制通信接口等应用非常重要。
具体的GPIO复用表的格式和内容会因模组而有所不同。因此,对于特定的模组,你需要参考相关的硬件设计手册或GPIO复用表,以获得详细的GPIO的配置信息。
基于QuecPython EC600U介绍GPIO复用表的使用。其它模组复用表类似。
每一栏含义解释:
术语 | 解释 |
---|---|
Pin No. | 模组物理引脚号 |
Pin Description | 引脚默认功能 |
Power Domain | 引脚电压域 |
GPIO No. | 引脚GPIO序号 |
GPIO Conflict | 存在GPIO复用关系的引脚(冲突的引脚GPIO功能不能同时使用) |
Status at Reset | 引脚开机状态,如果开机过程中电平发生变化会在Comment一栏标注 |
Alternate Function | 引脚复用功能 |
Comment | 引脚使用注意事项以及开机过程中电平变化描述 |
开机引脚状态
引脚的开机状态在不同的硬件平台和开发环境中可能会有所不同。一般情况下,当系统上电或重启时,GPIO引脚的初始状态是未定义的,软件无法控制。因此,对于一些控制LED灯或者使能外设开关需要特定开机状态的引脚,在设计硬件电路之前,请查阅我们相关的文档或参考资料,以了解特定平台和环境下GPIO引脚的开机状态。
各个平台的GPIO引脚开机状态可通过查看GPIO复用表获取。
大部分的GPIO引脚开机时状态稳定,少部分GPIO引脚系统开机之后被软件改变电平状态。QuecPython GPIO服用表中有详细的描述。
引脚中断功能查询
查询引脚是否存在中断功能以及对应的中断触发方式。
QuecPython除了BG95的模组外,所有的GPIO都支持中断功能。
BG95系列可通过查看GPIO复用表获取支持中断功能的GPIO。
除了EC600E/EC800E外,其他平台支持触发中断的GPIO都支持双边沿触发中断。EC600E/EC800E平台仅支持单边沿触发中断,且设置中断时,上拉和下拉状态仅支持其中一种,具体情况可以参考machine.Pin模块。
唤醒中断
EC200U/EC600U/EG912U/EG915U平台模组的GPIO全部支持在休眠状态下唤醒模组。其他平台的GPIO大部分支持唤醒模组,具体可以通过查看GPIO复用表确认。
是否支持唤醒中断,请参考对应通信模组GPIO复用表的相应位置查询
休眠引脚状态
介绍模组进入休眠后,GPIO引脚的状态变化。
QuecPython除了EC600E/EC800E的模组外,其他平台的模组在进入休眠后,GPIO状态保持不变。EC600E/EC800E模组为了控制功耗,除了特定的AGPIO之外,其他的GPIO引脚在进入休眠时会全部下电。EC600E/EC800E模组在休眠状态被唤醒之后,GPIO会恢复到休眠之前的状态。