EC800M-CNGB + QuecPython:GPIO Mapping 与 UART / Camera / SIM2 / Keypad 等引脚复用边界确认

您好,我目前正在基于 EC800M-CNGB + QuecPython 开发一款无独立 MCU 的终端设备,EC800M-CNGB 本身承担全部系统控制功能。

在进行 PCB 引脚资源冻结时,我对照了:

  1. Quectel《EC800M-CNEG810M-CN QuecOpenQuecPython 硬件设计手册》

  2. QuecPython 官方 machine.Pin GPIO API 文档

  3. Quectel 官方社区关于 UART 引脚是否可以复用为普通 GPIO 的答复

目前发现官方文档中的 GPIO Mapping 与实际 QuecPython 外设复用能力之间存在一些容易产生歧义的地方。

因此希望官方能够针对 EC800M-CNGB 给出明确结论。


一、首先确认一个核心问题:GPIO Mapping 的含义

在 QuecPython 官方 machine.Pin 文档中,EC800M-CNGB 相关 GPIO Mapping 中可以看到:

  • GPIO17 → Pin76

  • GPIO18 → Pin77

  • GPIO20 → Pin83

  • GPIO21 → Pin86

  • GPIO22 → Pin87

  • GPIO27 → Pin19

  • GPIO28 → Pin20

  • GPIO29 → Pin21

  • GPIO30 → Pin22

  • GPIO31 → Pin23

  • GPIO49 → Pin75

  • GPIO50 → Pin74

同时也可以看到部分具有 UART、Camera、SPI、LCD 等其他功能的物理引脚也存在 GPIO Mapping。

但 Quectel 官方社区此前针对 UART 引脚复用问题的答复为:

“在 QuecPython 中,UART 引脚和 GPIO 引脚是两个独立的外设资源,目前 QuecPython API 层不支持将 UART 引脚动态切换为普通 GPIO(输入/输出/中断)。”

因此我想确认:

1. machine.Pin 中列出的 GPIO Mapping 到底代表什么?

是:

A. 该物理 PIN 在底层硬件存在 GPIO 功能,但不代表 QuecPython 一定允许作为普通 GPIO 使用

还是:

B. 只要出现在 machine.Pin GPIO Mapping 中,就可以直接通过 machine.Pin() 作为普通 GPIO 使用

如果是 A,希望官方能够明确区分:

  • 硬件 GPIO 功能存在

  • QuecPython 当前固件可用

  • QuecPython API 可作为普通 GPIO IN/OUT 使用

  • 是否支持 GPIO IRQ

  • 是否受到其他外设资源占用限制


二、目前已经按照官方定义使用的资源

以下功能我没有进行 GPIO 复用,希望确认这些分配本身没有问题。

1. MAIN_UART

物理 Pin 功能 用途
Pin17 MAIN_RXD RS-485
Pin18 MAIN_TXD RS-485

RS-485 使用 MAIN_UART。

由于 RS-485 不使用硬件 RTS/CTS 流控,因此 Pin22 / Pin23 希望用于其他 GPIO 功能。


2. AUX_UART

物理 Pin 功能 用途
Pin28 AUX_RXD AUX_UART
Pin29 AUX_TXD AUX_UART

板级定义名称为 AUX_UART,用于板内辅助串口。

当前实际使用的 QuecPython UART 映射为 UART4,目前实际串口功能正常。


3. DEBUG_UART

物理 Pin 功能 用途
Pin38 DBG_RXD DEBUG_RX
Pin39 DBG_TXD DEBUG_TX

调试接口使用:

  • DEBUG_TXD

  • DEBUG_RXD

  • GND

外部只引出 3 Pin,不额外引出 1.8V。


4. NOR Flash

16 MB NOR Flash 使用 SPI0:

物理 Pin SPI功能
Pin30 SPI_CLK
Pin31 SPI_CS
Pin32 SPI_MOSI
Pin33 SPI_MISO

5. LCD

LCD 使用专用 LCD SPI:

物理 Pin 功能
Pin49 LCD_RST
Pin50 LCD_SPI_DOUT
Pin51 LCD_SPI_RS
Pin52 LCD_SPI_CS
Pin53 LCD_SPI_CLK
Pin78 LCD_TE

