Files
ESP32_COMM/.zcode/plans/plan-sess_9aded586-08ab-42db-88f4-d4953189bd11.md
T
小龙虾 c0ca4e2a9f feat(can): 优化CAN反馈任务错误日志记录机制
- 添加s_lastLoggedError数组跟踪各通道最后记录的错误计数
- 实现错误计数变化时才触发告警,避免重复打印
- 扩展错误日志信息,包含TEC、REC和总线状态详细信息
- 修复P0/P1页面携带相同统计数据时的重复打印问题

perf(ota): 移除冗余的OTA协调器状态检查方法

- 删除isGd32BusyState、isEsp32BusyState等未使用的状态判断方法
- 移除esp32FinalizeErrCategory错误分类函数
- 清理相关的头文件声明,减少代码冗余

refactor(relay): 移除未使用的中继状态获取方法

- 删除getRelaySeq、getRelayTotalPackets状态查询接口
- 移除getGd32Version版本获取方法
- 清理StateLockGuard中的isLocked方法
2026-07-11 17:51:42 +08:00

117 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 实施计划:DCU 初始化时通过 PC9 复位 ESP32
### 背景确认
- 目标仓库:`G:/Robot_v2/DCU/DCU_APP/GD32E508_DCU_APP`(GD32 侧 DCU 固件)。
- PC9 当前在 DCU_APP 中未被使用,不会与 USART0/CAN/SPI/EXMC 等冲突。
- ESP32 EN/RESET 为低电平复位、高电平释放;你给出的 50ms 低电平保持后释放逻辑正确。
- 项目风格:配置集中在 `sys/config.h`,外设封装为 `device/*.h` 中的 C++ class,延迟统一用 `SysTickTimer::delayMs()`,GPIO 清 0 用 `gpio_bit_reset()`。
### 修改点
#### 1. `sys/config.h`:增加 ESP32 复位引脚配置
在 SPI Ready 配置附近新增:
```cpp
/** @brief ESP32 硬件复位控制端口(PC9 接 ESP32 EN/RESET)。 */
constexpr uint32_t CONFIG_ESP32_RESET_PORT = GPIOC;
/** @brief ESP32 硬件复位控制引脚。 */
constexpr uint32_t CONFIG_ESP32_RESET_PIN = GPIO_PIN_9;
/** @brief ESP32 复位低电平保持时间,单位 ms。 */
constexpr uint32_t CONFIG_ESP32_RESET_HOLD_MS = 50U;
```
#### 2. 新增 `device/esp32_reset.h`
按现有 `device/watchdog.h` 风格编写:
```cpp
#ifndef DEVICE_ESP32_RESET_H
#define DEVICE_ESP32_RESET_H
#include <stdint.h>
class Esp32Reset {
public:
/** @brief 初始化 PC9 为推挽输出,先拉低 50ms 再释放 ESP32。 */
static void init();
/** @brief 主动拉低 ESP32 RESET(进入复位)。 */
static void assertReset();
/** @brief 释放 ESP32 RESET(高电平,ESP32 启动)。 */
static void releaseReset();
};
#endif /* DEVICE_ESP32_RESET_H */
```
#### 3. 新增 `device/esp32_reset.cpp`
按现有 `device/watchdog.cpp` 风格编写:
```cpp
#include "device/esp32_reset.h"
#include "sys/config.h"
#include "sys/systick.h"
#include "main.h"
void Esp32Reset::init()
{
/* 1. 使能 GPIOC 时钟 */
rcu_periph_clock_enable(RCU_GPIOC);
/* 2. 先把输出数据寄存器清零,确保配置成输出时就是低电平 */
gpio_bit_reset(CONFIG_ESP32_RESET_PORT, CONFIG_ESP32_RESET_PIN);
/* 3. 配置 PC9 为推挽输出 */
gpio_init(CONFIG_ESP32_RESET_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, CONFIG_ESP32_RESET_PIN);
/* 4. 保持复位 50ms,等电源和其他 IO 稳定 */
SysTickTimer::delayMs(CONFIG_ESP32_RESET_HOLD_MS);
/* 5. 释放 ESP32 */
gpio_bit_set(CONFIG_ESP32_RESET_PORT, CONFIG_ESP32_RESET_PIN);
}
void Esp32Reset::assertReset()
{
gpio_bit_reset(CONFIG_ESP32_RESET_PORT, CONFIG_ESP32_RESET_PIN);
}
void Esp32Reset::releaseReset()
{
gpio_bit_set(CONFIG_ESP32_RESET_PORT, CONFIG_ESP32_RESET_PIN);
}
```
#### 4. `sys/initial.cpp`:在初始化序列中加入 ESP32 复位
- 新增 `#include "device/esp32_reset.h"`。
- 在 `SysTickTimer::initMs()` 之后、`Usart0::configurePins()` 之前调用 `Esp32Reset::init()`,原因:
- 需要 SysTick 才能做 50ms 延迟;
- 尽早释放 ESP32,让它在 DCU 继续初始化 USART/CAN/SPI 期间完成自身启动,等 SPI 命令总线初始化时 ESP32 已经可用。
修改后顺序:
```cpp
nvic_priority_group_set(...);
SysTickTimer::initMs();
Esp32Reset::init(); // 新增
Usart0::configurePins();
Usart0::init();
...
```
#### 5. `GD32E508_DCU_APP.cproject.yml`:把新文件加入构建
在 `groups → device` 中增加:
```yaml
- file: ./device/esp32_reset.h
- file: ./device/esp32_reset.cpp
```
### 代码适配说明
- 你原代码中的 `GPIO_BC(GPIOA) = GPIO_PIN_9` 等价于 `gpio_bit_reset(...)`,项目里统一用后一个 API。
- `delay_ms(50)` 替换为 `SysTickTimer::delayMs(CONFIG_ESP32_RESET_HOLD_MS)`,与项目中其他复位/ADC 稳定延迟一致。
- 端口从 `GPIOA/PA9` 改为 `GPIOC/PC9` 的 `CONFIG_*` 常量,便于后续硬件变更。
### 验证
- 重新生成并编译 CMSIS csolution 工程(`cbuild DCU_APP.csolution.yml` 或 Keil Studio),确认新文件被编译、无重复定义、无未定义符号。
- 若编译失败,根据错误输出修正头文件包含或 cproject.yml 路径。
### 风险/注意事项
- `Esp32Reset::init()` 调用时 SysTick 已就绪,因此 50ms 阻塞等待是安全的(此时中断已使能但尚未初始化其他外设)。
- 若后续需要在运行期再次复位 ESP32,可直接调用 `Esp32Reset::assertReset()` + `SysTickTimer::delayMs(...)` + `Esp32Reset::releaseReset()`。
- 本次修改不改变 PA9 的 USART0_TX 功能,调试串口保持正常。