1. apps/boot/application/main.c: 注释掉跳转APP代码,启用APP_Running循环 2. apps/chrg/applications/thread/chrg_roll_nor.h: 新增5个带模式设置的状态索引 3. apps/chrg/applications/thread/chrg_north.h: 开启Sink协议调试,关闭南向命令调试 4. docs\power_board_upgrade_issues_and_plan.md: 新增功率板升级问题与修改计划文档 5. apps/chrg/applications/thread/chrg_roll_nor.c: 新增模式设置相关状态处理逻辑,适配新增状态索引 6. apps/chrg/applications/thread/chrg_comm.c: 新增YModem超时机制、调试日志与升级控制帧发送逻辑,完善升级流程
5.2 KiB
5.2 KiB
功率板升级问题与修改计划
1. 升级链路
上位机
↓
协议板 App
↓ 进入升级指令
协议板南向 UART
↓
功率板 Boot
↓ 0x06、0x43
协议板 App
↓
上位机
进入升级控制帧:
03 06 00 0F 00 FF F8 6B
跳转 App 控制帧:
03 06 00 0F 00 0F F8 2F
功率板 Boot 使用裸 BIN + YModem 接收升级数据。
2. 已确认的问题
2.1 协议板发送日志含义不准确
协议板日志:
[UPG] CTRL ENTER try=1 tx=0
tx=0 只表示发送请求已经提交到南向升级发送流程,不能证明 UART 已经在物理线上发送成功。
需要通过串口逻辑分析仪确认实际线路是否出现完整控制帧。
2.2 功率板 Boot 控制帧接收依赖一次完整 DMA 回调
当前 Boot 主要在以下条件同时满足时识别进入升级帧:
received_len == 8
usart1_dma_rx_buf[0] == 0x03
UPDATE_FRAME_MATCH
如果控制帧被 DMA 空闲中断拆成多次接收,当前逻辑可能无法在拼接完成后重新判断控制帧。
2.3 功率板 Boot 只有擦除成功后才发送应答
处理流程:
收到完整控制帧
↓
Flash_Erase_App_Region()
↓
擦除成功:发送 0x06、0x43
擦除失败:发送 0x15
因此:
- 完全没有响应:优先检查 UART 接收、帧匹配、通道切换和线路;
- 返回 0x15:重点检查 Flash 擦除;
- 返回 0x06 但协议板没有收到:检查南向返回线路和协议板接收线程。
2.4 Flash 分区注释与实际大小不一致
当前配置:
APP_FLASH_BASE_ADDR = 0x08003800
APP_FLASH_SIZE = 0x0000B000
0xB000 实际为 44 KB,而代码注释写成了 40 KB。
同时擦除配置为:
NbPages = 22
PAGE_SIZE = 0x800
22 页也是 44 KB。需要确认这是否符合实际功率板 Flash 分区规划。
2.5 南向通道和收发方向需要单独确认
协议板升级前会执行:
chrg_south_switch(ch)
串口发送前后还会切换 RS485 收发方向。通道选择错误、方向控制延迟不足或线路未接通,都可能导致功率板无法收到控制帧或协议板收不到 0x06。
3. 修改计划
3.1 完善功率板 Boot 控制帧接收
在 DMA 接收回调中:
1. 累积多次接收到的数据;
2. 达到 8 字节后统一匹配进入升级帧和跳转帧;
3. 匹配成功后设置对应 pending 标志;
4. 匹配失败时清理缓存并等待下一帧;
5. 增加接收长度和帧内容调试输出,或使用 GPIO 翻转辅助定位。
3.2 完善协议板发送状态
协议板需要区分:
- 发送请求提交成功;
- UART 实际发送完成;
- 功率板返回 0x06;
- 功率板返回 0x15;
- 等待超时。
日志中应明确打印实际发送长度和发送帧内容。
3.3 完善应答重发机制
控制帧和 YModem 数据帧均应保留最近一次发送内容:
- 等待 ACK 超时后重发;
- 收到 NAK 后重发;
- 超过最大重试次数后退出升级;
- 收到 CAN 后立即中止;
- 半帧超时后清理接收缓存并等待下一帧。
3.4 核对 Flash 配置
需要确认:
- 功率板 MCU 型号;
- Flash 页面大小;
- Boot 起始地址;
- App 起始地址;
- App 最大容量;
- Boot 工程链接地址;
- App 工程链接地址;
- YModem 文件最大长度。
确认后统一修正宏定义、擦除页数和注释。
3.5 保持升级状态期间停止普通南向轮询
进入升级模式后:
- 停止普通 Modbus 轮询;
- 锁定目标功率板通道;
- 只转发控制帧、YModem 数据帧和单字节应答;
- 升级结束或失败后恢复普通轮询。
4. 待验证项目
4.1 控制帧发送
使用逻辑分析仪确认协议板实际发送:
03 06 00 0F 00 FF F8 6B
确认:
- 波特率为 115200;
- 数据格式为 8-N-1;
- 通道选择正确;
- RS485 发送方向正确;
- 帧没有被截断。
4.2 功率板接收
在功率板 Boot 的:
HAL_UARTEx_RxEventCallback()
检查:
Size
usart1_dma_rx_buf[0..7]
期望:
Size = 8
03 06 00 0F 00 FF F8 6B
4.3 功率板帧处理
确认以下变量和流程:
g_update_prepare_pending = 1
Check_Updata()
Ymodem_HandleControlFrame()
Flash_Erase_App_Region()
记录 Flash 擦除返回值。
4.4 功率板应答
确认功率板 UART 线上依次发送:
06 43
其中:
- 0x06 表示控制帧处理成功;
- 0x43 表示进入 YModem 接收等待。
4.5 协议板接收
确认协议板南向接收线程能识别:
0x06
0x15
0x43
0x18
并将应答正确放入 YModem 应答队列。
4.6 YModem 数据传输
确认:
- 上位机发送的是裸 BIN;
- 首包为 YModem 元数据包;
- 数据包号连续;
- 功率板每包返回 0x06;
- 丢包或 CRC 错误时返回 0x15;
- 重发后包号状态正确;
- EOT 流程能够正常结束。
4.7 异常场景
需要测试:
- 控制帧拆包;
- 控制帧丢失;
- 0x06 丢失;
- YModem 数据包丢失;
- YModem 数据包 CRC 错误;
- 升级中途断电;
- 升级中途复位;
- BIN 文件超过 App 分区;
- Flash 擦除失败;
- 跳转帧发送失败。
5. 暂停调试时的结论
当前暂不进行硬件调试。后续恢复调试时,优先使用逻辑分析仪确认以下最小链路:
协议板发送控制帧
→ 功率板 DMA 收到 8 字节
→ 功率板识别控制帧
→ Flash 擦除成功
→ 功率板发送 0x06
→ 协议板接收到 0x06
只有这条链路确认成功后,再继续验证 YModem 数据包传输。