LCD 为系统主要人机交互界面。


6. I2C

I2C1:

  • Pin68 = I2C1_SCL

  • Pin69 = I2C1_SDA

I2C2:

  • Pin66 = I2C2_SDA

  • Pin67 = I2C2_SCL


7. ADC

  • Pin9 = ADC0

  • Pin96 = ADC1


8. 状态指示

  • Pin25 = STATUS

  • Pin16 = NET_STATUS


9. 系统控制

  • Pin7 = PWRKEY

  • Pin15 = RESET_N

  • Pin82 = USB_BOOT / KP_MKOUT[4]


10. GNSS

  • Pin2 = ANT_GNSS

  • Pin44 = GNSS_VBCKP

  • Pin35 = ANT_MAIN

其中 Pin44 用作 GNSS 备份电源输入。


11. 模拟音频

当前保留模拟音频功能:

  • Pin3 / Pin4:MIC

  • Pin5 / Pin6:SPK

数字功放方案已经取消。


三、目前希望使用的普通 GPIO

由于本产品没有独立 MCU,需要由 EC800M-CNGB 直接控制多个外设电源和按键,因此需要约 13 个普通 GPIO。

目前计划如下:

物理 Pin QuecPython GPIO Mapping 计划用途
Pin20 GPIO28 RS485_PWR_EN
Pin21 GPIO29 AUX_UART_PWR_EN
Pin22 GPIO30 LCD_PWR_EN
Pin23 GPIO31 5V_PWR_EN
Pin74 GPIO50 3V3_PWR_EN
Pin75 GPIO49 SENSOR_PWR_EN
Pin76 GPIO17 LED_PWR_EN
Pin77 GPIO18 APP_LED
Pin83 GPIO20 KEY1
Pin84 GPIO15 KEY2
Pin85 GPIO38 KEY3
Pin86 GPIO21 KEY4
Pin87 GPIO22 KEY5

这些 PIN 在 machine.Pin 文档中都有对应 GPIO Mapping。

希望官方明确确认:

对于以上 13 个物理 PIN,在 EC800M-CNGB + 当前 QuecPython 环境下:

  1. 是否都可以作为普通 GPIO?

  2. 是否都支持 GPIO 输入?

  3. 是否都支持 GPIO 输出?

  4. 是否都支持 GPIO 中断 IRQ?

  5. 是否存在上电默认状态?

  6. 是否存在内部上下拉限制?

  7. 是否存在启动阶段特殊功能?

  8. 是否存在与 UART / Keypad / 其他外设冲突的问题?

  9. 是否有任何一个 PIN 不建议作为普通 GPIO 长期使用?

特别希望官方直接给出 Y/N 形式的确认。


四、重点确认 Pin19 / GPIO27

官方 machine.Pin Mapping 中:

GPIO27 → Pin19

Pin19 在硬件定义中具有:

MAIN_DTR / GPIO27

目前我的设计中没有使用 MAIN_DTR,因此希望将 Pin19 作为普通 GPIO 候选资源。

这里特别说明:

我的资料中并没有将 Pin19 标记为 AGPIO,因此我不希望预先假定它属于 AGPIO。

希望官方明确回答:

Pin19 / GPIO27 在 EC800M-CNGB + QuecPython 下是否可以作为普通 GPIO?

具体希望确认:

  • GPIO IN:是否支持?

  • GPIO OUT:是否支持?

  • GPIO IRQ:是否支持?

  • 是否可以通过 machine.Pin() 直接操作?

  • 是否存在启动阶段 / 系统阶段特殊用途?

  • 如果不使用 MAIN_DTR,是否可以完全按照普通 GPIO 使用?


五、UART 引脚复用问题

这里是目前最需要官方确认的地方。

在 machine.Pin Mapping 中可以看到 UART 相关 PIN 也存在 GPIO 编号,例如:

物理 Pin UART功能 GPIO Mapping
Pin17 MAIN_RXD GPIO25
Pin18 MAIN_TXD GPIO26
Pin19 MAIN_DTR GPIO27
Pin20 MAIN_RI GPIO28
Pin21 MAIN_DCD GPIO29
Pin22 MAIN_CTS GPIO30
Pin23 MAIN_RTS GPIO31
Pin28 AUX_RXD GPIO32
Pin29 AUX_TXD GPIO33
Pin38 DBG_RXD GPIO34
Pin39 DBG_TXD GPIO35

