# 充电电源策略模块（主机候选）

`charge_manager.c/.h` 提供来源解码和 fail-closed 充电策略；`charge_registers.c/.h` 将策略 HAL 接到 HUSB238/BQ25798 的 7-bit I²C 地址、寄存器、CE GPIO 和毫秒时钟回调。它不是 STM32 工程或真实 HAL。应用读取一份连续寄存器快照后交给状态机。

策略只接受明确的 USB-PD 5V/9V 或 HUSB238 已检测的 5V Type‑C/BC1.2 来源；电压不符、来源未知、快照超过 500ms、电池/NTC检查失败、BQ 故障或任一写入失败时，立即拉高 CE 并请求重新启用 ILIM_HIZ 硬限流。来源电流先受当前工程候选 2A 上限约束，再留 10% 系统电流余量；充电电流暂固定在 BQ 的 3S POR 1A 上限；目标 ASIN 电池串数未确认。每个稳定有效工况不重复写寄存器。

目标板接入要求：

- `set_charge_enabled(false)` 必须对应 CE 高电平，硬件 R7 拉高应先于 MCU 启动生效；`true` 才可拉低。
- `set_input_limit_ma()` 对应 BQ25798 REG06 IINDPM，10mA/LSB、100–3300mA；`bq25798_encode_iindpm()` 已提供量化。REG14 的 EN_EXTILIM 为 bit 1，POR 开启，解除前必须已写入不高于识别来源的 IINDPM。
- `set_charge_limit_ma()` 对应 REG03 ICHG，10mA/LSB；硬件 POR 默认 1A。主机候选 `charge_registers.c` 已实现写入、回读和失败传播；目标 MCU 的 I²C HAL、超时与总线恢复仍未实现。
- 来源解码使用 HUSB238 7-bit 地址 0x08，PD_STATUS0/1 与 SRC_PDO_5V 为 0x00/0x01/0x02；BQ25798 使用 7-bit 地址 0x6B，VBUS ADC 0x35/0x36 为 1mV LSB。16-bit 寄存器按地址递增 MSB-first 写入/读回。参数已按 TI BQ25798 Rev C（2026-06）逐项核对。
- `charge_registers_init()` 拉高低有效 CE，设置 watchdog expiry 关闭充电，保持 40s BQ watchdog，并启用连续 15-bit ADC。应用必须每 10s 或更短周期调用 `charge_registers_kick_watchdog()`；掉线后 BQ 看门狗停止充电。另须实现 MCU 自身看门狗。
- 寄存器适配器只有在 BQ 报告 battery present、NTC 未被 ignore 且温度处于默认窗口时才将 `pack_and_ntc_valid` 置真；当前保守地拒绝 COOL/WARM JEITA 档。实际电池接入、NTC 型号/温区与 pack BMS 仍须按电池供应资料验证，不能将此状态视为 BMS 替代。
- 状态寄存器轮询已接入主机候选适配器；目标 MCU 仍须实现 I²C 锁/总线恢复、复位启动时 CE 默认态和线程时限，并在实机确认状态位清除语义。本模块不宣称这些目标侧工作已完成。

## 主机测试

从工程包根目录运行：

```sh
cc -std=c11 -Wall -Wextra -Werror -pedantic -O2 固件/drill_charge/charge_manager.c 固件/drill_charge/test_charge_manager.c -o /tmp/test-charge-manager
/tmp/test-charge-manager
clang -std=c11 -Wall -Wextra -Werror -pedantic -fsanitize=address,undefined -g 固件/drill_charge/charge_manager.c 固件/drill_charge/charge_registers.c 固件/drill_charge/test_charge_registers.c -o /tmp/test-charge-registers
/tmp/test-charge-registers
```

第一个测试覆盖来源电压/电流解码、2A 产品上限、10% 余量、IINDPM 量化、来源不支持/掉线、快照过期、VBUS 不符、电池/NTC/BQ 故障、稳定轮询和六个 HAL 写入失败位置。第二个测试通过模拟 7-bit I²C/GPIO 检查 HUSB/BQ 地址和寄存器、16-bit 字节序、ADC/看门狗启动设置、状态解析/回读与四个寄存器写入故障的关闭行为。测试只运行在 macOS 主机，不是 MCU 构建或充电器实测。
