feat: 南向升级支持任意阶段退出功能

1 更新协议板固件版本至V1.1.49
2 新增SOUTH_YMODEM_EXIT_APP宏控制升级退出时是否发送跳转App帧
3 新增YMODEM_PREPARE_DELAY_MS宏,升级模式切换后等待200ms
4 修改chrg_ymodem_proxy_exit函数,支持升级任意阶段退出
5 更新chrg_comm.c、chrg_def.h及升级日志文件对应版本信息
This commit is contained in:
wrh
2026-09-29 16:14:58 +08:00
parent 1efc9e807b
commit 98f887eb36
6 changed files with 53 additions and 11 deletions
+2 -2
View File
@@ -8,5 +8,5 @@ scene: git_message
格式
首行 简要描述
空一行
每行不超过80个描述一个修改/新增/删除的内容。
具体到文件级,描述文件名、修改内容。
具体修改使用数字排列如 1 2 3 4
每行不超过80个简易描述一个修改/新增/删除的内容。
+1 -1
View File
@@ -27,7 +27,7 @@
#include "stm32f4xx_hal.h"
#define HOLD_REG_FIRMWARE_VERSION 0x0300U /* 协议板固件版本,只读 */
#define CHRG_FIRMWARE_VERSION 0x013EU /* 当前协议板版本:V1.1.46 */
#define CHRG_FIRMWARE_VERSION 0x0141U /* 当前协议板版本:V1.1.49 */
rt_uint8_t ucDiscInBuf[(TOTAL_DISC_REGS+BITS_UCHAR-1)/BITS_UCHAR];
@@ -48,6 +48,7 @@
#define SOUTH_FRAME_DEBUG 0x00 // 南向UART原始收发帧
#define SOUTH_COMMAND_DEBUG 0x01 // 南向寄存器写命令
#define SOUTH_YMODEM_DEBUG 0x01 // 南向YMODEM回码
#define SOUTH_YMODEM_EXIT_APP 0x01 // 升级退出时发送南向跳转App帧
#define COMM_FRAME_DEBUG 0x00 // COM UART原始收发帧
#define COMM_DEBUG 0x00 // COM寄存器读写过程
#define COMM_TRIM_DEBUG 0x00 // COM校准参数解析
+2 -2
View File
@@ -14,8 +14,8 @@
/* CHRG application version. Keep this value synchronized with the changelog. */
#define CHRG_VERSION_MAJOR 1U
#define CHRG_VERSION_MINOR 1U
#define CHRG_VERSION_PATCH 46U
#define CHRG_VERSION_STRING "V1.1.46"
#define CHRG_VERSION_PATCH 49U
#define CHRG_VERSION_STRING "V1.1.49"
/*
* Channel polling mode:
@@ -8,6 +8,7 @@
#include "chrg_def.h"
#include "chrg_thread.h"
#include "chrg_north.h"
#include "chrg_south.h"
#include "chrg_roll_sou.h"
#include "chrg_eload.h"
@@ -20,6 +21,7 @@
#define YMODEM_SESSION_IDLE_MS 15000U // 整个升级会话无有效数据超时
#define YMODEM_ENTER_TIMEOUT_MS 15000U // 功率板进入Boot及擦除等待时间
#define YMODEM_RESPONSE_TIMEOUT_MS 10000U // 南向单帧应答等待时间
#define YMODEM_PREPARE_DELAY_MS 200U // 切换升级模式后等待功率板重启稳定
typedef struct {
chrg_ymodem_proxy_state_t state; // 当前升级阶段
@@ -47,8 +49,10 @@ static chrg_ymodem_proxy_t g_proxy = {
/* 功率板进入Boot和跳转App的固定Modbus控制帧。 */
static const rt_uint8_t g_enter_frame[8] =
{ID_ELOAD, 0x06, 0x00, 0x0F, 0x00, 0xFF, 0xF8, 0x6B};
#if SOUTH_YMODEM_EXIT_APP
static const rt_uint8_t g_exit_frame[8] =
{ID_ELOAD, 0x06, 0x00, 0x0F, 0x00, 0x0F, 0xF8, 0x2F};
#endif
static const rt_uint8_t g_cancel_frame[2] = {YM_CAN, YM_CAN};
static const char *chrg_ymodem_proxy_state_name(chrg_ymodem_proxy_state_t state)
@@ -241,7 +245,7 @@ static int chrg_ymodem_proxy_prepare_channel(rt_uint8_t ch)
roll->leng = 0U;
roll->updata_result = 0;
rt_mutex_release(thread->mutex);
rt_thread_mdelay(25U);
rt_thread_mdelay(YMODEM_PREPARE_DELAY_MS);
chrg_eload_clear_ymodem_resp();
if (chrgsouth.rb != RT_NULL) rt_ringbuffer_reset(chrgsouth.rb);
return 0;
@@ -291,19 +295,27 @@ int chrg_ymodem_proxy_enter(rt_uint8_t ch)
函数描述: 跳转功率板App并恢复普通南向轮询
输入参数: ch:当前升级通道
返回说明: 0:收到跳转ACK <0:状态或通信失败
其它说明: 仅TRANSFER_DONE状态可退出,退出后强制刷新版本
其它说明: 升级会话任意阶段均可退出,退出后强制刷新版本
*****************************************************************/
int chrg_ymodem_proxy_exit(rt_uint8_t ch)
{
#if SOUTH_YMODEM_EXIT_APP
rt_tick_t start;
rt_uint8_t response;
#endif
if ((g_proxy.state != YMODEM_PROXY_TRANSFER_DONE) ||
(ch != g_proxy.ch)) return -1;
if (ch >= TOTAL_SOU_CHS) return -1;
if (g_proxy.state == YMODEM_PROXY_IDLE) {
if (chrg_ymodem_proxy_prepare_channel(ch) != 0) return -2;
g_proxy.ch = ch;
} else if (ch != g_proxy.ch) {
return -1;
}
#if SOUTH_YMODEM_EXIT_APP
g_proxy.state = YMODEM_PROXY_EXITING;
chrg_eload_clear_ymodem_resp();
if (chrg_send_sou_upadata_data(g_exit_frame, sizeof(g_exit_frame)) != 0)
return -2;
return -3;
start = rt_tick_get();
while ((rt_tick_t)(rt_tick_get() - start) <
rt_tick_from_millisecond(YMODEM_RESPONSE_TIMEOUT_MS)) {
@@ -317,7 +329,12 @@ int chrg_ymodem_proxy_exit(rt_uint8_t ch)
rt_thread_mdelay(1U);
}
chrg_ymodem_proxy_session_stop();
return -3;
return -4;
#else
chrg_roll_sou_version_invalidate(ch);
chrg_ymodem_proxy_session_stop();
return 0;
#endif
}
/* 根据当前阶段校验完整帧,校验成功才允许提交南向。 */
+24
View File
@@ -1,5 +1,29 @@
# 修改日志
## V1.1.49 - 2026-09-29
### 南向升级随时退出
- 南向升级任意阶段均允许接收匹配通道的 `0x20` 退出命令。
- 本地会话已经回到空闲状态时,也可重新锁定指定通道并发送退出指令,用于恢复仍停留在Boot的功率板。
- 退出时仍按 `SOUTH_YMODEM_EXIT_APP` 配置决定是否发送跳转App帧。
- 协议板版本寄存器 `0x0300` 更新为 `0x0141`。
## V1.1.48 - 2026-09-29
### 南向升级启动等待
- 进入南向升级模式后等待200ms,再发送进入Boot升级指令,避开功率板重启阶段。
- 协议板版本寄存器 `0x0300` 更新为 `0x0140`。
## V1.1.47 - 2026-09-29
### 南向升级退出跳转开关
- 新增 `SOUTH_YMODEM_EXIT_APP` 宏,控制升级退出时是否发送南向跳转App帧。
- 宏关闭时仅结束本地升级会话并恢复普通轮询。
- 协议板版本寄存器 `0x0300` 更新为 `0x013F`。
## V1.1.46 - 2026-09-29
### 南向YMODEM数据包打印