GPIO/AGPIO/AGPIOWU/WAKEUP/WGPIO




1、模组管脚;
-
上图虚线所示的管脚,都可看做传统意义上的GPIO(WAKEUP/PWRKEY/CHG_DET只能做中断输入,此处也以GPIO名义进行说明),只是管脚名只写了推荐的默认功能,但其实都可以复用为GPIO功能;
-
Air8000不同子型号之间的IO数量略有不同,请根据管脚复用表进行详细对比和区分;
-
这些IO管脚,不只是可用作GPIO,也可以用作其它数字信号,比如UART、SPI、I2C、OneWire、PWM、LCD接口、Camera接口、CAN接口、USB_BOOT使能等,详见下图;
-
本章节仅介绍这些IO作为GPIO、AGPIO、WAKEUP、AGPIOWU、WGPIO五类GPIO性质时的功能,其它复用功能将在后续的章节中进行介绍;
-
GPIO,或者叫做普通GPIO,也就是VDD_EXT电压域下的GPIO,也就是在低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下无法保持固定电平状态(高电平/低电平)输出的GPIO;
特别说明!
a. 无法保持固定电平状态(高电平/低电平)输出,原因是其电压域VDD_EXT是间歇性输出,所以该电压域下的GPIO在VDD_EXT没有输出的时间周期下为高阻态,这种情况下如果想要固定在某一个电平状态,可以通过上拉或下拉实现,上拉时可选择Vref电平,详见第十五章节的介绍;
b. PIN1,USB_BOOT,在开机前默认为BOOT使能,Boot from UART or USB or Flash,开机后可以用作GPIO0,但由于USB_BOOT的特殊性,因此复用为GPIO0的功能LuatOS尚未开放,详细介绍请见第六章节;




- AGPIO,或者叫做AONGPIO,也就是Always ON GPIO,也就是LDO_AON电压域下的GPIO,也就是在低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下都可以保持固定电平状态(高电平/低电平)输出的GPIO;




特别说明!
Air8000系列最多有6个AGPIO,由于Air8000A内部占用了3个,所以上图只标注了Air8000A外部可用的3个AGPIO,在Air8000的其它子型号上会略有不同,如下:

- WAKEUP,顾名思义是中断唤醒的"GPIO",之所以加引号,是因为这一类"GPIO"只能用于输入,并不是严格意义上的GPIO,WAKEUP信号工作在LDO_1.8V下(下图所示的PWRKEY除外);
说明!
a. PWRKEY不是工作在LDO_AON下,我们在第三章节已详细介绍,但PWRKEY在开机后的功能和操作与WAKEUP类似,因此在本章节也将其作为WAKEUP功能进行介绍;
b. Air8000系列模组,3个WAKEUP一般的处理是:WAKEUP0引出到模组管脚供用户自由使用;WAKEUP1模组内部固定用作USB插入检测使用(模组VBUS管脚,经过电压分压后,接WAKEUP1);WAKEUP2有些型号引出供大家灵活使用,有些型号(Air8000A/U/N/D/AB/DB)则内部用做了内置加速度传感器G-Senso的中断输入管脚;




有关被内部占用的WAKEUP信号说明如下;

- AGPIOWU,简单说就是AGPIO+WAKEUP,既可以配置为AGPIO,也可以配置为WAKEUP;
当配置为AGPIO功能时,其电压域为LDO_AON,固定为3.3V;
当配置为WAKEUP功能时,其电压域为LDO_1.8V,固定为1.8V;




GPIO22在某些Air8000型号上被内部占用,比如Air8000A,如下;

- WGPIO,曾用名GPIOA,也就是Air8000A内部WiFi芯片VIO电压域下的GPIO;
WGPIO非常好辨认,要么在管脚图上GPIO口≥100,要么在管脚图上UART口≥10;
WGPIO具有如下特点;
a. 电平固定为3.3V,不可更改;
b. WGPIO的驱动能力较强,驱动电流范围为[5mA,20mA],最小保证5mA,最大不超过20mA;
c. 低功耗模式pm.WORK_MODE,1和PSM+模式pm.WORK_MODE,3下可保持电平输出(常规模式下设置输出高则保持输出高,常规模式下设置输出低则保持输出低);
特别说明!
由于软件所有对WGPIO的控制,在硬件上都是模组内部4G主控通过AirLink(合宙基于SPI总线开发的高速总线协议)发给WiFi芯片的,因此在时间上存在一定的滞后,所以,当软件对WGPIO发出控制指令后,需要延时一定的时间再进入低功耗模式,相应的WGPIO才可以保持电平,否则,软件对WGPIO的设置可能无法生效;
同时,WGPIO在低功耗模式或者PSM模式下,如果要保持输出高电平,需要配置为gpio.PULLUP,如果要保持输出高电平,需要配置为gpio.PULLDOWN;
以GPIO140在PSM+模式下保持输出高电平为例,如下;
gpio.setup(140, 1, gpio.PULLUP)
local function enterlowpower()
sys.wait(3000)
log.info("lowpower","进入PSM模式")
-- 进入PSM模式
pm.power(pm.WORK_MODE, 3)
end
sys.taskInit(enterlowpower)
以GPIO140在PSM+模式下保持输出低电平为例,如下;
gpio.setup(140, 0, gpio.PULLDOWN)
local function enterlowpower()
sys.wait(3000)
log.info("lowpower","进入PSM模式")
-- 进入PSM模式
pm.power(pm.WORK_MODE, 3)
end
sys.taskInit(enterlowpower)
这个问题将会在后续的底层固件中解决,在底层固件解决之前,先使用加延迟sys.wait()的方式来规避;
d. 从低功耗模式pm.WORK_MODE,1或PSM+模式pm.WORK_MODE,3退回到常规模式pm.WORK_MODE,0时WiFi芯片会重启,之后WGPIO会恢复为输入高阻状态,如需修改WGPIO输入输出状态则需要在常规模式pm.WORK_MODE,0下重新初始化配置,应用时请特别注意!
这一点与4G主控芯片下的AGPIO表现不一样:
4G主控芯片从低功耗模式pm.WORK MODE,1被唤醒后,软件不会重启,AGPIO状态可以保持;
4G主控芯片从PSM+模式pm.WORK MODE,3被唤醒后,软件会重启,但AGPIO状态可以保持;
4G主控芯片只有在软件reboot或者硬件reset时AGPIO才需要重新初始化;
e. 普通GPIO/AGPIO/AGPIOWU/WAKEUP为4G主控芯片下的GPIO,WGPIO为WiFi芯片下的GPIO,二者不可组合用于高速通信的场景,比如:
(1)不可用4G主控的SPI总线搭配WiFi芯片的GPIO做SPI_CS使用;
(2)不可用4G主控的UART总线搭配WiFi芯片的GPIO做485方向脚使用;
(3)不可用WiFi芯片的GPIO做软件I2C/软件SPI/GPIO中断计数等高速应用;


