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超时机制、调试日志与升级控制帧发送逻辑,完善升级流程
167 lines
5.2 KiB
Markdown
167 lines
5.2 KiB
Markdown
# 功率板升级问题与修改计划
|
||
|
||
## 1. 升级链路
|
||
|
||
```text
|
||
上位机
|
||
↓
|
||
协议板 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 数据包传输。 |