但官方社区已有答复称:

UART 引脚和 GPIO 是独立外设资源,QuecPython API 层目前不支持将 UART 引脚动态切换为普通 GPIO。

因此希望进一步确认:

1. 上述 GPIO Mapping 是否仅表示芯片底层 GPIO 编号,而不是表示 QuecPython 可以实际将这些 UART PIN 当普通 GPIO 使用?

2. 如果某个 UART 外设完全没有初始化,是否仍然可以将对应 PIN 作为 GPIO?

3. 如果 UART 已经初始化,是否绝对不能再作为 GPIO?

4. 是否存在“启动前可以作为 GPIO、初始化 UART 后不能作为 GPIO”的情况?

5. 是否支持通过关闭 UART 后重新释放为 GPIO?

6. 是否支持 GPIO → UART → GPIO 的动态切换?

如果不支持,希望确认最终规则是否可以理解为:

一个物理 PIN 在 QuecPython 中一旦作为 UART 外设资源使用,就不能再通过 machine.Pin 作为普通 GPIO 使用;machine.Pin Mapping 中存在对应 GPIO 编号并不代表可以动态复用。


六、Camera 相关 PIN 是否可以作为 GPIO

本产品完全不使用 Camera。

硬件手册中 Camera 相关资源包括:

物理 Pin Camera功能 QuecPython GPIO Mapping
Pin8 CAM_VDD 无
Pin54 CAM_MCLK GPIO10
Pin55 CAM_SPI_DATA0 GPIO11
Pin56 CAM_SPI_DATA1 GPIO12
Pin57 CAM_I2C_SCL GPIO13
Pin58 CAM_I2C_SDA GPIO14
Pin80 CAM_SPI_CLK GPIO41
Pin81 CAM_PWDN GPIO16

其中 Pin8 是 Camera 电源,不考虑作为 GPIO。

但是 Pin54~58、Pin80、Pin81 在 machine.Pin Mapping 中又存在 GPIO 编号。

因此希望官方明确:

在 EC800M-CNGB 中,如果完全不使用 Camera:

  • Pin54 是否可以作为普通 GPIO?

  • Pin55 是否可以作为普通 GPIO?

  • Pin56 是否可以作为普通 GPIO?

  • Pin57 是否可以作为普通 GPIO?

  • Pin58 是否可以作为普通 GPIO?

  • Pin80 是否可以作为普通 GPIO?

  • Pin81 是否可以作为普通 GPIO?

并分别确认:

  • IN

  • OUT

  • IRQ

  • 上电默认状态

  • 是否需要关闭 Camera 外设

  • QuecPython 是否实际支持

尤其希望确认:

硬件手册定义为 Camera 专用/复用功能,但 machine.Pin 又提供 GPIO Mapping,这种情况下以哪个文档为准?


七、SIM2 / USIM2 引脚是否可以复用

硬件手册中:

  • Pin62 = USIM2_CLK

  • Pin63 = USIM2_RST

  • Pin64 = USIM2_DATA

  • Pin65 = USIM2_VDD

目前产品:

  • 使用 GNSS

  • 使用 USIM1

  • 不使用 USIM2

根据硬件设计资料,EC800M-CN 的 USIM2 属于可选资源,并存在与 GNSS / 模拟音频等功能组合相关的限制。

因此希望官方明确确认:

如果 EC800M-CNGB 产品中完全不使用 USIM2:

Pin62~Pin65 是否可以:

  1. 作为普通 GPIO 使用?

  2. 通过 machine.Pin 使用?

  3. 支持 IN?

  4. 支持 OUT?

  5. 支持 IRQ?

  6. 是否存在硬件上的限制?

  7. 是否存在 QuecPython API 层面的限制?

如果不能作为 GPIO,也希望明确说明原因。


八、SPI / LCD 引脚是否存在类似问题

目前:

SPI0

Pin30~33 用于 NOR Flash。

LCD

Pin49~53 用于 LCD。

