# 版本说明 ## V1.1 —— 4G 基础版 最初版本,纯 4G 通信。 ### 功能 - 4G Air780E MQTT 联网(模组内置 MQTT,USART3 DMA+IDLE 接收,波特率自适应 115200→921600 掉电保存) - 四路继电器远程控制(sw1~sw4 / feeding 指令),带继电器反馈检测与负载异常应答 - 两种产品形态宏 `PRODUCT_WITH_FEED_SCALE`:投料机(RS485 称重定量投喂,重量反增/超时保护)/ 基础四路继电器 - 4G OTA 远程升级:HTTP 分块下载(3072B/块)→ W25Q64 暂存 → CRC16+固件头校验 → BootLoader 备份/搬运/失败回滚(3 次试错) - AT24C02 EEPROM 配置存储(MQTT 参数/版本号/继电器状态) - 继电器断电记忆:联网后恢复继电器 2~4 上次状态,继电器 1(投喂)上电强制断开防误投料 - 蓝牙串口调试命令(USART1):RESET/INFO/STATUS/R1ON~R4OFF/OTA/RECOVERY 等 - 双看门狗:片内 IWDG(~26s) + 外置 TPL5010(7min,LED2 翻转喂狗) - 电量检测(PA0 ADC,低电量上报 pow:0) ## V1.2 —— 新增 WiFi 通道 ### 新增 - ESP-01S WiFi 通道(UART4,PC10/PC11,RST=PA5):TCP 透传 + MCU 软件 MQTT 3.1.1(不用 AT+MQTT) - 网络层抽象:`network.c` 统一 NET_* 接口,4G/WiFi 双后端互斥共享接收缓冲(Rx_Buf/U2_CopyBuff),业务层零改动 - 通道切换:4G 无 SIM/无信号重试 3 次自动回退 WiFi;WiFi 按"固定热点(60s) → SmartConfig 智能配网(60s)"连接,失败回 4G 循环 - WiFi/4G 波特率均提升至 921600(WiFi 侧 AT+UART_DEF 掉电保存,探测同步) - 4G 信号检测(AT+CSQ 转百分比输出,无信号置标志回退 WiFi) - GPS 定位周期上报(Air780EG 内置 GNSS,WGS-84→GCJ-02 高德坐标转换,5min 周期,fix 无效不上报) - 状态上报同时携带 sw1 与 feeding 两个字段(平台两个开关同步刷新) - 继电器断电记忆完善:改到 MQTT 首次就绪后恢复(修复 WiFi 兜底时永远不恢复的问题);无秤模式四路全恢复;投料模式 SW1 不恢复且强制关闭 - 新增 RECOVERY 蓝牙命令:WiFi 模块 AT+RESTORE 恢复出厂(测试 SmartConfig 用) ### 修复 - 透传 CIPSEND 无响应:等 CIPSTART 的 OK 收尾+延时后再发;增加"已在透传态"探测兜底 - AT 应答陈旧匹配:清缓冲改到发送之后,防止上一条应答尾巴造成"假成功"(曾致 CIPMODE 未生效) - UART ORE 导致 HAL 中止 DMA 接收:ErrorCallback 按当前通道自愈重新武装 ## V1.3 —— WiFi OTA + 联网方式记忆 ### 新增 - WiFi 通道 OTA:ESP-01S 透传 TCP 上软件实现 HTTP Range 分块下载(3072B/块,MCU 自定节奏),复用 W25Q64 双槽+CRC+BootLoader 回退体系;下载失败自动重连 MQTT 恢复业务 - 联网方式记忆(EEPROM 偏移 130):记录上次成功联网方式(4G / WiFi固定热点 / WiFi配网热点),仅变化时写一次,开机优先跑上次成功的方式 - 已存 AP 自动连接改为 AT+CIPSTATUS 主动查询(修复被动等 "WIFI GOT IP" 打印被清缓冲擦掉、永远等不到的问题) ### 修复 - WiFi OTA 下载停摆:DMA(NORMAL) 填满 Rx_Buf 后无 IDLE 不触发、接收永久停摆 → 在 HAL_UART_RxCpltCallback 里搬运并重启接收(UART4/USART3 同步加) - 服务器整包灌流量冲爆接收缓冲:改 HTTP Range 分块请求自定节奏 - AT 匹配严格化:二进制安全匹配(strstr 遇 0x00 失明问题)、收到 ERROR/FAIL 快速失败、进透传前 AT+CIPCLOSE 清残留连接、CIPMUX=0 先于 CIPMODE=1 - SmartConfig 后等 IP 失败:改 CIPSTATUS 主动查询(打印被 CWSTOPSMART 交互擦掉的问题) ## V1.4 —— FreeRTOS 版 ### 新增 - 迁移到 FreeRTOS V10.0.1:net(3)/app(2)/sys(1) 三任务,idle 钩子喂 IWDG;HAL 时基改 TIM2(SysTick 归 RTOS) - 互斥锁三把:AT 会话锁(防业务发布与 AT 应答交织)、存储锁(EEPROM/W25Q64 跨任务)、日志锁 - 无秤模式(PRODUCT_WITH_FEED_SCALE=0)不再上报 zero/onceWt 字段,平台下发设置直接拒绝 - WiFi 断链处理与 4G 对齐:TCP CLOSED(被平台踢下线)/ 心跳超时(15s) → 打印原因并直接整机复位 - Uptime 运行时长打印:联网后每 60s 一次(未联网不打印) ### 修复 - 迁移时漏抄 HAL_TIM_PeriodElapsedCallback(HAL 时基不走)导致开机复位循环 - RECOVERY 在透传态下直接发 AT+RESTORE 被当 TCP 数据发走:先 "+++" 退透传;RTOS 下改为 net 任务内执行恢复流程 - NET_LED 一直闪烁:补回 g_net_led_connected 状态映射(连接中闪烁,连上常亮) ## V1.4-Chinese —— 串口日志中文版 ### 新增 - 全部串口日志中文化(UTF-8 输出,Keil 加 `--no_multibyte_chars` 解决 ARMCC 按 GBK 误读 UTF-8 吃引号问题) - 重启记录:开机打印最近 10 条"重启原因 + 上次运行时长"(W25Q64 0x100000 环形存储,一记录一扇区滑动覆盖;16 种原因码;BL 把 RCC->CSR 放共享 RAM 传给 APP) - 断电保护(法拉电容场景):PA0 检测 12V 断开(连续 3 次 <10% 去抖)→ 立即写断电记录+上报+复位;BootLoader 主电源门禁(12V 未恢复不跳 APP);电量百分比 0~100% 限幅 - I2C 总线恢复:EEPROM 传输中途被复位拉死 SDA 时,初始化补 9 个时钟释放总线 - BL:找不到有效 APP 时 3s 快速重试(原等 IWDG 26s);回退分支跳转前校验 APP 有效性;复位原因打印 - SmartConfig 配网时 NET_LED 100ms 快闪提示;配网超时 60s→100s;新增 PRODUCT_WITH_GPS 宏开关 GPS 功能 - HardFault 串口兜底打印(轮询 USART1) - 工程整理:bin 输出到 OutputBin/、编译对象到 Object/、AfterBuild 拆两条命令修复 bin 不更新 ### 修复 - 首启偶发看门狗复位:I2C 总线被拉死(加上述恢复) - 重启记录回卷一次丢 9 条:改一记录一扇区,真正滑动覆盖 - 电量显示负数:限幅 0~100%(3.3V 基准下跌失真) - OTA 结果/确认上报超时:net 任务与业务任务竞争共享接收缓冲 → NET_process 消费加锁、发布改 2s 超时锁 ## V1.5 —— 蓝牙模块自动配置 + GBK 日志 + 日志等级 ### 新增 - HLK-B40 蓝牙模块自动配置(`ble_at.c`): - PB0(开漏)控制模块 PC5 进 AT 模式,上电设 `AT+NAME=` + GATT UUID(FFE0 服务 + FFE1 收发共用特征,JDY-31/HM-10 同款,通用 BLE 串口 APP 可连),AT+REBOOT 生效 - EEPROM(偏移 132)缓存已配置名称:命中则开机**完全跳过 AT 流程**(零 AT 窗口,蓝牙 APP 不再断联,开机最早的重启记录日志都能看到);`BLESET` 命令手动强制重设 - 串口日志改 GBK 编码输出(源码整体 UTF-8→GBK 转换,串口工具选 GBK 显示中文) - 日志等级六档命令:`LOGTRACE/LOGDEBUG/LOGINFO/LOGWARN/LOGERROR/LOGFATAL`(无下划线便于手机输入),`LOG` 查询显示等级名;写 EEPROM(偏移 160)断电保持 - USART1/USART2 接收 ORE 自愈(蓝牙模块重启乱码不再打死命令通道) - U2_CopyBuff 20KB→10KB(RAM 占用 45.8KB→35.8KB) ### 修复 - 蓝牙改名被撞写:APP 数据撞进 AT 窗口把名字写成 "info" → 改"先查询后设置"幂等流程(名字已对就不开 AT 窗口) - 设置后当场回查失败:模块设置重启才生效,改为下次开机查询校验 - OTA 结果/确认上报超时:net 任务与业务任务竞争共享接收缓冲 → NET_process 消费加锁、发布改 2s 超时锁 ### 追加:HLW8032 电能计量(2026-08) - 新增 `HardWare/HLW8032/`:UART5(PD2 只收) 4800-8E1 接收芯片每 50ms 主动上报的 24 字节帧, 帧同步(0x55/0xAA/0xFx + 0x5A)+校验和验证;只取 PF 脉冲累计换算累计电量 - 电量按手册公式换算:kWh = 总脉冲×功率参数×电压系数×电流系数/(10^9×3600); PF 16 位溢出靠数据更新寄存器 bit7 翻转计数(50ms 一帧不会漏);芯片断电重启自动重新基准 - 系数宏 `HLW_U_COEF`(2.004)/`HLW_I_COEF`(0.5) 在 main.h,对应 ZMPT107-1(100K/49.9R)+CT 1000:1(2R) - 芯片在线时每分钟日志打印电压/电流/功率/电能(调试校准用) - 修复:计划内复位(心跳超时/被踢/OTA/命令复位等 reset_log_mark 覆盖点)前未保存电量 → reset_log_mark 里统一调 hlw8032_save(),复位不再丢未落盘的电量 - 修复:PD2 浮空噪声/真实帧使 online 为真后,每分钟电能日志在 sys_task(1KB 栈) 里格式化 4 个浮点数 导致栈溢出卡死看门狗复位 → sys_task 栈加到 2KB;帧同步加"连续 3 帧且间隔 20~150ms"防噪声假同步 - 累计脉冲(uint64)持久化 EEPROM 偏移 164:每攒约 0.1kWh 写一次 + 断电预警时立即写(法拉电容续航内) - 平台上报标识符 `energy`(kWh 两位小数),MQTT 就绪且芯片在线时每分钟一次,4G/WiFi 双通道 - UART5 带 ORE 自愈;硬件:B0505S 隔离电源 + 光耦,芯片 TXD 接 PD2 ### 追加:新硬件引脚(2026-08) - `CAT_PWR`(PC4):4G 模块开机脚,开漏输出,上电拉低=模块开机 - `ESP_EN`(PA6):WiFi 模块使能,推挽输出,上电置高=模块工作 - `BT_RST`(PA7):蓝牙复位脚,推挽输出,默认拉低=正常工作(高=复位,预留) - `BT_MODE`(PB0):蓝牙 AT/透传切换,此前版本已实现(ble_at.c 开漏控制) - 新增 OLED 屏幕(128x64 + 晶联讯 GB2312 字库 IC,`HardWare/OLED/oled.c`,GPIO 模拟 SPI): CLK=PC12 MOSI=PC9 DC=PC8 CS1=PC7 FSO=PC6 CS2=PB15;1s 刷新电压/电流/功率/电能/继电器/网络状态 - OLED 界面重构:未联网只显示联网进度(4G 各阶段中文提示 / WiFi 固定热点搜索倒计时 / SmartConfig"请打开APP广播"倒计时),联网后才显示电能/开关/网络/运行时间; 开关状态改中文(开关:开开关关);防烧屏每 10s 内容右移 0/2/4px 轮换 - 产品模式 PRODUCT_WITH_FEED_SCALE 改为运行时可切:EEPROM(172) 存 0/1(空白用 main.h 宏默认), 蓝牙命令 SCALE 查询 / SCALE0=无秤四路继电器 / SCALE1=带秤称重投料,切换后自动重启生效; 原 9 处 #if 编译分支全部改运行时判断(状态上报字段/sw1·feeding 语义/继电器1记忆/秤轮询) - OLED 欢迎页改"继电器控制终端 / V1.5.0 RTOS";修复 4G 阻塞建链期间屏幕不显示联网进度 (bg_delay 挂调度器启动前的 500ms 刷新钩子) - 电能底数:首次同步补足 1.00kWh(平台过滤 0 值,保证上电即有数据显示) - 电能上报策略:>10W 每 30s 一次,≤10W 仅首次联网报一次,开关切换随状态大报文携带 - 电流零点偏移(HLW_I_ZERO_A)/功率死区+偏移(HLW_P_DEAD_W/HLW_P_ZERO_W); 电压/电流/功率 EMA 滑动平均滤波(1/8) 压空载跳变;HLW8032 连续 3 帧 20~150ms 防噪声假同步 - 修复 4G MPUB 转义错误:`` 误写为 C 八进制 ``(=0x12 字节),energy/pow/指令应答 共 8 处独立报文平台收不到(上电能收到是因为状态大报文转义本来就对) - OLED 欢迎页按产品模式显示标题;运行时间改 天:时:分 格式 - 新增 SIM 卡号上报:4G 初始化 SIM 就绪后 AT+ICCID 读卡号,MQTT OK 后随 pow 上报平台 (标识符 iccid,字符串;平台物模型加字符串字段即可,便于物联网卡套餐到期查询缴费) - 4G 运行时关闭 WiFi 模块:ESP_EN(PA6) 默认低电平,切 WiFi 才拉高、切回 4G 拉低断电(省电/延长法拉电容续航) - 断电消息提速:电量 <10% 判定从 3s 去抖改为 100ms 快速复核,确认后优先发 pow:0、再写记录、留 500ms 让模组发完再复位(5.5F 电容下原逻辑来不及上报) - 修复 OTA 确认通知发送失败("重试 3 次无 OK"):确认从首次发布+3s 延后到 +9s 避开开机上报风暴; 本地确认标志/版本号先于通知落盘(通知失败不再影响防回滚);通知未送达每 30s 重试直到成功; 开机 pow/ICCID 上报间隔拉开到 300ms - 断电上报再提速:PA0 检测从 1s 轮询改 50ms 快轮询(检测+确认 ~150ms 触发);先发包后打日志; 修复发送通道忙时掉电消息被丢弃不重试的问题(NET_publish_power 返回状态,忙则 50ms 后重试直到发出) - 修复 4G OTA 失败后"假死"(平台不可控/无法再 OTA):OTA 入口会复位 4G 模组,MQTT 已断但 ready 标志未清,S1~S4 等前置失败退出后设备假在线。现改为任何 OTA 失败路径退出后 标记原因(RSN_OTA_FAIL "OTA失败中止")并主动复位,重启走干净 4G 初始化恢复联网 - 修复 OTA 的 SAPBR 激活承载概率性失败:OTA 入口复位模组后未等网络重新附着(CATT)就 激活承载,注册慢时必失败。现 CSQ 后加 cat_wait_cgatt_attached(30),附着成功才走 SAPBR - 新增代码版本上报:标识符 fwver(字符串,内容=FIRMWARE_VERSION_STR),每次重启联网后上报一次(避开与整数 ver 重名) - 485 秤调试日志增强:收到帧先打印原始 hex,解析失败输出具体原因 (帧过短/站号不符/异常帧/功能码不符/CRC 错误各带说明) - PRODUCT_WITH_FEED_SCALE 编译默认值改为 1(默认带秤;EEPROM 172 空白时生效) - GPS 定位改运行时可切(与 SCALE 同机制):EEPROM(173),蓝牙 GPS 查询 / GPS0 关 / GPS1 开, 切换自动重启生效;原 5 处 #if 编译分支改运行时判断(GNSS 初始化/GPS 轮询) - OTA 通知链理顺:下载完成后的 result.post(success) 改为发了就走不等 OK(下载后 MQTT 会话可能僵死, 等 OK 白卡 12s 且发不出);平台以重启后的 confirm.post(等 OK+30s 重试必达)为权威成功信号 - OTA 闭环修复:W25Q64 OTA 信息结构新增 ota_id(平台任务 id 随固件信息落盘),新固件首启确认时 在可靠连接上补发 result.post(success=1, 任务id) + confirm.post——平台"完成"标志可正常闭环 - 注意:OTA 信息结构变化,BootLoader 的 w25q64.h 已同步,**需 J-Link 刷一次新 BL** (旧 BL 读不了新格式,会认不出待安装固件) - OTA 闭环(兼容版):回退 W25Q64 结构改动(BL/APP 共享结构不能动,现场无法刷 BL), 平台任务 id 改存 APP 私有 EEPROM(175~194),新固件首启确认时在可靠连接上补发 result.post(success=1, 任务id) + confirm.post,送达后清回 0xFF - OTA 进度上报改可靠发送:progress.post 等 OK 确认(失败自动重试 1 次,每 10% 最多多花 ~3s), 平台"升级中"标志可置位;若无应答打印 WARN