2、功能说明;
首先,我们再看下各类型GPIO和其所处电压域的对应关系;
Air8000模组电源域与GPIO对应关系20251128.xlsx

普通GPIO




a. 从GPIO号来看,对应GPIO0-19和GPIO29-38,共30个普通GPIO(Air8000不同型号略有不同);
b. 从所属电压域来看,普通GPIO由VDD_EXT负责供电;
c. VDD_EXT最大电流输出能力是200mA,对应本电压域下的每个GPIO,最大负载电流大约6mA@1.8V,14mA@3.3V,但是所有普通驱动电流总和不能超过200mA;
d. 如果VDD_EXT需要给外设供电,需要控制总电流消耗不超过50mA,以免VDD_EXT电压域下的这类普通GPIO性能受到影响甚至无法正常工作,且此时给全部普通GPIO可提供的电流总和将降为150mA;
e. 普通GPIO在"低功耗模式pm.WORK_MODE,1"下会处于间歇性掉电和间歇性输出相互切换的状态,掉电频率与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个;
f.普通GPIO在"低功耗模式pm.WORK_MODE,1"下无法保持固定电平状态(高电平/低电平)输出,原因是其电压域VDD_EXT是间歇性输出,所以该电压域下的GPIO在VDD_EXT没有输出的时间周期下为高阻态,这种情况下如果想要固定在某一个电平状态,可以通过上拉或下拉实现,上拉时可选择Vref电平,详见第十五章节的介绍;
g. 普通GPIO在PSM+模式(pm.WORK_MODE,3)下会处于完全掉电状态,这种情况下如果想要固定在某一个电平状态,可以通过上拉或下拉实现,上拉时可选择Vref电平;
h. 普通GPIO配置为GPIO中断功能时,跟所有WAKEUP中断一样都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
i. 休眠状态下,低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 ,只能通过WAKEUP0-2,AGPIOWU0-2配置为WAKEUP3/4/5,PWRKEY,CHRG_DET,UART1(LPUART)这几个中断输入源可以将模组唤醒,普通GPIO中断在休眠模式下无法唤醒模组;
j. GPIO0默认用作USB_BOOT,LuatOS没有开放其可以配置作为GPIO0使用的功能;
k. 普通GPIO在上电或Reset复位时可能会有1ms左右的异常高电平,加下拉电阻(10K)可消除;

AGPIO




a. AGPIO0-8,从GPIO号来看,对应GPIO20-28,共9个AGPIO;
其中,GPIO20/21/22三个为AGPIOWU,相对GPIO23-28有特殊特点,因此AGPIOWU会在下面的小章节里会详细介绍;
本章节AGPIO特指的是GPIO23-28,即GPIO23/24/25/26/27/28这6个AGPIO;
Air8000不同子型号对外开放的AGPIO略有不同,上图为Air8000A对外开放的3个AGPIO;
b. 从所属电压域来看,AGPIO由LDO_AON负责供电;
说明!LDO_AON仅供内部使用,并未引出到模组管脚上;
c. LDO_AON的总电流输出能力为10mA,对应AGPIO可以分配到的电流能力上限是5mA;
AGPIO3-8驱动能力单管脚<=5mA, 但所有AGPIO驱动电流总和也不能超过5mA;
d. AGPIO3-8,分别对应GPIO23-28,常规模式(pm.WORK_MODE,0)和休眠状态(pm.WORK_MODE,1 和 pm.WORK_MODE,3)下都可以保持固定电平(固定为高或固定为低)输出;
e. AGPIO3-8,既可以作为AGPIO使用(即GPIO输入输出功能),也可以配置为GPIO中断输入;
f. AGPIO3-8虽然在 低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 下可以保持固定电平(固定为高或固定为低)输出,但配置为GPIO中断功能时,是无法在 低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 下触发中断的;
g. AGPIO3-8,配置为中断输入功能时,跟所有WAKEUP中断一样都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
h. 休眠状态下,低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 ,只能通过WAKEUP0-2,AGPIOWU0-2配置为WAKEUP3/4/5,PWRKEY,CHRG_DET,UART1(LPUART)这几个中断输入源可以将模组唤醒,普通GPIO中断在休眠模式下无法唤醒模组;
i. AGPIO3-8 在上电或Reset复位时可能会有1ms左右的异常高电平,可通过加下拉电阻(10K)消除;

