feat(can): 反馈报文刷新率逐帧可配置并持久化

STATUS/CONFIG 反馈帧各自独立按 period_ms(1ms 节拍分频,0=停发)发送,
默认 STATUS 1kHz、CONFIG 250Hz,可运行时修改:

- 0x0400 扩展格式(DLC=4):[选择器 u16][值 u16],选择器 0x0000=节点 ID
  (仅单播),0x0100/0x0101=对应帧刷新周期;回 5B ACK,广播只应用不应答
- 0x0401 扩展格式(DLC=2):查询选择器对应值,回 [sel][val](4B);
  DLC<=1 及 SET DLC 1~2 保持旧格式行为完全不变
- 刷新率经 FlashEEPROM 独立 u16 记录(虚拟地址 0x08/0x09)持久化,
  不并入 6 参数 CRC 组,避免老设备升级后整组参数回退默认值
- save_system_config 追加从 RAM 副本回写两条记录,页满 format()
  重建后配置不丢失;read() 增加保留字节校验防 CRC 头部字误匹配
- CANFD_all_Send 拆分为 send_status_frame/send_config_frame,
  初始化失败上报路径直调 STATUS 帧不受分频影响

GATE_DRIVER_DRV8323 0/1 两种板型均编译通过
This commit is contained in:
cbb
2026-09-12 19:00:06 +08:00
parent 0d3bd9cbc6
commit 40fea328b0
6 changed files with 283 additions and 49 deletions
+15
View File
@@ -57,9 +57,16 @@ class FlashEEPROM {
static constexpr u8 ADDR_VEL_LIMIT = 0x05; // 角度数据存储地址
static constexpr u8 ADDR_NODE_ID = 0x06; // 节点 ID 存储地址
static constexpr u8 ADDR_CALIBRATION_ANGLE = 0x07; // 电角度零位校准角存储地址
static constexpr u8 ADDR_TX_PERIOD_STATUS = 0x08; // STATUS 帧刷新周期(ms)存储地址
static constexpr u8 ADDR_TX_PERIOD_CONFIG = 0x09; // CONFIG 帧刷新周期(ms)存储地址
bool system_config_saved = false;
u8 EEPROMStatus;
// 周期反馈帧刷新周期 RAM 副本(ms,0=停发)。init() 从 Flash 加载,
// 无记录时回退 config.h 默认值;CAN_transmiter::init() 读取应用,
// SET 命令修改后经 write_tx_periods() 持久化
u16 tx_period_status_ms = CANFD_TX_PERIOD_STATUS_DEFAULT_MS;
u16 tx_period_config_ms = CANFD_TX_PERIOD_CONFIG_DEFAULT_MS;
// 构造函数
FlashEEPROM();
@@ -128,6 +135,14 @@ class FlashEEPROM {
*/
FlashEepromStatus save_calibration_angle(float angle);
// 周期反馈帧刷新率持久化(独立 u16 记录,不属于 CRC 参数组,
// 读取失败/无记录由调用方回退默认值,避免老设备升级后 CRC 全组失效)
/**
* @brief 将 RAM 副本中的两帧刷新周期写入 Flash(值不变自动跳过)
* @return FlashEepromStatus 操作状态
*/
FlashEepromStatus write_tx_periods();
// 节点 ID 独立读写函数(主/备双备份分属独立 Flash 页 + 魔数 + 计数器 + CRC)
// 从 Flash 读取节点 ID(双备份均有效取计数器最新,单份有效则回退)
/**