但这些 PIN 在 machine.Pin Mapping 中也存在 GPIO 编号。

因此希望确认统一规则:

对于已经被 SPI / LCD 外设占用的 PIN,GPIO Mapping 是否只是底层 GPIO 编号定义?

以及:

  • 外设未初始化时能否作为 GPIO?

  • 外设初始化后能否作为 GPIO?

  • 是否支持动态切换?

  • 是否必须通过专门 API 释放外设资源?


九、Keypad 相关 PIN

当前产品需要 5 个实体按键。

计划使用:

  • Pin83 / GPIO20

  • Pin84 / GPIO15

  • Pin85 / GPIO38

  • Pin86 / GPIO21

  • Pin87 / GPIO22

其中部分 PIN 在硬件定义中同时属于 Keypad 资源。

由于这里只使用普通 GPIO 按键,不使用 QuecPython Keypad 外设,因此希望官方确认:

这些 PIN 是否可以直接通过 machine.Pin:

Pin.IN

并使用 GPIO 输入 / IRQ 实现按键?

尤其希望确认:

  • Pin83

  • Pin84

  • Pin85

  • Pin86

  • Pin87

是否均可以安全作为普通 GPIO 输入。


十、希望官方最终给出一张“EC800M-CNGB GPIO 可用性表”

为了避免后续 PCB 冻结时产生歧义,希望官方能够提供或确认类似下面这样的最终表格:

物理Pin GPIO编号 默认/主要功能 QuecPython普通GPIO IN OUT IRQ 复用限制
Pin19 GPIO27 MAIN_DTR ? ? ? ? ?
Pin20 GPIO28 MAIN_RI ? ? ? ? ?
Pin21 GPIO29 MAIN_DCD ? ? ? ? ?
Pin22 GPIO30 MAIN_CTS ? ? ? ? ?
Pin23 GPIO31 MAIN_RTS ? ? ? ? ?
Pin54 GPIO10 CAM_MCLK ? ? ? ? ?
Pin55 GPIO11 CAM_SPI_DATA0 ? ? ? ? ?
Pin56 GPIO12 CAM_SPI_DATA1 ? ? ? ? ?
Pin57 GPIO13 CAM_I2C_SCL ? ? ? ? ?
Pin58 GPIO14 CAM_I2C_SDA ? ? ? ? ?
Pin74 GPIO50 Keypad ? ? ? ? ?
Pin75 GPIO49 Keypad ? ? ? ? ?
Pin76 GPIO17 GPIO ? ? ? ? ?
Pin77 GPIO18 GPIO ? ? ? ? ?
Pin80 GPIO41 CAM_SPI_CLK ? ? ? ? ?
Pin81 GPIO16 CAM_PWDN ? ? ? ? ?
Pin83 GPIO20 Keypad ? ? ? ? ?
Pin84 GPIO15 Keypad ? ? ? ? ?
Pin85 GPIO38 Keypad ? ? ? ? ?
Pin86 GPIO21 Keypad ? ? ? ? ?
Pin87 GPIO22 Keypad ? ? ? ? ?

另外希望官方特别说明:

“GPIO Mapping”是否等于“QuecPython 可用普通 GPIO”?

这是目前整个设计中最核心的问题。


十一、最终希望确认的结论

我希望最终能够得到以下几类明确结论:

A. 明确可以作为普通 GPIO 的 PIN

请官方直接列出:

EC800M-CNGB + QuecPython 中可以安全作为普通 GPIO 使用的物理 PIN。

并说明支持:

  • IN

  • OUT

  • IRQ


B. 有 GPIO Mapping,但不能作为普通 GPIO 的 PIN

请明确列出:

虽然 machine.Pin 文档中存在 GPIO Mapping,但 QuecPython API 实际不允许作为普通 GPIO 使用的 PIN。


C. 只有在对应外设关闭时才能作为 GPIO 的 PIN

请明确列出:

UART / SPI / LCD / Camera / Keypad / USIM 等外设关闭后可以使用 GPIO,但不能动态复用或存在其他限制的 PIN。


D. 完全不能作为 GPIO 的 PIN

请明确列出:

硬件或 QuecPython 层面禁止作为普通 GPIO 使用的 PIN。