WAKEUP




a. WAKEUP,共有WAKEUP0/1/2三个,其中,Air8000系列模组,3个WAKEUP一般的处理是:
WAKEUP0引出到模组管脚供用户自由使用;
WAKEUP1模组内部固定用作USB插入检测使用(模组VBUS管脚,经过电压分压后,接WAKEUP1);
WAKEUP2有些型号引出供大家灵活使用,有些型号(Air8000A/U/N/D/AB/DB)则内部用做了内置加 速度传感器G-Senso的中断输入管脚;
b. WAKEUP0/1/2,属于LDO_1.8V电压域,LDO_1.8V的电压固定1.8V不可更改;
c. 除WAKEUP外,PWRKEY和CHG_DET在开机后也可以用作中断输入使用,所以,PWRKEY和 CHG_DET通常也被拿来与WAKEUP一起介绍,其中:
PWRKEY在第三章节已进行介绍,CHG_DET在第四章节已经行介绍,CHG_DET和PWRKEY可以当做完全一样的功能,开机前:用作开机键;开机后:用作WAKEUP中断输入;
PWRKEY的电压域为VBAT,CHG_DET电压域与WAKEUP一样都是LDO_1.8V;
d. WAKEUP内部上拉/下拉可配置(上拉/下拉电阻250K左右),在休眠模式下可保持配置状态;
e. 常规模式(pm.WORK_MODE,0)和休眠状态下(低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3)都可实现中断输入,不可用于输出;
在PSM+模式pm.WORK_MODE,3 下,模组可以被WAKEUP中断唤醒,具体是由哪一个WAKEUP管脚唤醒可以由pm.lastReson()函数确认;
https://docs.openluat.com/osapi/core/pm/#45-pmlastreson

f. WAKEUP管脚内部上下拉非常弱,驱动能力<30uA,外部上下拉电阻建议选择100K阻值;
g. 所有WAKEUP中断和GPIO中断都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
h. WAKEUP由于内部电路设计的原因,悬空时电压在1.3V以上时都为正常;
需要强调的是!WAKEUP高电平在1.3V以上才能正常工作,且高电平应大于1.3V且不大于3.6V;
如果外部高电平可能将WAKEUP拉至1.3V以下,则需要外加上拉电阻使其在合理范围内;
i. WAKEUP外接电平输入时可直连电平范围为1.8V-3.6V,或者说可以直接对接1.8V/2.8V/3.3V的MCU而无需电平转换;
j. 如果WAKEUP容易受到干扰而引起异常中断,推荐WAKEUP引脚上添加RC滤波电路,避免异常唤醒;

k. 如果系统中的主控MCU通过三极管连接到模块的WAKEUP,则要求三极管的截止漏电流小于0.5uA,否则,由于WAKEUP内部上拉微弱,大漏电可能会将WAKEUP拉到1.3V以下进而造成模组无法正常工作;
三极管漏电流不能保证的情况下,有两种解决方案:
-
三极管电路预留上拉电路,注意VCC电压范围在1.8V~3.6V;
-
在三极管漏电流不能保证的情况下,可使用MOS管代替三极管, 大多数MOS漏电流相对较低;

AGPIOWU




