shuichan_old/V1.5/版本说明.md

19 KiB
Raw Blame History

版本说明

V1.1 —— 4G 基础版

最初版本,纯 4G 通信。

功能

  • 4G Air780E MQTT 联网(模组内置 MQTTUSART3 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投喂上电强制断开防误投料
  • 蓝牙串口调试命令USART1RESET/INFO/STATUS/R1ON~R4OFF/OTA/RECOVERY 等
  • 双看门狗:片内 IWDG(~26s) + 外置 TPL5010(7minLED2 翻转喂狗)
  • 电量检测PA0 ADC低电量上报 pow:0

V1.2 —— 新增 WiFi 通道

新增

  • ESP-01S WiFi 通道UART4PC10/PC11RST=PA5TCP 透传 + MCU 软件 MQTT 3.1.1(不用 AT+MQTT
  • 网络层抽象:network.c 统一 NET_* 接口4G/WiFi 双后端互斥共享接收缓冲Rx_Buf/U2_CopyBuff业务层零改动
  • 通道切换4G 无 SIM/无信号重试 3 次自动回退 WiFiWiFi 按"固定热点(60s) → SmartConfig 智能配网(60s)"连接,失败回 4G 循环
  • WiFi/4G 波特率均提升至 921600WiFi 侧 AT+UART_DEF 掉电保存,探测同步)
  • 4G 信号检测AT+CSQ 转百分比输出,无信号置标志回退 WiFi
  • GPS 定位周期上报Air780EG 内置 GNSSWGS-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 通道 OTAESP-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.1net(3)/app(2)/sys(1) 三任务idle 钩子喂 IWDGHAL 时基改 TIM2SysTick 归 RTOS
  • 互斥锁三把AT 会话锁(防业务发布与 AT 应答交织、存储锁EEPROM/W25Q64 跨任务)、日志锁
  • 无秤模式PRODUCT_WITH_FEED_SCALE=0不再上报 zero/onceWt 字段,平台下发设置直接拒绝
  • WiFi 断链处理与 4G 对齐TCP CLOSED被平台踢下线/ 心跳超时(15s) → 打印原因并直接整机复位
  • Uptime 运行时长打印:联网后每 60s 一次(未联网不打印)

修复

  • 迁移时漏抄 HAL_TIM_PeriodElapsedCallbackHAL 时基不走)导致开机复位循环
  • 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=<BLE_NAME 宏> + GATT UUIDFFE0 服务 + 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→10KBRAM 占用 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 写一次 + 断电预警时立即写(法拉电容续航内)
  • 平台上报标识符 energykWh 两位小数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 字库 ICHardWare/OLED/oled.cGPIO 模拟 SPI CLK=PC12 MOSI=PC9 DC=PC8 CS1=PC7 FSO=PC6 CS2=PB151s 刷新电压/电流/功率/电能/继电器/网络状态
  • 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 失败后"假死"(平台不可控/无法再 OTAOTA 入口会复位 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
  • 修复 OTA 后版本序号平台不刷新OTA 确认保存版本号后立即补发一次状态+fwver (原先要等踢线/重启/拨开关触发上报才更新)
  • 修复重启后磅秤重量平台一直为 0首次重量上报被 AT 忙丢弃后不重试, 改为发布成功才置标志,失败下轮查询继续重试
  • 新增实时功率上报:标识符 power单位 W一位小数与 energy 合并同一条报文 >10W 每 30s否则首次+开关切换),平台物模型加 float 即可
  • 新增蓝牙发射功率配置main.h 宏 BLE_TX_POWERAT+RFPOWER 1~18 级,默认 8 功率值并入 EEPROM 缓存判断(偏移 158改宏后下次开机自动重设一次
  • 断电消息发送加固pow:0 改等模组回 OK~1.5s/次,最多 3 次)+ OK 后留 800ms 空口时间; 3 次都失败也照常写记录复位(不因发送失败丢断电记录)
  • 去掉电能底数 1kWh 机制(用户确认平台可正常显示小数值)
  • 新增蓝牙 ENCLR 命令累计电能清零RAM+EEPROM 同步,无需重启)
  • OLED 带秤模式第 3 行改显示重量(重量:xx.xKG),读不到时显示原因 (无应答/帧短/CRC错/秤异常帧/站号不符);无秤模式仍显示开关状态
  • 断电预警时 OLED 关显示0xAE 黑屏,省电+避免残影)
  • 去掉 OLED 防烧屏左右偏移(断电已关屏,偏移意义不大)
  • 修复 485 首次应答丢失USART2 接收可能因 ORE 残留状态卡死(自愈重挂因 RxState 非 READY 静默失败), 现每次查询前 USART2_ForceRxReset() 强制复位接收(清错误/缓冲+重挂中断),首包不再丢
  • 修复 485 回声吃应答帧头:查询 TX 后等 5ms 清回声缓冲;解析时改为在帧内定位 01 03 04 帧头, 抗回声/前导垃圾(快速应答不再被吞前几个字节)
  • 修正 485 修复方案:去掉 TX 后清缓冲(会吃掉快速回复的前几个字节), 改为回声帧按内容识别静默丢弃(与查询命令完全一致的帧),合并帧靠 01 03 04 帧头搜索解析
  • 485 首次查询延迟 3s避开上电窗口防止首个应答被开机繁忙期撞坏
  • 485 查询日志增强:查询发出 1s 无任何应答帧打 WARN无应答有应答则原有 hex/解析日志覆盖
  • 撤掉 485 查询前的 ForceRxResetAbortReceive 重挂会把接收搞死,只收到应答最后一个字节); 改为只清软件缓冲不动硬件,接收回到最初常开方式;帧头搜索/回声识别/无应答日志保留
  • 根治 485 接收停摆HAL 处理 ORE 错误后 RxState 常卡 BUSY_RX自愈里的 Receive_IT 静默失败 → 错误回调重挂前强制 RxState=READY查询前清缓冲时顺带检查接收中断是否停摆并拉起不 Abort USART1/USART5 自愈同样加固
  • 485 丢帧根因定位并加固:上位机秒回时回复帧头被 485 收发器切换延迟切掉(真秤有处理延迟不受影响); 现 400ms 无好帧或收到坏帧自动补发一次查询,仍不行才报无应答
  • 485 取帧改原子操作USART2_PollFrame 判静默+拷出+清缓冲一步完成,替代 Tick 置标志/GetFrame 取帧 的两步交接(交接窗口会被查询补发的清缓冲打断丢帧)
  • 485 接收架构重写为 DMA+IDLEDMA1_Channel6 + 空闲中断定帧,与 4G/WiFi 同架构): 根治字节中断+软件超时方案的丢帧/停摆问题;实测秒回/慢回全部一次成功。 过程DWT 硬件观察点抓到合法写点无误,定位为原中断接收路径在特定时序下字节丢失
  • 恢复 OLED 防烧屏像素偏移每10s 右移 0/2/4px并修复左侧残留移位前先写空格清腾空列
  • OLED 偏移幅度加大到 0~24px5 档),按内容宽度自动钳位不越界,左侧腾空列全量清空
  • 蓝牙 AT 设置加固AT 窗口内静音日志UART1 与模块共用,日志字节会污染模块命令解析); 进 AT 模式+查询无应答时重新拉 PC5 重试,最多 3 轮
  • 断电时序微调:确认断电后先关 OLED 屏再发掉电消息(黑屏更快+给模组留更多发送电量)
  • 断电时序改为:先发掉电消息(等OK) → 屏幕显示"发生掉电事件!"亮 3 秒 → 熄屏复位
  • 蓝牙设置流程开头先硬复位模块BT_RST/PA7 拉高 100ms防模块状态异常时 PC5 进不了 AT 模式
  • OLED 新增复位脚 PB14初始化前给 10ms 低脉冲硬件复位屏幕,防止上电时序异常花屏