Replace Lx layer labels with plain Chinese

2026-11-01 22:32:18 +08:00
parent bb2e0ce204
commit d6314d6f2a
9 changed files with 44 additions and 44 deletions
+4 -4
@@ -13,7 +13,7 @@ STM32F4-Base 是一套面向工业现场的嵌入式平台固件, 也是一块**
```text
TPAFE5160(8 路电气量) + STM32 ADC1(9 路)
└─ TIM3 1 kHz 硬件节拍 → adcTask
└─ L1 采集层 → L2 相量/测频 → L3 保护判据
└─ 采集处理 → 相量/测频 → 保护判据
└─ protectTask(20 ms) → IEC 60870-5-104(TCP 2404)
```
@@ -22,7 +22,7 @@ TPAFE5160(8 路电气量) + STM32 ADC1(9 路)
| 能力 | 状态 |
|---|---|
| 平台能力: 网络 / 存储 / 时间 / UI / 日志 / 看门狗 / FTP / 配置 | ✅ 已实现并台架验收 |
| 采集主线: L1 → L2 → L3 → protectTask → IEC 104 | ✅ 已闭环(2026-10-12, B5) |
| 采集主线: 采集处理 → 相量/测频 → 保护判据 → protectTask → IEC 104 | ✅ 已闭环(2026-10-12, B5) |
| RS-485 对下采集(ModBus RTU) | ⬜ 未接线; B2 按用户决定冻结(2026-10-12) |
| V0.1 硬件 8 路电气量分属两片转换器 | ⚠ 已知硬件缺陷, V0.2 修复前禁止跨转换器做相位/功率运算 |
@@ -49,12 +49,12 @@ TPAFE5160(8 路电气量) + STM32 ADC1(9 路)
| [快速开始](快速开始) | 环境准备、编译、烧录、上电测试、串口与模拟器 |
| [项目架构](项目架构) | 分层、9 个任务、就绪屏障、启动时序、数据流、目录地图 |
| [硬件平台](硬件平台) | V0.1 引脚、外设、存储与硬件约束 |
| [采集与算法](采集与算法) | ADC 采样链、L1/L2/L3、保护任务、IEC 104、RS-485 现状 |
| [采集与算法](采集与算法) | ADC 采样链、采集/相量/保护处理、保护任务、IEC 104、RS-485 现状 |
| [存储子系统](存储子系统) | NAND → dhara FTL → FatFs、配置文件、日志与存储陷阱 |
| [网络子系统](网络子系统) | CH395F、BSD Socket、FTP/对时/远程显示/104、网络配置 |
| [UI子系统](UI子系统) | LVGL、菜单树、内容页、字体、PC 模拟器、远程显示协议 |
| [开发指南](开发指南) | 编码铁律、构建门禁、新增文件、内存预算、CubeMX 规则 |
| [测试与调试](测试与调试) | L0~L3、`@build`/`@test`、串口助手、ST-LINK、CI |
| [测试与调试](测试与调试) | 各类测试、`@build`/`@test`、串口助手、ST-LINK、CI |
| [已知陷阱](已知陷阱) | 高频踩坑速查: 编码、RTOS、FatFs、ADC、网络、烧录 |
| [术语表](术语表) | DTU / FTL / BBT / IWDG / 104 / RemoDispBus 等 |
| [文档地图](文档地图) | 仓库文档全量入口与按角色阅读顺序 |
+2 -2
@@ -24,11 +24,11 @@
## 2. 菜单树
- 规模: 9 个菜单节点(含根)+ 33 个叶子 = **42 节点**; 最大深度 **4 级(L0~L3)**。
- 规模: 9 个菜单节点(含根)+ 33 个叶子 = **42 节点**; 最大深度 **4 级**。
- 根页 7 个一级条目: **装置信息 / 实时数据 / 参数定值 / 三遥设置 / 装置维护 / 通讯参数 / 记录查询**。
```text
主界面 (L0)
主界面
├─ 装置信息 [叶子]
├─ 实时数据 ▶
│ ├─ 交流量 ├─ 直流量 └─ 遥信量
+3 -3
@@ -28,7 +28,7 @@
# 自动化测试(@test)
.venv\Scripts\python.exe .dsh\skills\serial-boot-test\scripts\run_boot_test.py
# 本地等价门禁: L0 静态 + L0b + L0.5 主机侧单测
# 本地等价门禁: 静态检查 + 主机侧单元测试
.venv\Scripts\python.exe scripts/ci_local.py
# 全库 pre-commit
@@ -62,7 +62,7 @@ pre-commit install
### 2.3 CI
Gitea Actions 只跑 **L0 静态门禁 + L0.5 主机侧单测**, **刻意不跑 `@build`**(需要本机 Keil 授权), 也不跑 L1/L2/L3(需要真机)。远程 CI 只跑在本机一台 runner `win-stm32-ci` 上; runner 不在线不影响本地门禁。详见 `docs/CI/README.md`。
Gitea Actions 只跑 **静态检查和主机侧单元测试**, **刻意不跑 `@build`**(需要本机 Keil 授权), 也不跑板端测试、模拟器回归和真机台架(需要真机)。远程 CI 只跑在本机一台 runner `win-stm32-ci` 上; runner 不在线不影响本地门禁。详见 `docs/CI/README.md`。
## 3. 新增与修改文件
@@ -115,7 +115,7 @@ Gitea Actions 只跑 **L0 静态门禁 + L0.5 主机侧单测**, **刻意不跑
- `Inc/` / `Src/` 是 CubeMX 生成文件; 自定义代码只写 `USER CODE` 区。
- 重生成会覆盖标记区之外的一切; `.ioc` 的 `KeepUserCode=true` 只保护 USER CODE 区。
- 防丢失三层优先级: **L1 写进 `.ioc` → L2 搬进 USER CODE 区 → L3 审计兜底**。
- 防丢失三层优先级: **写进 `.ioc` → 搬进 USER CODE 区 → 审计兜底**。
- 每次重生成后立刻运行:
```powershell
+1 -1
@@ -52,7 +52,7 @@
|---|---|
| [`docs/算法/傅氏算法详解.md`](http://gitea.bitnasdaq.vip/wandering1/STM32F4-Base/src/branch/master/docs/算法/傅氏算法详解.md) | 全周傅氏原理与工程实现 |
| [`docs/算法/继电保护功能复现规划.md`](http://gitea.bitnasdaq.vip/wandering1/STM32F4-Base/src/branch/master/docs/算法/继电保护功能复现规划.md) | 保护链路、平台适配、路线图 |
| [`App/algo/README.md`](http://gitea.bitnasdaq.vip/wandering1/STM32F4-Base/src/branch/master/App/algo/README.md) | L1/L2/L3 模块与代码边界 |
| [`App/algo/README.md`](http://gitea.bitnasdaq.vip/wandering1/STM32F4-Base/src/branch/master/App/algo/README.md) | 采集处理、相量/测频、保护判据模块与代码边界 |
## 6. UI
+6 -6
@@ -61,12 +61,12 @@
| **TRGO** | Timer Trigger Output; TIM3 更新事件经 TRGO 触发 ADC1 |
| **CONVST** | Convert Start; TPAFE5160 的转换启动脉冲 |
| **1 kHz / 20 点周波** | 采样率 1000 Hz; 50 Hz 下每周期 20 点 |
| **L1** | 采集层: 语义通道映射、有效性、健康 |
| **L2** | 相量层: 采样环 + 全周傅氏 + 相量 |
| **L2.5** | 测频层: 自适应窗频率测量 |
| **L3** | 保护层: 定值与保护元件判据 |
| **采集处理层** | 语义通道映射、有效性、健康检查 |
| **相量层** | 采样环 + 全周傅氏 + 相量计算 |
| **测频** | 自适应窗频率测量 |
| **保护判据层** | 定值与保护元件判据 |
| **全周傅氏 / DFT** | 全周波离散傅氏变换; 利用正交性做梳状带通, 计算幅值/相位 |
| **相量** | 用幅值和相位表示的正弦量; L2 输出 |
| **相量** | 用幅值和相位表示的正弦量; 相量层输出 |
| **RMS** | 有效值; 傅氏系数表折算 |
| **protectTask** | 20 ms 保护判据任务 |
| **定值** | 保护动作门槛与参数; 存 `/prot_set.bin` |
@@ -95,7 +95,7 @@
| **pre-commit** | Git 提交前自动执行的检查框架; 本项目约 33 个钩子 |
| **cppcheck** | C/C++ 静态分析工具; 本项目对项目代码执行 |
| **gitlint** | Git 提交信息格式检查 |
| **L0 / L0.5 / L1 / L2 / L3** | 静态门禁 / 主机侧单测 / 板端套件 / 模拟器回归 / 真机台架 |
| **测试分类** | 静态检查 / 主机侧单元测试 / 板端套件 / 模拟器回归 / 真机台架 |
| **B0 / B1 / B2 / B4 / B5 / B7 / B8** | 项目内部任务编号: B0 产品定义、B1 采集链路、B2 RS-485、B4 104 上行、B5 保护任务、B7 定值落盘、B8 测频 |
| **E-xx / N-xx** | 问题/登记项编号, 见 `docs/任务规划/` 与 `docs/问题记录/` |
| **双端** | MCU(Keil/ARMCC)与 PC 模拟器(CMake/MSVC)共用同一份源码 |
+10 -10
@@ -1,23 +1,23 @@
# 测试与调试
> 测试分四层: L0 静态门禁、L0.5 主机侧单测、L1 板端套件 / L2 模拟器回归、L3 真机台架。日常改代码至少跑 L0 + L0.5; 涉及硬件再跑 `@test`。
> 测试分四类: 静态检查、主机侧单元测试、板端套件 / 模拟器回归、真机台架。日常改代码至少跑静态检查 + 主机侧单元测试; 涉及硬件再跑 `@test`。
>
> 细节见 `docs/测试说明/自动化测试流程.md`、`测试开发标准流程.md`、`实机测试实施指南.md`。
## 1. 测试分层
## 1. 测试分类
| 层 | 内容 | 运行位置 |
| 类别 | 内容 | 运行位置 |
|---|---|---|
| **L0** | 静态门禁: pre-commit 全钩子(cppcheck、编码规范、乱码、文档链接、任务表、内存数字、双端注册、RAM 预算等) | 本地 / CI |
| **L0.5** | 主机侧单元测试: MSVC 离线编译真实源码 | 本地 / CI |
| **L1** | 板端测试套件: CH395F / 存储 / GD5F / RTC 等 | 本地(需真机) |
| **L2** | LVGL 模拟器回归: 菜单像素、内容页黄金参考、池水位 | 本地(需模拟器) |
| **L3** | 真机台架: `@test` 闭环 + 探针 + 长跑 | 本地(需真机 + ST-LINK) |
| **静态检查** | 静态门禁: pre-commit 全钩子(cppcheck、编码规范、乱码、文档链接、任务表、内存数字、双端注册、RAM 预算等) | 本地 / CI |
| **主机侧单元测试** | MSVC 离线编译真实源码 | 本地 / CI |
| **板端测试套件** | CH395F / 存储 / GD5F / RTC 等 | 本地(需真机) |
| **模拟器回归** | 菜单像素、内容页黄金参考、池水位 | 本地(需模拟器) |
| **真机台架** | `@test` 闭环 + 探针 + 长跑 | 本地(需真机 + ST-LINK) |
## 2. 日常命令
```powershell
# L0 + L0b + L0.5(推荐每次提交前)
# 静态检查 + 主机侧单元测试(推荐每次提交前)
.venv\Scripts\python.exe scripts/ci_local.py
# 全库 pre-commit
@@ -105,7 +105,7 @@ FAIL / ERROR / HardFault / [ERR]
- 运行用 `board-test-suite` skill; 测试指南见 `docs/测试说明/*_Test_Guide.md`。
- ⚠ 跑一轮破坏性 GD5F 测试会让 dhara 多记一个坏块, 且该计数持久化, 普通恢复清不掉; 只有明确要做容量恢复/全片擦除时才开。
## 7. 主机侧单元测试(L0.5)
## 7. 主机侧单元测试
在 PC 上用 MSVC 离线编译真实源码, 不依赖硬件。主要模块:
+1 -1
@@ -97,7 +97,7 @@ V0.1 相比 V0.0:
3. RS-485 初始化;
4. GD5F NAND 初始化(BBT 扫描, 启动段最耗时);
5. TPAFE5160 初始化;
6. L1 `adc_input_init()` → L2 `phasor_init()` / `freq_init()` → L3 `prot_set_init()` / `prot_elm_init()`;
6. 采集处理 `adc_input_init()` → 相量 `phasor_init()` / 测频 `freq_init()` → 保护判据 `prot_set_init()` / `prot_elm_init()`;
7. SD2506 诊断(ID/时间/温度/电池);
8. 启动 TIM3 1 kHz 采样节拍。
+11 -11
@@ -1,6 +1,6 @@
# 采集与算法
> 从两片转换器到 104 主站的一条最小闭环。当前状态: **L1 → L2 → L3 → protectTask → IEC 104 已闭环**(B5, 2026-10-12); **RS-485 对下采集尚未接线**(B2 冻结)。
> 从两片转换器到 104 主站的一条最小闭环。当前状态: **采集处理 → 相量/测频 → 保护判据 → protectTask → IEC 104 已闭环**(B5, 2026-10-12); **RS-485 对下采集尚未接线**(B2 冻结)。
>
> 细节见 `App/algo/README.md`、`docs/算法/继电保护功能复现规划.md`、`docs/子系统设计/ADC采样节拍设计说明.md`、`docs/子系统设计/IEC104上行设计说明.md`。
@@ -16,10 +16,10 @@
adc_input_poll()(每拍)
│
▼
L1 采集层: 语义映射 / 有效性 / 健康
L2 相量层: sample_ring → 全周傅氏 → phasor
L2.5 测频: freq(自适应窗)
L3 保护层: prot_set / prot_elm
采集处理层: 语义映射 / 有效性 / 健康
相量层: sample_ring → 全周傅氏 → phasor
测频: freq(自适应窗)
保护判据层: prot_set / prot_elm
│
▼
protectTask(20 ms)
@@ -55,7 +55,7 @@
- 消费者侧统一经 `adc_input_poll()` / `adc_input_raw()` 按**语义**取数, 不写死下标。
- ISR 侧只能走 `adc_tick_irq_notify()`(内含“消费者就绪”门); TIM3 比调度器早约 100 ms 启动。
## 3. L1 采集层
## 3. 采集处理层
模块: `App/algo/adc_input.*`、`App/algo/adc_health.*`。
@@ -69,23 +69,23 @@
> 映射权威表: `docs/硬件平台/ADC通道映射说明.md`。网名 `AINn` ≠ 板级 `ADCn` ≠ 转换器通道号, **必须查表**。
## 4. L2 相量层与 L2.5 测频
## 4. 相量层与测频
模块: `App/algo/sample_ring.*`、`App/algo/phasor.*`、`App/algo/freq.*`。
- **sample_ring**: 按采样节拍写入环形缓冲, 供相量计算取窗。
- **phasor**: 全周波傅氏(单频 DFT)算法; 利用正交性做梳状带通, 抑制谐波; 滑动窗更新; 输出幅值/相位; 系数表折算有效值, 区分保护/遥测双轨。
- **freq**: L2 派生量, 自适应窗测频; 由 `adcTask` 每拍运行, 保护判据经 `prot_elm_run()` 取数。
- 纯算法层不依赖外设/RTOS, 可在主机侧单测(L0.5)。
- **freq**: 相量派生量, 自适应窗测频; 由 `adcTask` 每拍运行, 保护判据经 `prot_elm_run()` 取数。
- 纯算法层不依赖外设/RTOS, 可在主机侧单元测试。
> 傅氏算法原理与工程实现见 `docs/算法/傅氏算法详解.md`; 保护功能复现规划见 `docs/算法/继电保护功能复现规划.md`。
## 5. L3 保护层与 protectTask
## 5. 保护判据层与 protectTask
模块: `App/algo/prot_set.*`、`App/algo/prot_elm.*`, 任务体 `App/task/protect_task.c`。
- `prot_set_init()`: 出厂默认定值封存校验和; `prot_elm_init()`: 复位元件状态并解析相量索引(必须在 `phasor_init()` 之后)。
- `protectTask`: **20 ms 判据节拍**, 运行 `prot_elm_run()`、L5-4 采样故障闭锁、L5-1 定值校验和巡检。
- `protectTask`: **20 ms 判据节拍**, 运行 `prot_elm_run()`、采样故障闭锁、定值校验和巡检。
- 跨上下文复归: 104 的 YK11 经 `prot_elm_request_reset()` 落请求, 不直接跨任务改状态。
- 纳入 IWDG `required_mask`(`TASK_WD_PROTECT`, 产品 `0x1F7`)。
- 保护定值落盘: `iec104Task` 检测到定值脏后置 `SYS_EVT_PROT_SET_SAVE`, 由 `defaultTask` 消费并写 `/prot_set.bin`。
+6 -6
@@ -74,9 +74,9 @@
├─ rs485_init()
├─ gd5f2gq5ue_init() // BBT 扫描, 启动段最耗时
├─ tpafe5160_init()
├─ adc_input_init() // L1: 语义映射 + ADC1 DMA
├─ phasor_init() / freq_init() // L2 / L2.5
├─ prot_set_init() / prot_elm_init()// L3
├─ adc_input_init() // 采集处理: 语义映射 + ADC1 DMA
├─ phasor_init() / freq_init() // 相量 / 测频
├─ prot_set_init() / prot_elm_init()// 保护判据
├─ SD2506 诊断(ID/时间/温度/电池)
└─ HAL_TIM_Base_Start_IT(TIM3) // 1 kHz 采样节拍
└─ osKernelInitialize()
@@ -107,13 +107,13 @@ STM32 ADC1(9 路, DMA) ─────┘
adcTask(纯消费者)
│ adc_input_poll()
▼
L1 采集层(adc_input / adc_health)
采集处理层(adc_input / adc_health)
│
▼
L2 相量层(sample_ring / phasor)→ L2.5 测频(freq)
相量层(sample_ring / phasor)→ 测频(freq)
│
▼
L3 保护层(prot_set / prot_elm)
保护判据层(prot_set / prot_elm)
│
▼
protectTask(20 ms)