a. AGPIOWU,共有三个,AGPIOWU0-2,分别是AGPIOWU0、AGPIOWU1、AGPIOWU2;
Air8000A内部占用了GPIO22,所以上图只能看到GPIO20和GPIO21,具体见管脚复用表说明;
下面将默认介绍GPIO20/21/22三个AGPIO;
b. AGPIOWU0-2用作AGPIO时,分别对应GPIO20/21/22;
c. AGPIOWU0-2用作WAKEUP时,分别对应WAKEUP3/4/5;
d. AGPIOWU0-2配置为AGPIO时,同AGPIO3-8一样,属于LDO_AON电压域;
AGPIOWU0-2配置为WAKEUP时,同WAKEUP0-2一样,属于LDO_1.8V电压域;
e. AGPIOWU0/1/2,可以软件配置为AGPIO或WAKEUP两种功能;
AGPIOWU0/1/2,软件配置为AGPIO功能后,还可以进一步配置为AGPIO中偏GPIO部分的功能和偏中断输入的功能;
AGPIOWU0/1/2,中断输入功能,又可以在软件上进一步选择是配置为GPIO中断还是WAKEUP中断;
说明!AGPIOWU0/1/2配置为GPIO中断时跟普通的GPIO中断时没有区别,也不存在AGPIO中断的说法;
说明!AGPIOWU0/1/2配置为GPIO中断时跟普通的GPIO中断时没有区别,也不存在AGPIO中断的说法;
| 分类 | 命名 | 功能 | LuatOS | 特别提示 | |
|---|---|---|---|---|---|
| AGPIOWU0 | AGPIO | GPIO20 | 输入 | --设置GPIO20为输入; gpio.setup(20, nil) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),无法响应; |
| 输出 | --设置gpio20为输出,且初始化电平为低,使用硬件默认上下拉配置; gpio.setup(20, 0) --设置gpio20为输出,且初始化电平为高,使用硬件默认上下拉配置; gpio.setup(20, 1) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),可以保持电平输出(软件设置的高电平或低电平); |
|||
| 中断 | --gpio20中断回调函数 function gpio20_int_callback(level) log.info("gpio20_int_callback", level) end --设置gpio20为中断,上升沿和下降沿都可以触发 gpio.setup(20, gpio20_int_callback, gpio.PULLUP) --设置gpio20为中断,仅上升沿触发 gpio.setup(20, gpio20_int_callback, gpio.PULLUP, gpio.RISING) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),无法响应; |
|||
| WAKEUP | WAKEUP3 | 中断 | --WAKEUP3中断回调函数 function wakeup3_int_callback(level) log.info("wakeup3_int_callback", level) end --设置WAKEUP3为中断,上升沿和下降沿都可以触发 gpio.setup(gpio.WAKEUP3, wakeup3_int_callback, gpio.PULLUP) --设置WAKEUP3为中断,仅上升沿触发 gpio.setup(gpio.WAKEUP3, wakeup3_int_callback, gpio.PULLUP, gpio.RISING) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),可以响应外部中断输入; |
|
| AGPIOWU1 | AGPIO | GPIO21 | 输入 | --设置GPIO21为输入; gpio.setup(21, nil) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),无法响应; |
| 输出 | --设置gpio21为输出,且初始化电平为低,使用硬件默认上下拉配置; gpio.setup(21, 0) --设置gpio21为输出,且初始化电平为高,使用硬件默认上下拉配置; gpio.setup(21, 1) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),可以保持电平输出(软件设置的高电平或低电平); |
|||
| 中断 | --gpio21中断回调函数 function gpio21_int_callback(level) log.info("gpio21_int_callback", level) end --设置gpio21为中断,上升沿和下降沿都可以触发 gpio.setup(21, gpio21_int_callback, gpio.PULLUP) --设置gpio21为中断,仅上升沿触发 gpio.setup(21, gpio21_int_callback, gpio.PULLUP, gpio.RISING) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),无法响应; |
|||
| WAKEUP | WAKEUP4 | 中断 | --WAKEUP4中断回调函数 function wakeup4_int_callback(level) log.info("wakeup4_int_callback", level) end --设置WAKEUP4为中断,上升沿和下降沿都可以触发 gpio.setup(gpio.WAKEUP4, wakeup4_int_callback, gpio.PULLUP) --设置WAKEUP4为中断,仅上升沿触发 gpio.setup(gpio.WAKEUP3, wakeup4_int_callback, gpio.PULLUP, gpio.RISING) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),可以响应外部中断输入; |
|
| AGPIOWU2 | AGPIO | GPIO22 | 输入 | --设置GPIO22为输入; gpio.setup(22, nil) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),无法响应; |
| 输出 | --设置gpio22为输出,且初始化电平为低,使用硬件默认上下拉配置; gpio.setup(22, 0) --设置gpio22为输出,且初始化电平为高,使用硬件默认上下拉配置; gpio.setup(22, 1) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),可以保持电平输出(软件设置的高电平或低电平); |
|||
| 中断 | --gpio22中断回调函数 function gpio22_int_callback(level) log.info("gpio22_int_callback", level) end --设置gpio22为中断,上升沿和下降沿都可以触发 gpio.setup(22, gpio22_int_callback, gpio.PULLUP) --设置gpio22为中断,仅上升沿触发 gpio.setup(22, gpio22_int_callback, gpio.PULLUP, gpio.RISING) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),无法响应; |
|||
| WAKEUP | WAKEUP5 | 中断 | --WAKEUP5中断回调函数 function wakeup5_int_callback(level) log.info("wakeup5_int_callback", level) end --设置WAKEUP5为中断,上升沿和下降沿都可以触发 gpio.setup(gpio.WAKEUP5, wakeup5_int_callback, gpio.PULLUP) --设置WAKEUP3为中断,仅上升沿触发 gpio.setup(gpio.WAKEUP5, wakeup5_int_callback, gpio.PULLUP, gpio.RISING) |
1)驱动能力<30uA,外围电路,比如上拉或下拉电阻,阻值不能过小,建议阻值100K; 2)休眠模式下((pm.WORK_MODE,1 和 pm.WORK_MODE,3)),可以响应外部中断输入; |
f. AGPIOWU0-2分别配置为AGPIO和WAKEUP时的相关API函数详细说明;
gpio.setup(),第一个参数为是GPIO号时,就作为AGPIO使用,配置为中断功能时就是GPIO中断;
也就是说,AGPIOWU0-2不需要通过LuatIO工具初始化配置区分AGPIO和WAKEUP,可以直接操作;
以AGPIOWU0为例,配置为AGPIO时,直接将AGPIOWU0按照GPIO20操作即可;
gpio.setup(20, nil),设置GPIO20为输入;
gpio.setup(20, 0),设置gpio20为输出,且初始化电平为低,使用硬件默认上下拉配置;
gpio.setup(20, 1),设置gpio20为输出,且初始化电平为高,使用硬件默认上下拉配置;
以AGPIOWU0为例,配置为GPIO中断时,直接将AGPIOWU0按照GPIO20操作即可;
function gpio_func(val, io_num)
log.info("io", io_num, val) -- 提醒,val并不代表触发方向,仅代表中断后某个时间点的电平,io_num是IO序号
end
--GPIO20初始化
-- 1,如果要设置GPIO20为中断,默认双向触发,代码如下:
gpio.setup(20, gpio_func, gpio.PULLUP)
--2,如果要设置GPIO20为中断,仅上升沿触发,使用如下代码:
gpio.setup(20, gpio_func, gpio.PULLUP, gpio.RISING)
gpio.setup(),第一个参数为是WAKEUP号时,就作为WAKEUP中断使用;
也就是说,AGPIOWU0-2不需要通过LuatIO工具初始化配置区分AGPIO和WAKEUP,可以直接操作;
以AGPIOWU0为例,配置为WAKEUP3中断时,直接将AGPIOWU0按照gpio.WAKEUP3操作即可;
说明!
gpio.WAKEUP3是WAKEUP3在LuatOS核心库gpio库中定义的常量,详见:
gpio.WAKEUP3
常量含义:休眠唤醒脚3,与GPIO20是同一个引脚;
数据类型:number;
示例代码:
function wakeup3_callback()
log.info("gpio", "wakeup3 interrupt triggered")
end
gpio.setup(gpio.WAKEUP3, wakeup3_callback)
适用产品型号:仅Air780EXXX系列支持,Air8000系列支持;
function gpio_func(val, io_num)
log.info("io", io_num, val) -- 提醒,val并不代表触发方向,仅代表中断后某个时间点的电平,io_num是IO序号
end
--WAKEUP3初始化
-- 1,如果要设置WAKEUP3为中断,默认双向触发,代码如下:
gpio.setup(gpio.WAKEUP3, gpio_func, gpio.PULLUP)
--2,如果要设置WAKEUP3为中断,仅上升沿触发,使用如下代码:
gpio.setup(gpio.WAKEUP3, gpio_func, gpio.PULLUP, gpio.RISING)
g. AGPIOWU0/1/2配置为GPIO20/21/22时的注意事项;
AGPIOWU0/1/2配置为GPIO20/21/22时,每路GPIO的驱动能力只有 30uA,外部上下拉电阻建议选择100K阻值,使用时请务必注意!
GPIO20/21/22主要相对普通GPIO来说在休眠模式(pm.WORK_MODE,1 和 pm.WORK_MODE,3)下可以保持固定电平(固定为高或固定为低)输出,普通GPIO不可以;
GPIO20/21/22,与AGPIO3-8(GPIO23-28)一样都可以在休眠模式(pm.WORK_MODE,1 和 pm.WORK_MODE,3)下保持固定电平输出,只是,AGPIOWU0-2(GPIO20-22)与AGPIO3-8(GPIO23-28)的驱动能力不同,AGPIOWU0-2的驱动能力(30uA)相对AGPIO3-8的驱动能力(单路<5mA且所有AGPIO总和也要<5mA)要差;
AGPIOWU(0~2)在上电或reset时可能会有1mS左右的异常高电平,与普通GPIO和AGPIO不同,AGPIOWU(0~2)这个1ms左右的异常高电平无法消除;

