From 9d1842404c3309044ab5e486a84e62ec49f81b26 Mon Sep 17 00:00:00 2001 From: helei Date: Tue, 18 Aug 2026 08:29:53 +0800 Subject: [PATCH] =?UTF-8?q?V1.5:=20=E6=96=AD=E7=94=B5=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E6=94=B950ms=E5=BF=AB=E8=BD=AE=E8=AF=A2+=E5=85=88=E5=8F=91?= =?UTF-8?q?=E5=8C=85=E5=90=8E=E6=89=93=E6=97=A5=E5=BF=97;=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=80=9A=E9=81=93=E5=BF=99=E6=97=B6=E6=8E=89=E7=94=B5?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E8=A2=AB=E4=B8=A2=E5=BC=83(=E6=94=B9?= =?UTF-8?q?=E4=B8=BA50ms=E5=91=A8=E6=9C=9F=E9=87=8D=E8=AF=95=E7=9B=B4?= =?UTF-8?q?=E5=88=B0=E5=8F=91=E5=87=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- V1.5/STM32F103_App1/HardWare/ADC/adc.c | 5 ++++- V1.5/STM32F103_App1/HardWare/NETWORK/network.c | 9 +++++---- V1.5/STM32F103_App1/HardWare/NETWORK/network.h | 2 +- V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c | 10 ++++++++-- V1.5/STM32F103_App1/README.md | 2 +- V1.5/鐗堟湰璇存槑.md | 2 ++ 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/V1.5/STM32F103_App1/HardWare/ADC/adc.c b/V1.5/STM32F103_App1/HardWare/ADC/adc.c index 56df094..674634e 100644 --- a/V1.5/STM32F103_App1/HardWare/ADC/adc.c +++ b/V1.5/STM32F103_App1/HardWare/ADC/adc.c @@ -65,9 +65,12 @@ void update_batter(void) } if (!confirm) return; + /* 分毫必争:先发掉电消息,后打日志(串口打印也要十几 ms)。 + * 发送通道被占用(如 GPS 轮询)时丢弃返回 -1:不锁存,下个 50ms 周期重试, + * 直到发出或电容耗尽 */ + if (NET_publish_power(0) != 0) return; powoff = 1; log_info("> 电量低: %d%%", (int)batter_valtage); - NET_publish_power(0); /* 优先发掉电消息 */ hlw8032_save(); /* 本地记录:电量、断电原因(都很快) */ reset_log_power_loss(); HAL_Delay(500); /* 给模组把 MQTT 报文发出去的时间 */ diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c index 7be07a3..accb313 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/network.c +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/network.c @@ -317,11 +317,11 @@ void NET_publish_response(const char *cmd_id, int ok, const char *msg) net_at_unlock(); } -/* 上报电量状态: on=1 正常, on=0 低电量 */ -void NET_publish_power(int on) +/* 上报电量状态: on=1 正常, on=0 低电量。返回 0=已发出,-1=通道忙被丢弃 */ +int NET_publish_power(int on) { - if (g_net_tx_busy) { log_info("> NET: 电量上报被丢弃 (发送忙)"); return; } - if (net_at_trylock() != 0) { log_info("> NET: 电量上报被丢弃 (AT 忙)"); return; } + if (g_net_tx_busy) { log_info("> NET: 电量上报被丢弃 (发送忙)"); return -1; } + if (net_at_trylock() != 0) { log_info("> NET: 电量上报被丢弃 (AT 忙)"); return -1; } if (s_backend == NET_BACKEND_4G) { CAT1_printf("AT+MPUB=\"/iot/data/up/%s\",0,0,\"{\\22header\\22:\\22iot.prop.post\\22,\\22body\\22:{\\22pow\\22:%d}}\"", MqttInfoStr.ClientID, on ? 1 : 0); @@ -332,6 +332,7 @@ void NET_publish_power(int on) net_wifi_publish_up(json); } net_at_unlock(); + return 0; } /* 上报累计电量: energy 字段,单位 kWh,两位小数 */ diff --git a/V1.5/STM32F103_App1/HardWare/NETWORK/network.h b/V1.5/STM32F103_App1/HardWare/NETWORK/network.h index 5d9c3d7..9ec3495 100644 --- a/V1.5/STM32F103_App1/HardWare/NETWORK/network.h +++ b/V1.5/STM32F103_App1/HardWare/NETWORK/network.h @@ -52,7 +52,7 @@ net_backend_t NET_GetActiveBackend(void); void NET_publish_status(int sw1, int feeding, int sw2, int sw3, int sw4, float weight_kg, float once_wt_kg, float zero_kg); void NET_publish_response(const char *cmd_id, int ok, const char *msg); -void NET_publish_power(int on); +int NET_publish_power(int on); /* 返回 0=已发出,-1=通道忙被丢弃 */ void NET_publish_energy(float kwh); /* 上报累计电量,标识符 energy,单位 kWh */ int NET_mqtt_report(const char *header, const char *ota_id, int val); /* 返回 0=送达 */ int NET_ota_confirm(void); /* 0=确认通知已送达 1=无挂起 -1=未送达(需重试) */ diff --git a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c index f98b723..9fd9444 100644 --- a/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c +++ b/V1.5/STM32F103_App1/HardWare/SYSINIT/app_loop.c @@ -320,6 +320,7 @@ static void sys_task(void *arg) { (void)arg; uint32_t batt_tick = HAL_GetTick(); + uint32_t batt_fast_tick = HAL_GetTick(); uint32_t up_last = HAL_GetTick(); uint32_t up_print = HAL_GetTick(); uint32_t en_print = HAL_GetTick(); @@ -335,10 +336,15 @@ static void sys_task(void *arg) /* LED 心跳/联网指示 */ activeEvents(); - /* 电量 1s 节流更新 */ + /* 断电检测 50ms 快轮询(PA0 掉电要抢在法拉电容耗尽前发消息) */ + if (HAL_GetTick() - batt_fast_tick >= 50) { + batt_fast_tick = HAL_GetTick(); + update_batter(); + } + + /* 运行秒数 1s 节流更新 */ if (HAL_GetTick() - batt_tick >= 1000) { batt_tick = HAL_GetTick(); - update_batter(); hlw8032_tick(); /* 攒够约 0.1kWh 写一次 EEPROM */ oled_home_refresh(up_ms); /* OLED 界面 1s 刷新 */ reset_log_tick((uint32_t)(up_ms / 1000)); /* 共享 RAM 更新运行秒数,热复位不丢 */ diff --git a/V1.5/STM32F103_App1/README.md b/V1.5/STM32F103_App1/README.md index ad6a566..b5a49ff 100644 --- a/V1.5/STM32F103_App1/README.md +++ b/V1.5/STM32F103_App1/README.md @@ -101,7 +101,7 @@ ### 鏂數淇濇姢锛堟硶鎷夌數瀹 + PA0 妫娴嬶級 -- APP锛歅A0 鐢甸噺妫娴 <10%锛=澶栭儴 12V 鏂紑锛夌珛鍗 50ms 蹇熷鏍 2 娆★紙绾 100ms 鍑虹粨鏋滐紝娉曟媺鐢靛 5.5F 缁埅鏈夐檺锛屽師 3s 鍘绘姈鏉ヤ笉鍙婏級鈫 **浼樺厛涓婃姤 `pow:0`** 鈫 鍐欑數鑳/鏂數璁板綍 鈫 鐣 500ms 璁╂ā缁勬妸鎶ユ枃鍙戝畬 鈫 澶嶄綅銆傜數閲忕櫨鍒嗘瘮鍋氫簡 0~100% 闄愬箙锛堢數瀹规斁鐢垫椂 3.3V 鍩哄噯涓嬭穼浼氬け鐪燂級 +- APP锛歅A0 鐢甸噺妫娴嬫敼涓 **50ms 蹇疆璇**锛堝師 1s锛夛紝<10%锛=澶栭儴 12V 鏂紑锛夌珛鍗 50ms 蹇熷鏍 2 娆★紙妫娴+纭鍏ㄧ▼ ~150ms锛夆啋 **鍏堝彂 `pow:0` 鍚庢墦鏃ュ織** 鈫 鍐欑數鑳/鏂數璁板綍 鈫 鐣 500ms 璁╂ā缁勬妸鎶ユ枃鍙戝畬 鈫 澶嶄綅銆傚彂閫侀氶亾蹇欙紙濡 GPS 杞鍗犻攣锛夋椂涓嶉攣瀛樸佷笅涓懆鏈熼噸璇曠洿鍒板彂鍑烘垨鐢靛鑰楀敖銆傜數閲忕櫨鍒嗘瘮鍋氫簡 0~100% 闄愬箙锛堢數瀹规斁鐢垫椂 3.3V 鍩哄噯涓嬭穼浼氬け鐪燂級 - BootLoader锛氳烦杞 APP 鍓嶈 PA0锛堝瘎瀛樺櫒鐩磋 ADC锛夛紝涓荤數婧愭湭鎭㈠锛<绾 11V锛夊垯姣 500ms 妫娴嬪師鍦扮瓑寰咃紝**涓嶈烦 APP**鈥斺旈槻姝㈠崟鐗囨満闈犵數瀹逛綆鍘嬭繍琛 APP 鑰屽璁炬病鐢电殑涔辨侊紱12V 鎭㈠鍚庢甯告斁琛 - 鏂數璁板綍鍙涓嬫鎴愬姛鍚姩娑堣垂涓娆★紙`boot_seen` 浣嶇炕杞爣璁帮級锛屼竴娆℃帀鐢 = 涓鏉¤褰曪紝BL 绛夊緟鏈熼棿涓嶄骇鐢熻褰 - BL 鎵句笉鍒版湁鏁 APP锛堝鍙埛浜 BL锛夛細鎵撳嵃鎻愮ず骞舵瘡 3s 涓诲姩澶嶄綅閲嶈瘯锛屽埛鍏 APP 鍗虫仮澶 diff --git a/V1.5/鐗堟湰璇存槑.md b/V1.5/鐗堟湰璇存槑.md index e17bc65..c1b01f3 100644 --- a/V1.5/鐗堟湰璇存槑.md +++ b/V1.5/鐗堟湰璇存槑.md @@ -140,3 +140,5 @@ - 淇 OTA 纭閫氱煡鍙戦佸け璐ワ紙"閲嶈瘯 3 娆℃棤 OK"锛夛細纭浠庨娆″彂甯+3s 寤跺悗鍒 +9s 閬垮紑寮鏈轰笂鎶ラ鏆达紱 鏈湴纭鏍囧織/鐗堟湰鍙峰厛浜庨氱煡钀界洏锛堥氱煡澶辫触涓嶅啀褰卞搷闃插洖婊氾級锛涢氱煡鏈佽揪姣 30s 閲嶈瘯鐩村埌鎴愬姛锛 寮鏈 pow/ICCID 涓婃姤闂撮殧鎷夊紑鍒 300ms +- 鏂數涓婃姤鍐嶆彁閫燂細PA0 妫娴嬩粠 1s 杞鏀 50ms 蹇疆璇紙妫娴+纭 ~150ms 瑙﹀彂锛夛紱鍏堝彂鍖呭悗鎵撴棩蹇楋紱 + 淇鍙戦侀氶亾蹇欐椂鎺夌數娑堟伅琚涪寮冧笉閲嶈瘯鐨勯棶棰橈紙NET_publish_power 杩斿洖鐘舵侊紝蹇欏垯 50ms 鍚庨噸璇曠洿鍒板彂鍑猴級