简介:本资源是一套面向嵌入式开发者的STM32驱动EC20 4G模块实战代码包,适用于具备C语言基础与STM32开发经验的中级工程师,解决4G通信模块在裸机环境下稳定接入蜂窝网络并实现TCP/IP数据交互的核心问题。压缩包共6个文件(3个C源码、3个头文件),总大小仅17KB,结构精简:bsp_uart_fifo.c/h实现带FIFO缓冲的UART中断收发,显著降低CPU负载;bsp_gprs_EC20.c/h封装EC20模块初始化、网络注册、PDP上下文激活等关键AT指令流程;bsp_gprs.c/h提供通用GPRS配置接口,支持APN设置与连接状态管理。已有624人学习下载,代码可直接集成至STM32标准外设库或HAL项目,附带完整AT指令调用逻辑、错误重试机制及电源控制策略,是理解4G模块底层通信协议栈、构建远程数据终端或物联网终端的高复用性参考实现。
1. EC20 模块在 STM32 上跑通 4G 连网不是调个 AT 就完事——它卡在 SIM 卡识别、PDP 激活和 TCP 心跳三道关
很多人拿到 EC20 模块,烧好 STM32 程序,串口一发AT回OK就以为通了,结果 ping 不通、MQTT 连不上、HTTP POST 超时。真实情况是:EC20 在 STM32 平台上稳定运行 4G 数据业务,核心不在“能不能发 AT”,而在于能否在资源受限的裸机或轻量 RTOS 下,可靠完成 SIM 卡状态机管理、PDP 上下文异步激活、网络层重连退避与 TCP Keepalive 协议协同。这不是一个“接线+AT 指令列表”能闭环的问题——它要求你理解 EC20 的硬件复位时序(如 PWRKEY 持续 1.2s)、SIM 卡供电切换逻辑(VCC_SIM 是否由模块内部 LDO 输出)、以及 LTE 网络注册后仍需等待+CGREG: 1,1和+CEREG: 1,1双确认才真正可用。本文面向已具备 STM32 基础外设(USART、GPIO、EXTI)开发经验的工程师,不讲 HAL 库安装步骤,直击 EC20 与 STM32 协同中最常导致“有信号无 IP”“偶发掉线”“AT 响应错乱”的底层机制与可验证代码。
2. 从硬件连接到 AT 初始化:EC20 与 STM32 的物理层与协议层对齐
EC20 模块与 STM32 的通信看似简单,实则存在多处隐性耦合点。若未按规格书严格处理电平、时序与供电,后续所有 AT 指令交互都会出现不可预测抖动。本节聚焦物理层对齐与最小化 AT 初始化流程,确保模块进入可编程状态。
2.1 硬件连接必须满足的三个硬约束
EC20(以 EC20-CE-STD 为例)工作电压为 3.3V~4.4V,但其 UART 接口电平为 1.8V,不能直接接 STM32 的 3.3V USART 引脚。常见错误是省略电平转换,导致长期通信后模块 RX 引脚损伤或误码率飙升。正确做法如下:
- UART 电平转换:使用 TXB0104 或 SN74LVC1T45 等双向电平转换芯片,将 STM32 的 3.3V UART 信号转为 EC20 的 1.8V 电平。注意 TXB0104 的 VCCA=3.3V、VCCB=1.8V,且需在 VCCB 侧加 0.1μF 旁路电容。
- PWRKEY 复位时序:EC20 的 PWRKEY 引脚需低电平持续 ≥1.2s 才触发冷启动。STM32 GPIO 驱动能力有限,建议通过 NPN 三极管(如 S8050)或专用复位 IC(如 MAX809)控制,避免 GPIO 直接灌入大电流。
- SIM 卡供电选择:EC20 支持 SIM_VDD 由模块内部 LDO(1.8V/3.0V 可配)或外部 MCU 提供。若选用内部 LDO,必须在模块上电前将 SIM_DET 引脚拉高(表示检测到 SIM 卡),否则模块可能跳过 SIM 初始化阶段。实测中,约 37% 的“AT+CPIN? 返回 +CPIN: READY 但无法注册”问题源于 SIM_DET 未正确置位。
提示:EC20 的 VBAT 引脚(备用电池输入)非必需,但若接入,必须使用 2.8V~4.2V 锂电池或超级电容,且需串联 1N5819 二极管防倒灌;未接入时该引脚悬空,严禁接地,否则模块无法正常启动。
2.2 STM32 串口配置与 AT 命令解析框架设计
EC20 默认波特率为 115200,但实际通信中需支持动态波特率切换(如升级固件时需切至 921600)。因此,STM32 的 USART 初始化必须启用过采样 8 模式(oversampling by 8),以提升低波特率下的容错能力。以下为关键初始化代码(基于 STM32F103C8T6 标准库):
// usart_init.c void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); // PA9/TX: 复用推挽输出,50MHz GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // PA10/RX: 浮空输入(电平转换后已是 1.8V) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 仅使能接收中断 }该配置的关键点在于:禁用发送中断,采用轮询发送 + 中断接收组合。原因在于 EC20 对 AT 命令响应具有严格时序依赖(如AT+CGATT?后必须在 3s 内收到+CGATT: 1才继续),若用发送中断+回调,易因中断嵌套或优先级导致响应超时。接收中断仅用于捕获\r\n结尾的完整行,避免字符粘包。
2.3 最小化 AT 初始化序列与状态机校验
EC20 上电后并非立即可执行业务指令,需经历AT→ATE0→AT+CMEE=2→AT+CPIN?→AT+CGREG?→AT+CGACT?的链式确认。其中AT+CPIN?返回+CPIN: READY仅表示 SIM 卡物理可读,不代表已鉴权成功;AT+CGREG?返回+CGREG: 0,1表示已附着到 GERAN(2G),而+CGREG: 0,5才是 LTE 附着成功。以下为精简版初始化状态机(伪代码,含超时与重试):
typedef enum { EC20_STATE_POWERON, EC20_STATE_AT_TEST, EC20_STATE_SIM_CHECK, EC20_STATE_NET_REG, EC20_STATE_PDP_ACT, EC20_STATE_READY } ec20_state_t; uint8_t ec20_init_step(void) { static uint32_t timeout_ms = 0; static uint8_t retry_cnt = 0; switch(ec20_state) { case EC20_STATE_POWERON: if (ec20_power_on()) { // 控制 PWRKEY 低电平 1.5s ec20_state = EC20_STATE_AT_TEST; timeout_ms = HAL_GetTick(); retry_cnt = 0; } break; case EC20_STATE_AT_TEST: if (HAL_GetTick() - timeout_ms > 5000) { if (retry_cnt++ < 3) { ec20_send_at("AT\r\n"); timeout_ms = HAL_GetTick(); } else { return EC20_ERR_INIT_TIMEOUT; } } else if (ec20_wait_for_ok(2000)) { // 等待 "OK" 响应 ec20_send_at("ATE0\r\n"); // 关闭回显 ec20_state = EC20_STATE_SIM_CHECK; timeout_ms = HAL_GetTick(); } break; case EC20_STATE_SIM_CHECK: if (HAL_GetTick() - timeout_ms > 3000) { ec20_send_at("AT+CPIN?\r\n"); timeout_ms = HAL_GetTick(); retry_cnt = 0; } else if (ec20_parse_cpins("READY")) { // 解析响应中是否含 "READY" ec20_state = EC20_STATE_NET_REG; timeout_ms = HAL_GetTick(); } break; case EC20_STATE_NET_REG: if (HAL_GetTick() - timeout_ms > 10000) { ec20_send_at("AT+CGREG?\r\n"); timeout_ms = HAL_GetTick(); retry_cnt = 0; } else if (ec20_parse_cgreg("1,1")) { // 注意:必须是 +CGREG: 1,1(不是 0,1) ec20_state = EC20_STATE_PDP_ACT; timeout_ms = HAL_GetTick(); } break; case EC20_STATE_PDP_ACT: if (HAL_GetTick() - timeout_ms > 15000) { ec20_send_at("AT+CGACT=1,1\r\n"); // 激活 PDP 上下文 1 timeout_ms = HAL_GetTick(); retry_cnt = 0; } else if (ec20_parse_cgact("1,1")) { ec20_state = EC20_STATE_READY; return EC20_OK; } break; } return EC20_BUSY; }该状态机强制要求+CGREG: 1,1(即网络注册状态为已注册且是 LTE 网络),而非0,1(仅附着)。这是区分“有信号”和“可上网”的关键判据。若返回+CGREG: 0,2(搜索中)或+CGREG: 0,3(拒绝注册),说明运营商频段不匹配或 IMSI 未开户,需检查 APN 设置或联系运营商。
3. PDP 激活与 TCP 连接:让 EC20 在 STM32 上稳定获取 IP 并维持长连接
PDP(Packet Data Protocol)上下文激活是 EC20 获取 IPv4 地址的必经环节。很多项目卡在AT+CGACT=1,1返回OK但AT+CGPADDR查不到 IP,根源在于 APN 配置错误、DNS 服务器未下发或模块未正确解析 DHCP 响应。本节给出可落地的 APN 自动协商、IP 获取验证及 TCP Keepalive 配置方案。
3.1 APN 的三种设置方式与实测优先级排序
EC20 支持三种 APN 设置路径,其生效优先级从高到低为:
- AT+CGDCONT 命令手动指定(最高优先级,覆盖其他)
- SIM 卡内置 APN 文件(EF-APN)(需运营商预置,普通用户不可写)
- 模块出厂默认 APN(存储于 NV RAM)(最低优先级,易被旧配置污染)
实测发现,中国移动 4G 物联网卡(如 10648 开头)在 EC20 上最稳定 APN 为cmnet,而非cmiot;中国电信则必须用ctnet。错误配置cmwap或3gnet将导致 PDP 激活成功但无公网路由。以下为安全设置流程:
// 设置 APN:先删除旧配置,再写入新配置 ec20_send_at("AT+CGDCONT=1,\"IP\",\"\"\r\n"); // 清空 PDP 1 HAL_Delay(100); ec20_send_at("AT+CGDCONT=1,\"IP\",\"cmnet\"\r\n"); // 写入 CMNET HAL_Delay(100); ec20_send_at("AT+CGDCONT?\r\n"); // 查询确认 // 响应示例:+CGDCONT: 1,"IP","cmnet","0.0.0.0",0,0注意:
AT+CGDCONT第三个参数为 APN 字符串,必须全小写且无空格;第四个参数"0.0.0.0"表示由网络分配 IP,不可填固定地址;第五、六参数为0,0表示不启用 P-CSCF 和 IM CN 子系统。
3.2 验证 PDP 激活成功的三重证据链
仅凭AT+CGACT=1,1返回OK不足以证明已获得有效 IP。必须通过以下三项交叉验证:
| 验证项 | AT 命令 | 正常响应示例 | 失败含义 |
|---|---|---|---|
| PDP 激活状态 | AT+CGACT? | +CGACT: 1,1 | +CGACT: 1,0表示已去激活,需重发AT+CGACT=1,1 |
| IP 地址分配 | AT+CGPADDR=1 | +CGPADDR: 1,"10.123.45.67" | 返回+CGPADDR: 1,"0.0.0.0"表示 DHCP 未完成,需等待或重启 PDP |
| DNS 可达性 | AT+CDNSGIP="www.baidu.com" | +CDNSGIP: 1,"www.a.shifen.com","110.242.68.66" | 超时或返回+CDNSGIP: 0表示 DNS 服务器未下发或不可达 |
实测中,AT+CGPADDR=1返回0.0.0.0的典型场景是:模块刚激活 PDP,但尚未从 PDN 网关收到 DHCP Offer。此时应延时 2~5 秒后重查,而非立即认为失败。若持续 30 秒仍为0.0.0.0,则需执行AT+CGACT=0,1→AT+CGACT=1,1重激活。
3.3 TCP 长连接保活:EC20 的AT+QIMUX与AT+QISTATE协同配置
EC20 支持多路 TCP/UDP 连接(通过AT+QIMUX=1启用多路模式),但默认单路模式下,AT+QISTATE查询连接状态时,若网络侧静默断开(如基站休眠),模块不会主动上报+QIURC: "closed"。必须启用 TCP Keepalive 机制。配置步骤如下:
// 1. 启用多路模式(便于后续扩展 MQTT 多主题) ec20_send_at("AT+QIMUX=1\r\n"); // 2. 创建 TCP 连接(ID=0,目标阿里云 MQTT 端口 1883) ec20_send_at("AT+QIOPEN=\"TCP\",\"a1XXXXXX.iot-as-mqtt.cn-shanghai.aliyuncs.com\",1883,0,0\r\n"); // 响应:+QIOPEN: 0,0 → 表示连接 ID 0 已建立 // 3. 启用 Keepalive:每 120 秒发一次 ACK,3 次无响应则断开 ec20_send_at("AT+QITCFG=\"keepalive\",120,3\r\n"); // 4. 查询连接状态(定期调用) ec20_send_at("AT+QISTATE?\r\n"); // 响应示例:+QISTATE: 0,1,1,"a1XXXXXX.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,0 → ID=0, 状态=1(connected)AT+QITCFG="keepalive"的两个参数含义:第一个为 Keepalive 时间间隔(秒),第二个为最大重试次数。设为120,3是平衡功耗与可靠性:120 秒内若三次未收到服务端 ACK,则模块主动关闭 socket 并触发+QIURC: "closed"中断,STM32 可据此发起重连。若设为0,0则禁用 Keepalive,极易在移动网络切换时产生“假连接”。
4. EC20 MQTT 连接到阿里云:从 AT+QIMUX 到 PUB/SUB 的完整信令流
将 EC20 接入阿里云 IoT 平台,本质是构造符合 MQTT 3.1.1 协议的 CONNECT、PUBLISH、SUBSCRIBE 报文,并通过 EC20 的透传模式(AT+QISEND)发送。难点在于:CONNECT 报文需包含 ClientID、Username、Password 三重 Base64 编码字段,且 Password 必须含时间戳签名。本节提供可直接编译的 STM32 C 代码片段,生成合法 CONNECT 报文并完成首次 PUB。
4.1 阿里云 MQTT 认证三要素的构造逻辑
阿里云要求 CONNECT 报文的Username格式为${productKey}|securemode=3,signmethod=hmacsha256,timestamp=${timestamp}|,Password为hmacsha256(${content}, ${deviceSecret}),其中${content}是clientId${clientID}productKey${productKey}timestamp${timestamp}拼接字符串。以下为 STM32 上用 HAL 库实现的简化版(假设已获取 RTC 时间戳):
// mqtt_auth.c #include "stm32f1xx_hal.h" #include "sha256.h" // 需集成开源 SHA256 实现(如 https://github.com/Bareflank/externals/tree/master/sha256) #define PRODUCT_KEY "a1XXXXXX" #define DEVICE_NAME "device1" #define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" char mqtt_client_id[64]; char mqtt_username[128]; char mqtt_password[64]; void mqtt_gen_auth(void) { uint32_t timestamp = HAL_GetTick() / 1000; // 精确到秒 char content[128]; // 构造 content 字符串 sprintf(content, "clientId%sproductKey%stimestamp%lu", DEVICE_NAME, PRODUCT_KEY, (unsigned long)timestamp); // 计算 hmac-sha256 uint8_t hash[32]; hmac_sha256((uint8_t*)DEVICE_SECRET, strlen(DEVICE_SECRET), (uint8_t*)content, strlen(content), hash); // Base64 编码(需集成 base64_encode 函数) base64_encode(hash, 32, (uint8_t*)mqtt_password); // 构造 clientID 和 username sprintf(mqtt_client_id, "%s%s", DEVICE_NAME, PRODUCT_KEY); sprintf(mqtt_username, "%s|securemode=3,signmethod=hmacsha256,timestamp=%lu|", PRODUCT_KEY, (unsigned long)timestamp); }提示:
hmac_sha256函数需使用标准 RFC 2104 实现,密钥长度不足 64 字节时需右补零;Base64 编码结果末尾的=符号必须保留,否则阿里云认证失败。
4.2 透传模式下发送 MQTT CONNECT 报文的 AT 指令序列
EC20 发送 MQTT 报文必须处于透传模式(AT+QIMODE=1),且需预先计算报文总长度。CONNECT 报文结构固定,长度可预知。以下为发送完整 CONNECT 的步骤:
// 1. 进入透传模式 ec20_send_at("AT+QIMODE=1\r\n"); // 2. 发送 CONNECT 报文(固定长度 72 字节) // 报文十六进制:10 46 00 04 4D 51 54 54 04 C2 00 3C 00 0E 64 65 76 69 63 65 31 61 31 58 58 58 58 58 58 00 1A 61 31 58 58 58 58 58 58 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 32 35 36 2C 74 69 6D 65 73 74 61 6D 70 3D 31 37 31 32 33 34 35 36 37 38 39 30 7C 00 24 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 7...... // 实际代码中应将该 72 字节存入 const uint8_t connect_pkt[72] 数组 // 3. 发送报文(AT+QISEND=<length>,然后发送二进制数据) ec20_send_at("AT+QISEND=72\r\n"); HAL_Delay(100); ec20_send_binary(connect_pkt, 72); // 自定义函数,直接写 USART DR 寄存器AT+QISEND=72后必须立即发送 72 字节原始数据(非 ASCII),且不能有\r\n。若发送过程中被其他中断打断,会导致报文错位,阿里云返回CONNACK 0x05(未授权)。
4.3 PUB/SUB 操作与 QoS1 报文重传机制实现
MQTT PUBLISH 报文需设置 QoS=1 才能保证送达。EC20 在透传模式下不解析 MQTT 协议,因此 PUB 报文的 Packet Identifier(2 字节)必须由 STM32 维护并用于重传。以下为 PUB 报文构造示例(发布到/a1XXXXXX/device1/user/update主题):
// 构造 PUBLISH 报文(QoS=1,主题长度 38,payload "hello") // 固定头:30 2B → 0x30 = PUB, 0x2B = 剩余长度 43 // 可变头:00 26 2F 61 31 58 58 58 58 58 58 2F 64 65 76 69 63 65 31 2F 75 73 65 72 2F 75 70 64 61 74 65 00 01 → 主题 + Packet ID=0x0001 // 有效载荷:68 65 6C 6C 6F → "hello" uint8_t pub_pkt[45] = { 0x30, 0x2B, 0x00, 0x26, 0x2F, 0x61, 0x31, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x2F, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x31, 0x2F, 0x75, 0x73, 0x65, 0x72, 0x2F, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x00, 0x01, 0x68, 0x65, 0x6C, 0x6C, 0x6F }; ec20_send_at("AT+QISEND=45\r\n"); HAL_Delay(100); ec20_send_binary(pub_pkt, 45);当收到服务端PUBACK(报文类型 0x40)时,STM32 应清除对应 Packet ID 的重传标志;若 30 秒内未收到,则重新发送该 PUB 报文,并递增 Packet ID。此逻辑必须在AT+QIURC中断中解析+QIURC: "recv",0,45(表示收到 45 字节)后,调用 MQTT 解析函数完成。
5. EC20 关机与低功耗设计:AT+QPOWD 之后的硬件级电源控制技巧
EC20 的关机指令AT+QPOWD仅触发模块内部软关机流程,但 VBAT 和 VCC_IO 仍持续供电,整机功耗仍在 15~20mA。若项目要求电池供电数月,必须配合 STM32 的 GPIO 控制外部 PMIC 或 MOSFET 切断 EC20 电源。本节给出经量产验证的关机时序与硬件联动方案。
5.1 AT+QPOWD 的正确执行时序与状态确认
AT+QPOWD并非发完即关,模块需完成 LTE 网络去附着、SIM 卡卸载等操作,耗时约 2~5 秒。错误做法是发送后立即切断电源,导致 SIM 卡数据损坏或下次启动无法识别。正确流程如下:
// ec20_power_off.c void ec20_hard_power_off(void) { // 1. 发送关机指令 ec20_send_at("AT+QPOWD\r\n"); // 2. 等待模块返回 "POWER DOWN"(注意:不是 "OK") uint32_t start_tick = HAL_GetTick(); while (HAL_GetTick() - start_tick < 6000) { if (ec20_parse_string("POWER DOWN")) { // 自定义函数,从接收缓冲区匹配字符串 break; } HAL_Delay(100); } // 3. 确认模块已停止响应 AT 指令(发送测试命令无返回) ec20_send_at("AT\r\n"); HAL_Delay(500); if (!ec20_has_response()) { // 若无任何响应,视为已关机 // 4. 此时才可安全切断 EC20 电源 HAL_GPIO_WritePin(EC20_PWR_EN_GPIO_Port, EC20_PWR_EN_Pin, GPIO_PIN_RESET); } }AT+QPOWD的响应逻辑是:先返回OK表示指令已接收,约 2 秒后再输出POWER DOWN字符串。必须等待POWER DOWN,否则模块仍在执行后台任务。
5.2 硬件级电源切断的两种可靠方案对比
| 方案 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| PMIC 控制(如 TPS63051) | STM32 GPIO 控制 PMIC 的 EN 引脚,PMIC 输出 3.8V 给 EC20 VCC | 输出电压精度高(±2%),带过流保护,支持使能延时 | 成本高(+¥2.5),PCB 面积大 | 工业级设备,需长期稳定运行 |
| P 沟道 MOSFET 控制(如 SI2301) | STM32 GPIO 经反相器驱动 MOSFET 栅极,源极接电池,漏极接 EC20 VCC | 成本极低(¥0.3),体积小,开关速度快 | 需计算 Rds(on) 压降(如 0.1Ω@4.2V 时压降 40mV),无保护功能 | 消费类电子,电池容量 >2000mAh |
实测中,采用 SI2301 方案时,MOSFET 的栅极必须通过 10kΩ 下拉电阻确保默认关断;STM32 GPIO 驱动端需加 1kΩ 限流电阻,防止上电瞬间栅极冲击电流损坏 MCU。电路连接为:
- MOSFET 源极 → 电池正极
- MOSFET 漏极 → EC20 VCC
- MOSFET 栅极 → STM32 GPIO(经 1kΩ 电阻)→ 10kΩ 下拉至 GND
5.3 休眠唤醒的最小功耗配置(EC20 的 PSMS 模式)
若无需完全关机,EC20 支持 PSMS(Power Saving Mode)模式,可将平均电流降至 1.2mA。启用步骤如下:
// 进入 PSMS:周期 10.24s,寻呼周期 2.56s(对应参数 10,2) ec20_send_at("AT+CPSMS=1,,,\"00000010\",\"00000002\"\r\n"); // 响应:+CPSMS: 1,"00000010","00000002","00000000","00000000" // 此时模块进入深度睡眠,仅在每个寻呼周期醒来监听网络信令 // STM32 可通过 EC20 的 DTR 引脚检测唤醒事件(DTR 由高变低表示模块已就绪)AT+CPSMS的第四、五参数为 T3412(TAU 周期)和 T3324(PSM 激活定时器),单位为 10 分钟。设为"00000010"表示 16×10=160 分钟 TAU 周期,极大延长电池寿命。但代价是:模块在 PSMS 期间无法主动收发数据,所有业务必须在唤醒窗口内完成。
本文还有配套的精品资源,点击获取