h. AGPIOWU0/1/2配置为WAKEUP3/4/5时的注意事项;
常规模式(pm.WORK_MODE,0)和休眠状态下(pm.WORK_MODE,1 和 pm.WORK_MODE,3)都可实现中断输入;
WAKEUP内部上下拉非常弱,驱动能力<30uA,外部上下拉电阻建议选择100K阻值;
所有WAKEUP中断和GPIO中断都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
WAKEUP由于内部电路设计的原因,悬空时电压在1.3V以上时都为正常;
WAKEUP外接电平输入时可直连电平范围为1.8V-3.6V,或者说可以直接对接1.8V/2.8V/3.3V的MCU而无需电平转换;
休眠状态下,低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 ,只能通过WAKEUP0-2,AGPIOWU0-2配置为WAKEUP3/4/5,PWRKEY,CHRG_DET,UART1(LPUART)这几个中断输入源可以将模组唤醒,普通GPIO中断在休眠模式下无法唤醒模组;
如果硬件容易受到干扰而引起异常中断,推荐WAKEUP引脚上添加RC滤波电路,避免异常唤醒;

- 如果系统中的主控MCU通过三极管连接到模块的WAKEUP,则要求三极管的截止漏电流小于0.5uA,否则,由于WAKEUP内部上拉微弱,大漏电可能会将WAKEUP拉到1.3V以下进而造成模组无法正常工作;
三极管漏电流不能保证的情况下,有两种解决方案:
三极管电路预留上拉电路,注意VCC电压范围为1.8V~3.6V;
在三极管漏电流不能保证的情况下,可使用MOS管代替三极管, 大多数MOS漏电流相对较低;

WGPIO


