# HC32F003 RGBCW 补光固件

华大半导体 HC32F003 嵌入式固件，用于捕获涂鸦/米家模块 CW+RGB 五路 PWM 信号，经查找表插值后输出 RGBWC 五路补光 PWM。

---

## 文件说明

| 文件 | 说明 |
|------|------|
| `hc32f003_config.h` | 芯片配置：引脚定义、寄存器地址、全局常量、工具宏 |
| `lut.h / lut.c` | 查找表数据结构 + CW→RGBWC 插值算法（算法一），整数定点实现 |
| `rgb_power.h / rgb_power.c` | RGB 恒功率修正算法（算法二），防止混色时总功率超限 |
| `uart_cmd.h / uart_cmd.c` | UART0 命令解析：中断 + 环形缓冲区 + 状态机 |
| `pwm_capture.h / pwm_capture.c` | 5 路 PWM 输入捕获（GPIO 外部中断 + SysTick 软件计时） |
| `pwm_output.h / pwm_output.c` | 5 路 PWM 输出（ATIM + BTIM0/1），约 2kHz |
| `flash_store.h / flash_store.c` | Flash IAP：查找表读写 + CRC32 校验 |
| `main.c` | 主函数、主循环、中断服务函数入口 |

---

## 硬件引脚

| 信号 | 引脚 | 方向 | 外设 |
|------|------|------|------|
| IN_W（暖白捕获） | P01 | 输入 | EXTI + SysTick 计时 |
| IN_C（冷白捕获） | P02 | 输入 | EXTI + SysTick 计时 |
| IN_R（红色捕获） | P03 | 输入 | EXTI + SysTick 计时 |
| IN_G（绿色捕获） | P14 | 输入 | EXTI + SysTick 计时 |
| IN_B（蓝色捕获） | P15 | 输入 | EXTI + SysTick 计时 |
| OUT_R | P23 | 输出 | ATIM CH1 |
| OUT_G | P24 | 输出 | ATIM CH2 |
| OUT_B | P25 | 输出 | ATIM CH3 |
| OUT_W | P26 | 输出 | BTIM0 CH1 |
| OUT_C | P27 | 输出 | BTIM1 CH1 |
| UART0 RX | P31 | 输入 | UART0 |

---

## 工程集成步骤

### 1. 添加源文件

将以下文件添加到你的 Keil / IAR / CMake 工程：

```
main.c
lut.c
rgb_power.c
uart_cmd.c
pwm_capture.c
pwm_output.c
flash_store.c
```

头文件路径添加：固件所在目录

### 2. 链接 HC32F003 DDL 库

本固件所有外设操作均调用 HC32F003 官方 DDL（Device Driver Library）函数，需要：

1. 下载华大半导体 HC32F003 DDL SDK（官网或华大代理商获取）
2. 在工程中添加 DDL 源文件（`hc32f003_ddl.lib` 或对应 `.c` 文件）
3. 添加 DDL 头文件路径（包含 `hc32f003.h`、`gpio.h`、`uart.h`、`atim.h` 等）

### 3. 中断向量配置

在 `startup_hc32f003.s`（或等效启动文件）中，确认以下中断服务函数名称与本固件一致：

| 向量名称 | 对应函数 | 说明 |
|----------|----------|------|
| SysTick_Handler | `pwm_capture.c` | 1us 计数器 |
| Uart0_IRQHandler | `main.c` 调用 `UartCmd_RxIsr()` | UART0 接收 |
| Exti01_IRQHandler | `main.c` 调用 `PwmCapture_EdgeIsr()` | P01/P02 边沿 |
| Exti23_IRQHandler | `main.c` 调用 `PwmCapture_EdgeIsr()` | P03 边沿 |
| Exti49_IRQHandler | `main.c` 调用 `PwmCapture_EdgeIsr()` | P14/P15 边沿 |

> **注意**：不同版本 DDL 的向量名称可能不同，请对照 `startup_hc32f003.s` 中的 DCD 表修改 `main.c` 中的 ISR 函数名。

### 4. 在 ISR 中填写 DDL 调用

`main.c` 中的 `Exti01_IRQHandler`、`Exti23_IRQHandler`、`Exti49_IRQHandler` 等 ISR 函数内有注释标出需要用户填写的 DDL 读 GPIO / 清中断标志代码，例如：

