ch32v307_camera/README.md
2026-03-15 16:47:32 +08:00

257 lines
10 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.

# CH32V307 TCPClient — 红外热像采集端固件MCU 端)
> **MCU**: CH32V307WCU6 (RISC-V, 144 MHz)
> **协议版本**: QDX v2.0 / 采集端通信协议规范 v2.1.3
> **固件版本**: v2.0 自主触发架构
> **最近更新**: 2026-03
---
## 目录
1. [项目简介](#1-项目简介)
2. [硬件配置](#2-硬件配置)
3. [软件架构](#3-软件架构)
4. [目录结构](#4-目录结构)
5. [快速上手](#5-快速上手)
6. [编译期配置](#6-编译期配置)
7. [网络配置](#7-网络配置)
8. [运行时行为](#8-运行时行为)
9. [GPIO 引脚分配](#9-gpio-引脚分配)
10. [已知问题 / TODO](#10-已知问题--todo)
11. [参考文档](#11-参考文档)
---
## 1. 项目简介
本项目是基于 **CH32V307WCU6** 的红外热像**采集端**MCU 端)嵌入式固件,实现以下核心功能:
- 驱动 **Mini212G2** 红外热像仪256×192Y16 原始温度格式)采集帧数据
- 运行 **FreeRTOS** 实时操作系统,多任务并行处理
- 通过 **WCHNET 1000M 以太网** 与**上位机**ConfigServer运行于 PC/服务器)进行 TCP 通信
- 使用 **QDX TLV 二进制协议**(帧头 `0x55AA`,协议版本 v2.0)向上位机上报数据
- 支持 **2D 触发连拍**(内部温度触发 / 外部 GPIO 触发)与 **1D 时序采集**
- 支持上位机运行时下发配置MCU采集端**自主驱动**全部业务逻辑
---
## 2. 硬件配置
| 资源 | 规格 |
|------|------|
| MCU | CH32V307WCU6RISC-V144 MHz |
| FLASH | 128 KB |
| SRAM | 192 KBOption Bytes [7:5]=110 |
| 传感器 | Mini212G2256×192Y16 原始温度 |
| 网络接口 | 1000M 以太网RGMIIWCHNET |
| 串口调试 | USART3921600 baudPB10 TX / PB11 RX |
| 外部触发输入 | PA15 / EXTI15上升沿 |
| NG 输出 | PA8推挽高有效脉冲宽度可配 |
| DVP 接口 | 传感器图像数据采集DMA 行搬运) |
---
## 3. 软件架构
```
┌──────────────────────────────────────────────────────┐
│ FreeRTOS 任务层 │
│ task_net_entry — WCHNET 轮询 / TCP 收发 │
│ task_business_entry — 业务主循环2D/1D 状态机) │
│ task_test_pattern — 仅测试模式:模拟帧生成 │
└─────────────────┬────────────────────────────────────┘
┌─────────────────▼────────────────────────────────────┐
│ 中间件 / 协议层 │
│ QDX 协议栈 — TLV 编解码、TCP 逻辑封装 │
│ qdx_preprocess — 滑窗 ROI + 温度统计 + 降尺寸 │
└─────────────────┬────────────────────────────────────┘
┌─────────────────▼────────────────────────────────────┐
│ 驱动 / HAL 层 │
│ eth_driver — WCHNET 以太网驱动 │
│ dvp.c — DVP + DMA 行采集 │
│ mini212g2.c — 传感器控制(当前通过 USB 预配置) │
│ debug.c — USART1 调试输出 │
└──────────────────────────────────────────────────────┘
```
### RTOS 资源
| 组件 | 说明 |
|------|------|
| FreeRTOS v202112.00 | Heap_4Heap 大小 16 KB |
| WCHNET | 万瑞 TCP/IP 协议栈2 个 TCP socket |
| QDX 协议栈 | 自定义 TLV 二进制协议,双缓冲零拷贝 TX |
| 预处理模块 | 滑窗 ROI 搜索 + 最大/平均温度统计 + 自动降尺寸 |
---
## 4. 目录结构
```
Project_Ch32v307/
├── User/ # 应用层入口
│ ├── main.c # 初始化、FreeRTOS 任务创建、业务状态机
│ ├── net_config.h # WCHNET socket / MAC 参数
│ ├── FreeRTOSConfig.h
│ └── ch32v30x_conf.h
├── Middle/
│ └── QDXnetworkStack/ # QDX TLV 协议栈(端口适配 + 预处理 + TCP 逻辑)
├── Debug/
│ ├── dvp.c/h # DVP + DMA 传感器图像采集
│ └── mini212g2.c/h # Mini212G2 传感器驱动
├── NetLib/ # WCHNET 以太网驱动(多 PHY 版本)
├── FreeRTOS/ # FreeRTOS 内核 + portable + MemMang
├── Peripheral/ # CH32V30x 外设库
├── Core/ # RISC-V 内核支持
├── Startup/ # 启动汇编文件
├── Ld/ # 链接脚本
└── Doc/ # 协议规范、用户手册等文档
```
---
## 5. 快速上手
### 5.1 工具链要求
- **IDE**: MounRiver Studio推荐或 GCC RISC-V 工具链
- **调试器**: WCH-Link
### 5.2 编译步骤
1. 用 MounRiver Studio 打开 `TCPClient1.wvproj`
2. 根据实际环境修改 `User/net_config.h` 中的 IP 地址(见[网络配置](#7-网络配置)
3. 按需设置 `User/main.c` 顶部的 `TEST_PATTERN_MODE`
4. 编译并烧录到目标板
### 5.3 两种运行模式
| 项目 | 测试模式 (`TEST_PATTERN_MODE=1`) | 正常模式 (`TEST_PATTERN_MODE=0`) |
|------|------|------|
| 数据来源 | 软件生成模拟热图 (~10 FPS) | Mini212G2 传感器 DVP/DMA 采集 |
| 硬件依赖 | 仅需网口 | 需连接 Mini212G2 + DVP 线缆 |
| 默认配置 | 自动注入2D Enabled=1内部触发80°C 阈值) | 等待服务器下发,默认不使能 |
| 适用场景 | 协议联调、网络测试 | 实际生产部署 |
---
## 6. 编译期配置
所有宏定义位于 `User/main.c` 文件头部。
### 主模式开关
| 宏名 | 默认值 | 说明 |
|------|--------|------|
| `TEST_PATTERN_MODE` | `0` | **唯一编译开关**`1`=测试模式,`0`=正常模式 |
### 业务常量
| 宏名 | 默认值 | 说明 |
|------|--------|------|
| `DEFAULT_BURST_COUNT` | `3` | 服务器未配置时的默认连拍帧数 |
| `DEFAULT_BURST_INTERVAL_MS` | `200` | 默认连拍间隔ms |
| `MAX_TCP_PAYLOAD_SIZE` | `9216` | TCP 发送缓冲区大小(字节) |
| `NG_PULSE_MS` | `200` | NG 脉冲默认宽度(服务器可通过 `NGioDelay` 覆盖) |
| `MAX_1D_POINTS` | `512` | 1D 采集缓冲最大样本数 |
### 传感器尺寸(`Debug/dvp.h`
| 宏名 | 值 | 说明 |
|------|-----|------|
| `SENSOR_WIDTH` | `256` | 传感器像素宽度 |
| `SENSOR_HEIGHT` | `192` | 传感器像素高度 |
| `BYTES_PER_LINE` | `512` | 每行字节数256×2 |
---
## 7. 网络配置
网络参数在 `User/net_config.h``User/main.c` 中配置:
| 参数 | 说明 |
|------|------|
| 本机 IP | 静态 IP`main.c` 初始化结构体中设置) |
| 控制通道 | TCP主动连接上位机ConfigServer控制端口接收命令与配置 |
| 数据通道 | TCP主动连接上位机ConfigServer数据端口上报帧数据 |
| TCP socket 数 | 2`WCHNET_NUM_TCP=2` |
| TCP MSS | 1460 字节 |
| KeepAlive | 开启20 s 空闲 / 15 s 探测 / 9 次 |
通信协议详见 [Doc/采集端通信协议规范.md](Doc/采集端通信协议规范.md)。
---
## 8. 运行时行为
系统行为完全由上位机ConfigServer运行时配置驱动MCU 为采集端,主动连接上位机:
```
上位机下发 Config2D (Enabled=1) → MCU采集端自主执行 2D 触发 / 连拍 / 上报
上位机下发 Config1D (Enabled=1) → MCU采集端自主执行 1D 时序采集 / 上报
两者互斥Config2D.Enabled 优先级高于 Config1D.Enabled
```
### 2D 触发状态机
```
IDLE → 检测触发条件(内部温度阈值 or 外部 GPIO
→ 防抖DebounceMs
→ 延迟DelayMs
→ 连拍 N 帧BurstCount × BurstIntervalMs
→ 每帧:预处理 → TCP 上报 → NG 输出(若 NG 条件满足)
→ IDLE
```
### 1D 采集状态机
```
IDLE → 触发(外部 GPIO 高电平计时 or 内部连续 3 帧超阈值)
→ 防抖HighTimerLimit
→ 逐帧采样温度点(中心行最大值)
→ 阈值停止
→ 裁切 [LSizeStart, -RSizeStart]
→ TCP 上报
→ IDLE
```
### TEMP_REQ 辅助通道
服务器可随时发送 `TEMP_REQ` 命令MCU 立即采集当前帧并上报(`frameType=0x02`),不影响主状态机。
---
## 9. GPIO 引脚分配
| 引脚 | 方向 | 功能 |
|------|------|------|
| PA15 | 输入 | 外部触发2D/1D上升沿EXTI15 |
| PA8 | 输出 | NG 信号(推挽,高有效,脉冲宽度可配) |
| PA2/PA3 | — | USART2已被 DVP 占用,传感器通过 USB 预配置,**不可复用** |
| USART1 | 输出 | 921600 baud 调试串口 |
---
## 10. 已知问题 / TODO
- [ ] 需与采集端联调具体业务逻辑
- [ ] 上位机接收上报温度数据后出现卡死/异常,待排查
---
## 11. 参考文档
| 文档 | 说明 |
|------|------|
| [Doc/采集端通信协议规范.md](Doc/采集端通信协议规范.md) | QDX TLV 协议完整规范v2.1.3 |
| [Doc/函数调用指南.md](Doc/函数调用指南.md) | 主要 API 调用说明 |
| [Doc/模式配置与功能说明.md](Doc/模式配置与功能说明.md) | 编译期/运行时配置详细说明 |
| [Doc/下位机协议实现完备性分析.md](Doc/下位机协议实现完备性分析.md) | 协议实现覆盖度分析 |
| [Doc/CH32二维运行结构概览.md](Doc/CH32二维运行结构概览.md) | 系统状态机全景图 |
| [Doc/TCPClient测试指南.md](Doc/TCPClient测试指南.md) | 测试模式使用说明 |
| [Doc/Mini212G2用户手册.md](Doc/Mini212G2系列用户手册.md) | 传感器硬件手册 |
| [Doc/Mini212G2串口通讯协议.md](Doc/Mini212G2串口通讯协议.md) | 传感器通信协议 |