a. WGPIO,曾用名GPIOA,也就是Air8000内部WiFi芯片VIO电压域下的GPIO;
WGPIO非常好辨认,要么在管脚图上GPIO口≥100,要么在管脚图上UART口≥10;
b. 电平固定为3.3V,不可更改;
c. WGPIO的驱动能力较强,驱动电流范围为[5mA,20mA],最小保证5mA,最大不超过20mA;
d. Air8000的WiFi部分,可以使用函数 pm.power(pm.WIFI, 0) 手动完全关闭,否则,无论是在低功耗模式pm.WORK_MODE,1 还是PSM+模式pm.WORK_MODE,3 下WiFi都默认不掉电;
-
使用函数 pm.power(pm.WIFI, 0) 将WiFi部分完全关闭后:
-
相对低功耗模式pm.WORK_MODE,1 ,在VBAT供电电压3.8V的情况下,节省电流约68uA;
-
相对PSM+模式pm.WORK_MODE,3 ,在VBAT供电电压3.8V的情况下,节省电流约16uA;
e. 低功耗模式pm.WORK_MODE,1和PSM+模式pm.WORK_MODE,3下可保持电平输出(常规模式下设置输出高则保持输出高,常规模式下设置输出低则保持输出低);
特别说明!
由于软件所有对WGPIO的控制,在硬件上都是模组内部4G主控通过AirLink(合宙基于SPI总线开发的高速总线协议)发给WiFi芯片的,因此在时间上存在一定的滞后,所以,当软件对WGPIO发出控制指令后,需要延时一定的时间再进入低功耗模式,相应的WGPIO才可以保持电平,否则,软件对WGPIO的设置可能无法生效;
同时,WGPIO在低功耗模式或者PSM模式下,如果要保持输出高电平,需要配置为gpio.PULLUP,如果要保持输出低电平,需要配置为gpio.PULLDOWN;
以GPIO140在PSM+模式下保持输出高电平为例,如下;
gpio.setup(140, 1, gpio.PULLUP)
local function enterlowpower()
sys.wait(3000)
log.info("lowpower","进入PSM模式")
-- 进入PSM模式
pm.power(pm.WORK_MODE, 3)
end
sys.taskInit(enterlowpower)
以GPIO140在PSM+模式下保持输出低电平为例,如下;
gpio.setup(140, 0, gpio.PULLDOWN)
local function enterlowpower()
sys.wait(3000)
log.info("lowpower","进入PSM模式")
-- 进入PSM模式
pm.power(pm.WORK_MODE, 3)
end
sys.taskInit(enterlowpower)
这个问题将会在后续的底层固件中解决,在底层固件解决之前,先使用加延迟sys.wait()的方式来规避;
f.从低功耗模式pm.WORK_MODE,1或PSM+模式pm.WORK_MODE,3退回到常规模式pm.WORK_MODE,0时WiFi芯片会重启,之后WGPIO会恢复为输入高阻状态,如需修改WGPIO输入输出状态则需要在常规模式pm.WORK_MODE,0下重新初始化配置,应用时请特别注意!
这一点与4G主控芯片下的AGPIO表现不一样:
4G主控芯片从低功耗模式pm.WORK MODE,1被唤醒后,软件不会重启,AGPIO状态可以保持;
4G主控芯片从PSM+模式pm.WORK MODE,3被唤醒后,软件会重启,但AGPIO状态可以保持;
4G主控芯片只有在软件reboot或者硬件reset时AGPIO才需要重新初始化;
g. WGPIO必须在底层固件≥2018以上的版本,才支持在常规模式pm.WORK MODE,0 下配置为中断功能;
WGPIO在低功耗模式pm.WORK MODE,1 和 PSM+模式 pm.WORK MODE,3 下都无法配置为中断功能;
h. 普通GPIO/AGPIO/AGPIOWU/WAKEUP为4G主控芯片下的GPIO,WGPIO为WiFi芯片下的GPIO,二者不可组合用于高速通信的场景,比如:

(1)不可用4G主控的SPI总线搭配WiFi芯片的GPIO做SPI_CS使用;
也可这样理解:禁止4G的SPI,搭配WiFi的GPIO做SPI_CS信号;
(2)不可用4G主控的UART接口搭配WiFi芯片的GPIO做485方向脚使用;
也可这样理解:禁止4G的UART,搭配WiFi的GPIO做485方向脚信号;
(3)不可用WiFi芯片的UART接口搭配4G主控的GPIO做485方向脚使用;
也可这样理解:禁止WiFi的UART,搭配4G的GPIO做485方向脚信号;
(4)不可用WiFi芯片的WGPIO做软件I2C/软件SPI/GPIO中断计数等高速应用;
(5)不可用WiFi芯片的WGPIO做音频PA的控制管脚AudioPA_EN,会影响POP音的抑制;
i. WGPIO的初始化与普通GPIO一样,详见LuatOS核心库gpio的介绍,这里不再赘述;
3、GPIO/AGPIO/AGPIOWU/WGPIO在软件初始化完成之前是什么状态?
- 这是一个非常常见的问题,所以我们必须单独拎出来把这个问题说清楚;
- 我们先看下GPIO1-19(普通GPIO),GPIO23-28(AGPIO),GPIO20-22(AGPIOWU),GPIO29-38(普通GPIO),WGPIO(最多14个,UART10默认作为调试串口使用不可复用为GPIO)这52个GPIO在开机初始化完成之前的状态;