```c
void Exti01_IRQHandler(void)
{
    uint32_t ts = g_us_tick;
    uint8_t p01_level = Gpio_GetInputIO(GpioPort0, GpioPin1);
    uint8_t p02_level = Gpio_GetInputIO(GpioPort0, GpioPin2);
    Exti_ClearFlag(ExtiLine0);
    Exti_ClearFlag(ExtiLine1);
    PwmCapture_EdgeIsr(0, p01_level, ts);  // IN_W
    PwmCapture_EdgeIsr(1, p02_level, ts);  // IN_C
}
```

---

## 烧录方法

### 使用 Keil MDK + J-Link / DAP-Link

1. 打开 Keil 工程，配置目标芯片为 **HC32F003**
2. 进入 **Options for Target → Debug**，选择调试器（J-Link / CMSIS-DAP）
3. 连接 SWD 接口（SWDIO / SWDCLK / GND / 3.3V）
4. 点击 **Flash → Download** 烧录固件

### 使用华大官方烧录工具

1. 下载 **华大半导体 ISP 工具**（Hdsc_Programmer）
2. 通过 UART0（P31 RX）连接 ISP 接口
3. 按住 BOOT 引脚（若有）上电进入 ISP 模式
4. 在工具中选择 HC32F003，加载 .hex 文件，点击烧录

### Flash 布局

| 地址范围 | 内容 |
|----------|------|
| 0x08000000 ~ 0x08007DFF | 用户固件代码（约 31.5KB） |
| 0x08007E00 ~ 0x08007FFF | 查找表存储（最后 512 字节 Sector） |

---

## 串口调试说明

波特率：**9600bps，8N1，无硬件流控**

推荐工具：SecureCRT / MobaXterm / SSCOM

### 命令速查表

| HEX 命令 | 功能 |
|----------|------|
| `33 59 01` | 进入 DEBUG 调试模式 |
| `33 59 00` | 进入 AUTO 自动模式 |
| `AB CD 00 [140字节]` | 设置 layer[0]（100%亮度查找表），共 20点 × 7字节 |
| `AB CD 01 [140字节]` | 设置 layer[1]（70%亮度查找表） |
| `12 34 43 21` | 打印当前查找表（HEX 格式，40行） |
| `12 34 56 78` | 打印当前5路PWM捕获值 |

### DEBUG 模式直通控制

进入 DEBUG 模式后，发送 5 字节即可直接控制 5 路输出：

```
33 59 01          → 进入 DEBUG 模式
[R] [G] [B] [W] [C]  → 各 1 字节，直接设置 5 路输出（0-255）
```

示例：所有通道半亮
```
33 59 01 80 80 80 80 00
```

### 查找表格式（AB CD 命令）

140 字节 = 20 个节点 × 7 字节/节点，每个节点格式：

```
[w1][c1][r][g][b][w][c]
```

- 节点必须按 **w1 降序** 排列（w1=255 在前，w1=0 在后）
- 末尾空闲节点填 `00 00 00 00 00 00 00`

---

## 算法说明

### 算法一：CW→RGBWC 插值

根据输入的暖白（W）和冷白（C）占空比，从查找表中查找相邻节点，线性插值后乘以亮度系数 T，得到 RGBWC 5 路补光输出。

亮度区段划分：

| total = W + C | 层 | T 值 |
|---------------|----|------|
| ≥ 253 | layer[0] | 1.0 |
| 188 ~ 252 | layer[0] | total / 255 |
| 185 ~ 187 | layer[1] | 1.0 |
| < 185 | layer[1] | total / 186 |

所有运算使用整数定点（×10000 精度），不使用浮点。

### 算法二：RGB 恒功率修正

防止 RGB 三路同时高占空比时总功率超限。根据最大通道值归一化后，按比例降低各通道输出。

---

## 注意事项

1. **Flash 写入**：每次写入查找表会擦除最后一个 Sector，擦写次数有限（HC32F003 典型 10,000 次），频繁调试时注意。
2. **SysTick 占用**：本固件 SysTick 用于 PWM 捕获计时（1us），若 HAL 库已占用 SysTick，需改用其他基本定时器提供时间戳。
3. **PWM 捕获精度**：软件计时方案受中断延迟影响，实际精度约 ±2us，对 1kHz PWM（1ms 周期）精度约 0.2%，满足 8 位分辨率要求。
4. **DDL 版本**：不同版本 HC32F003 DDL 的函数名称可能有差异，请对照 DDL 文档修改 `Init` 函数中的外设调用代码。