十二、最关键的问题

如果只能回答一个问题,希望官方明确回答:

对于 EC800M-CNGB,QuecPython machine.Pin 文档中的 GPIO Mapping,究竟是“底层 GPIO 编号映射表”,还是“实际可以通过 machine.Pin API 使用的普通 GPIO 资源表”?

如果两者不同,请官方给出 EC800M-CNGB 的最终普通 GPIO 可用表,以及 UART / Camera / Keypad / USIM / SPI / LCD 等复用限制。

感谢。

当前知识库及公开资料暂未查询到相关内容,请等待技术工程师为您解答。

本回答仅供参考。若问题已解决,可标记为 :white_check_mark:解决方案 ;若仍有疑问,请等待官方技术人员回复,最终请以专业解答为准。

您好,可以初始化为GPIO的引脚,可以参考官网machine说明class Pin - 控制I/O引脚 - QuecPython

右边下拉框勾选对应的型号即可,所有在machine.pin章节的pin引脚都可以初始化为普通GPIO使用,其他外设接口也是一样的,例程uart串口,选择到uart章节,并在下拉框选择即可

需要注意的是,模块GPIO同一程序中只能作为一个功能使用,例如pin30既可以spi0的clk引脚也可以初始化为GPIO使用,但是需要注意的是,这两个功能仅能存在一个,也就是说如果调用接口初始化了spi0,那么就不可以把pin30初始化为GPIO1使用了

并且针对官网machine.pin的说明,如果文档中没有备注GPIO使用注意事项,那么GPIO都可以作为输入/输出/中断引脚使用

您好,我想进一步确认一下 QuecPython 中 UART 引脚与 GPIO 引脚资源定义的问题。

我目前看到贵司官方资料中有两处内容让我产生了疑问:

1. 官方社区关于 UART 引脚复用的答复

在贵司官方社区主题:

《〖引脚复用〗请问 800M 上的默认串口(UART)引脚有办法通过配置作为常规 GPIO 调用吗?》

技术支持回复:

“在 QuecPython 中,UART 引脚与 GPIO 引脚是相互独立的外设资源,目前 QuecPython 的 API 层面不支持将 UART 引脚动态切换复用为普通 GPIO(输入/输出/中断)使用。”

我的理解是:

UART 资源和 GPIO 资源在 QuecPython API 层面属于两个独立的外设资源,UART 所使用的物理引脚不能通过 machine.Pin 动态切换成普通 GPIO。


2. 但是 machine.Pin 官方文档又存在对应的 GPIO Mapping

在 QuecPython 官方 machine.Pin 文档中,EC800M-CNGB 的 GPIO 映射表中又明确列出了 UART 相关物理 PIN。

例如:

GPIO 物理 PIN 硬件功能
GPIO25 Pin17 MAIN_RXD
GPIO26 Pin18 MAIN_TXD
GPIO27 Pin19 MAIN_DTR
GPIO28 Pin20 MAIN_RI
GPIO29 Pin21 MAIN_DCD
GPIO30 Pin22 MAIN_CTS
GPIO31 Pin23 MAIN_RTS
GPIO32 Pin28 AUX_RXD
GPIO33 Pin29 AUX_TXD

官方 machine.Pin 文档本身也说明,Pin() 的参数就是 GPIO 编号,并提供 GPIO 输入、输出、上下拉等操作接口。

因此这里让我产生了一个疑问:

我的核心问题

machine.Pin 文档中的 GPIO Mapping 到底代表什么?

例如:

GPIO25 → Pin17

这里的 GPIO25 是否仅仅表示:

Pin17 在底层硬件/平台资源定义中对应 GPIO25,但这并不意味着 QuecPython 可以将 Pin17 当作普通 GPIO 使用。

还是表示:

Pin17 确实具备 GPIO25 功能,只是在 QuecPython 中如果该 PIN 被 UART 外设占用,就不能再通过 machine.Pin 使用。

也就是说,我想确认:

“GPIO Mapping”与“GPIO 可用性”是不是两个不同概念?


具体举例

以 Pin17 / GPIO25 为例。

Pin17 的硬件功能是 MAIN_RXD,同时 machine.Pin 又定义:

GPIO25 → Pin17