- 其中:
a. I&PU,意思是"输入+内部上拉",也就是在软件初始化完成之前,默认输入,且内部上拉;
b. I&PD,意思是"输入+内部下拉",也就是在软件初始化完成之前,默认输入,且内部下拉;I&PD的管脚只有GPIO0,且GPIO0更重要的功能是USB_BOOT,如果在开机前上拉到VDD_EXT改变默认下拉的状态,则会使能USB下载的功能,这一点我们在第五章节已有详细介绍,也正是因为这个特殊原因,LuatOS尚未开放GPIO0的复用功能,仅作为USB_BOOT使用;
c. NI&NP,意思是"非输入输出,没有上下拉,若需确定的状态,需要在外围电路设计时外加上拉或下拉",在软件初始化完成之前的状态,可以通过外部的上拉或下拉来确定;
4、4G主控下的GPIO/AGPIO/AGPIOWU/WAKEUP详细参数;
| 参数 | 描述 | 规格 | 单位 | ||
|---|---|---|---|---|---|
| Min | Typ. | Max | |||
| 普通GPIO,VDD_EXT=1.8V | |||||
| VDD | IO Supply Voltage | 1.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个,输出时为1.8V; | V | ||
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 0 | V | ||
| I-oH | Digital High, Output Current | 4 | 6 | 9 | mA |
| I-oL | Digital Low, Output Current | 4 | 6 | 9 | mA |
| R-pu | Pull-up Resistance | 110k | 160k | 210k | Ω |
| R-pd | Pull-down Resistance | 160k | 210k | 260k | Ω |
| 普通GPIO,VDD_EXT=2.8V | |||||
| VDD | IO Supply Voltage | 2.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个,输出时为2.8V; | V | ||
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 0 | V | ||
| I-oH | Digital High, Output Current | 5.3 | 14 | 29.1 | mA |
| I-oL | Digital Low, Output Current | 4.2 | 18 | 25.4 | mA |
| R-pu | Pull-up Resistance | 55k | 85k | 115k | Ω |
| R-pd | Pull-down Resistance | 70k | 100k | 130k | Ω |
| 普通GPIO,VDD_EXT=3.3V | |||||
| VDD | IO Supply Voltage | 3.3 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个,输出时为3.3V; | V | ||
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 0 | V | ||
| I-oH | Digital High, Output Current | 9.6 | 14.9 | 20.8 | mA |
| I-oL | Digital Low, Output Current | 11.6 | 22.4 | 36.3 | mA |
| R-pu | Pull-up Resistance | 58k | 77k | 109k | Ω |
| R-pd | Pull-down Resistance | 49k | 78k | 138k | Ω |
| AGPIO, LDO_AON=1.8V(实际使用时请按照单个AGPIO或所有AGPIO驱动能力之和<5mA进行评估和设计) | |||||
| VDD | IO Supply Voltage | 1.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 1.7 | 1.8 | 1.9 | V |
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 1.7 | 1.8 | 1.9 | V |
| I-oH | Digital High, Output Current | 3 | 5 | mA | |
| I-oL | Digital Low, Output Current | 5 | mA | ||
| R-pu | Pull-up Resistance | 110k | 160k | 210k | Ω |
| R-pd | Pull-down Resistance | 160k | 210k | 260k | Ω |
| AGPIO, LDO_AON=2.8V(实际使用时请按照单个AGPIO或所有AGPIO驱动能力之和<5mA进行评估和设计) | |||||
| VDD | IO Supply Voltage | 2.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 2.65 | 2.8 | 2.95 | V |
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 2.65 | 2.8 | 2.95 | V |
| I-oH | Digital High, Output Current | 3 | 5 | mA | |
| I-oL | Digital Low, Output Current | 5 | mA | ||
| R-pu | Pull-up Resistance | 55k | 85k | 115k | Ω |
| R-pd | Pull-down Resistance | 70k | 100k | 130k | Ω |
| AGPIO, LDO_AON=3.3V(实际使用时请按照单个AGPIO或所有AGPIO驱动能力之和<5mA进行评估和设计) | |||||
| VDD | IO Supply Voltage | 3.3 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 3.15 | 3.3 | 3.45 | V |
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 3.15 | 3.3 | 3.45 | V |
| I-oH | Digital High, Output Current | 3 | 5 | mA | |
| I-oL | Digital Low, Output Current | 5 | mA | ||
| R-pu | Pull-up Resistance | 58k | 77k | 109k | Ω |
| R-pd | Pull-down Resistance | 49k | 78k | 138k | Ω |
| AGPIOWU0-2 (AGPIO function), LDO_AON=1.8V | |||||
| VDD | IO Supply Voltage | 1.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 0.03 | V | ||
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 0.03 | V | ||
| I-oH | Digital High, Output Current | 1.05 | 1.2 | 1.25 | mA |
| I-oL | Digital Low, Output Current | 1.05 | 1.2 | 1.25 | mA |
| R-pu | Pull-up Resistance | 110k | 160k | 210k | Ω |
| R-pd | Pull-down Resistance | 160k | 210k | 260k | Ω |
| AGPIOWU0-2 (AGPIO function), LDO_AON=2.8V | |||||
| VDD | IO Supply Voltage | 2.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 2.65 | 2.8 | 2.95 | V |
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 2.65 | 2.8 | 2.95 | V |
| I-oH | Digital High, Output Current | 0.03 | mA | ||
| I-oL | Digital Low, Output Current | 0.03 | mA | ||
| R-pu | Pull-up Resistance | 55k | 85k | 115k | Ω |
| R-pd | Pull-down Resistance | 70k | 100k | 130k | Ω |
| AGPIOWU0-2 (AGPIO function), LDO_AON=3.3V | |||||
| VDD | IO Supply Voltage | 3.3 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| VOH | High-level output voltage | 0.8*VDD | V | ||
| VOL | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 3.15 | 3.3 | 3.45 | V |
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 3.15 | 3.3 | 3.45 | V |
| I-oH | Digital High, Output Current | 0.03 | mA | ||
| I-oL | Digital Low, Output Current | 0.03 | mA | ||
| R-pu | Pull-up Resistance | 58k | 77k | 109k | Ω |
| R-pd | Pull-down Resistance | 49k | 78k | 138k | Ω |
| WAKEUP, AGPIOWU0-2 (WAKEUP Function),LDO_1.8V | |||||
| VDD | IO Supply Voltage | 1.8 | V | ||
| VIH | High-level input voltage | 0.7*VDD | V | ||
| VIL | Low-level input voltage | 0.2*VDD | V | ||
| 低功耗模式pm.WORK_MODE,1 | 低功耗模式时Voltage | 1.05 | 1.2 | 1.25 | V |
| PSM+模式pm.WORK_MODE,3 | PSM+模式时Voltage | 1.05 | 1.2 | 1.25 | V |
| R-pu | Pull-up Resistance | 70k | 120k | 170k | Ω |
| R-pd | Pull-down Resistance | 60k | 110k | 160k | Ω |
5、WiFi芯片下的WGPIO详细参数;
| Symbol | Parameter | Min. | Typ. | Max. | Unit |
|---|---|---|---|---|---|
| VIH | High-level input voltage | 0.7VIO | - | VIO + 0.3 | V |
| VIL | Low-level input voltage | -0.3 | - | 0.3VIO | V |
| VOH | High-level output voltage | 0.9VIO | - | - | V |
| VOL | Low-level output voltage | - | - | 0.1VIO | V |
| IDRV | I/O output drive strength | 5 | - | 20 | mA |
| RPU | Weak pull-up resistor | - | 40 | - | kΩ |
| RPD | Weak pull-down resistor | - | 44 | - | kΩ |
WGPIO电压域VIO的详细参数;
| Parameter | Description | Min. | Typ. | Max. | Unit |
|---|---|---|---|---|---|
| VIO | IO LDO output voltage | 2 | 3.1 | 3.6 | V |
| Load current | - | - | - | 500 | mA |
6、常见使用错误;
- GPIO20/21/22的驱动能力小于30uA,大家在硬件设计时非常容易忽略这一点,常常碰到的错误是,电路上的上拉电阻或者下拉电阻的阻值过小,造成GPIO20/21/22无法正常驱动,进而导致电路失效,所以,建议上下拉电阻值为100K;
- WAKEUP3/4/5的驱动能力也小于30uA,因此,建议上下拉电阻值在20K到100K之间,根据实际硬件进行调试选择;
- ESD保护;
a. GPIO/AGPIO/AGPIOWU/WAKEUP在硬件上需要外接按键或者外部高电压输入时,请注意做好保护;
b. 高电压输入时,请注意使用光耦做隔离,比如:
C127009_晶体管输出光耦_UPC817CG-D04-T_规格书_WJ149952.pdf
c. 外部按键、插针形式输入时,容易产生静电,推荐TVS型号如下;
样品购买链接:SIM和GPIO用,DFN1006-2封装,AR3321P1LV,应能微-淘宝网
7、LuatIO工具初始化配置;
- 任何IO管脚,都需要通过LuatIO进行初始化配置,也就是指定这个管脚这么多复用功能你要使用的那一个;
- LuatIO工具相关介绍LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;
- 有关LuatIO的说明,请见第十三章节中的介绍;
- 以Air8000A为例,LuatIO工具界面如下;

8、LuatOS相关API;
- GPIO操作,包括普通GPIO/AGPIO/AGPIOWU/WAKEUP,详见 21 gpio - 合宙模组资料中心 ;
- GPIO电平设置包括普通GPIO/AGPIO/AGPIOWU/WAKEUP,详见 52 pm - 合宙模组资料中心 ;
- IO序列操作的相关介绍,详见 31 ioqueue - 合宙模组资料中心 ;
9、关于GPIO相关的基础知识;
-
https://docs.openluat.com/embedded/interface/gpio/
-
以下是视频号信盈达关于GPIO基础知识的介绍,很有趣,截图给大家;
"应用场景,推挽点灯带电机,开漏通信I2C用"
"推挽输出,上有推来下有拉,高低电平都强硬",来自视频号信盈达内容截图;
![]() |
![]() |
|---|---|
"开漏输出,只能拉低不能高,输出高时呈悬空",来自视频号信盈达内容截图;
"上拉电阻,要想开漏输出高,上拉电阻必须加",来自视频号信盈达内容截图;
![]() |
![]() |
![]() |
|---|---|---|