那么在以下几种情况下,分别是什么规则?

情况 A:没有初始化 MAIN_UART

如果程序没有初始化 MAIN_UART:

uart = UART(...)

那么:

Pin17 / GPIO25 是否可以通过:

Pin(Pin.GPIO25, Pin.IN)

作为普通 GPIO 输入?


情况 B:MAIN_UART 已经初始化

如果 Pin17 正在作为 MAIN_UART_RX 使用:

此时是否一定不能再通过 machine.Pin(GPIO25) 操作?

如果不能,是否因为:

UART 和 GPIO 是两个独立的外设资源,UART 初始化后该物理 PIN 已经被 UART 资源占用。


情况 C:UART 关闭以后

如果之前初始化了 UART,之后关闭 UART:

Pin17 是否可以重新释放并作为 GPIO 使用?

也就是说是否支持:

GPIO
 ↓
UART
 ↓
GPIO

这种动态切换?

还是 QuecPython 从 API 层面始终不支持这种切换?


更关键的问题

我想确认官方社区中所说的:

“UART 引脚与 GPIO 引脚是相互独立的外设资源”

这里的“独立”具体是指:

解释 1

UART 和 GPIO 是两个独立的软件外设资源,因此:

machine.Pin 中存在 GPIO25 → Pin17 的映射,只表示底层 GPIO 编号对应关系,并不代表 Pin17 可以作为普通 GPIO 使用。

还是:

解释 2

UART 和 GPIO 都对应同一个物理 PIN 的不同硬件复用功能,但 QuecPython 当前 API 不提供动态切换机制,因此:

只有在 UART 没有占用该 PIN 的情况下,某些 PIN 才可能作为 GPIO 使用。

如果是解释 2,希望官方进一步说明是否可以在系统启动时直接选择 GPIO 功能,而不是先初始化 UART 再切换 GPIO。


我真正想确认的是这一点

我目前正在做 EC800M-CNGB 的 PCB 引脚冻结。

因此我需要区分:

① machine.Pin GPIO Mapping

表示:

这个物理 PIN 在平台底层存在对应 GPIO 编号。

和:

② QuecPython 普通 GPIO 可用资源

表示:

这个物理 PIN 当前固件/API 确实允许通过 machine.Pin 作为普通 GPIO 的 IN/OUT/IRQ 使用。

请问这两者是否是不同概念?


最希望官方给出的最终结论

如果方便,希望技术支持直接确认下面这个规则:

对于 EC800M-CNGB,machine.Pin 文档中的 GPIO ↔ 物理 PIN 映射表,是否不能直接理解为“这些物理 PIN 都可以作为普通 GPIO 使用”?

如果不能直接这样理解,希望官方进一步说明:

  1. 哪些 PIN 虽然存在 GPIO Mapping,但实际上属于 UART 等独立外设资源;

  2. 哪些 PIN 可以真正通过 machine.Pin 作为普通 GPIO 使用;

  3. 如果一个 PIN 同时存在 UART 和 GPIO 定义,QuecPython 是通过什么规则决定当前资源归属;

  4. 是否支持在 UART 未使用的情况下直接将该 PIN 配置为 GPIO;

  5. 是否支持 UART 与 GPIO 之间动态切换。

我主要是希望把 “GPIO Mapping”与“实际可用 GPIO 资源”这两个概念区分清楚,避免 PCB 设计阶段仅根据 machine.Pin 映射表错误判断某个 UART PIN 可以作为普通 GPIO 使用。

谢谢。

1.不存在这种说法,所有在machine.pin章节的pin引脚都可以初始化为普通GPIO使用

2.所有在machine.pin章节的pin引脚都可以初始化为普通GPIO使用,且在machine.pin章节没有特殊备注的GPIO都可以作为输入/输出/中断使用

3.GPIO如有多个功能,以初始化接口决定复用功能,以接口调用初始化为准

4.如果该GPIO存在GPIO和uart功能,那么支持在 UART 未使用的情况下直接将该 PIN 配置为 GPIO

5.不支持UART 与 GPIO 之间动态切换,模块GPIO同一程序中只能作为一个功能使用,如果该引脚已初始化为uart了,请不要再次初始化为普通GPIO使用