docs(产品需求): 端口重排——屏板占 USART1,日志迁 RS-232 通道
用户裁定:现在的日志串口让给屏幕,RS-232 通道以后用来输出日志。 这条裁定把原来的头号阻塞直接消掉了:屏板改走 USART1(PA9/PA10), 是唯一一条 MCU 引脚直出 TTL、不经收发器的通道,所以 U15 = TP8485E-SR 只有 250 kbps 这件事对屏板链路不再构成约束,也不用改任何硬件。 顺带纠正一处算错的波特率分频: - 旧文写 42 000 000 / 700 000 = 60 -> USARTDIV = 60.0、BRR = 0x3C0, 漏了 16 倍过采样,照此写实际只有 43 750 baud。 - 正确:USART1(APB2 84 MHz)USARTDIV = 7.5 -> BRR = 0x0078; APB1 实例(42 MHz)USARTDIV = 3.75 -> BRR = 0x003C,误差均 0。 端口归属按 V0.1 网表 §4.2 的三对 UART 轮换核实: RS485#4 = UART4(DE = PA15)、RS232#1 = UART5、RS232#3 = USART2。 所以 rs485_init(&g_rs485, &huart4, ...) 是对的,不动;屏板链路规划 v1 里"网表自相矛盾"那条判断依据错了(拿 V0.0 摘要行对 V0.1 代码),已纠正。 产品需求文档: - 5.16.2 补端口裁定块与分频更正,重写"主机侧端口选型"为"端口重排"。 - DE 口径改为 TTL 直连无 DE;主机 RX 由"吃 4208 B"改为"只需 6 B"。 - 4.2 外设接口表补 USART2 / UART5 两行,USART1 行注明 PA10 未接线。 - 9.13 新增第 16 条"日志口迁移",批次表注明 16 必须排在 10 之前 (两者共用 USART1->DR);第 10 条改 BRR = 0x0078、无 DE。 - 12 变更记录加 v1.8。 屏板链路规划: - 0 章由"三个硬约束"改为"一条已解除 + 四条前置",执行顺序钉死为 接 PA10 -> 挪台架串口线 -> 迁日志口 -> 再写屏板链路。 - 决策一、二 标记已裁定;批 0 换成"腾位置"4 项;批 1 的 DE 项降为 条件项,新增"日志口迁移"的改动点与判据。 - 5 章台架步骤补第 0 步;6 章风险表换成迁移期的新风险;7 章加判据 0。 任务规划 README 的独立轨道行同步为"端口已裁定、剩三条物理前置"。
This commit is contained in:
+65
-31
@@ -7,7 +7,7 @@
|
||||
> 待实现项与路线图、验收判据。
|
||||
> **事实来源**:本文所有数值与结论均取自仓库内**受管事实源**(代码、`.ioc`、`.map`、网表分析报告与
|
||||
> 各模块设计文档),凡与其它文档冲突处,以本文标注的权威来源为准。
|
||||
> **版本**:v1.7 **日期**:2026-10-28 **状态**:现状基线(含已实现项 + 待实现项)
|
||||
> **版本**:v1.8 **日期**:2026-10-28 **状态**:现状基线(含已实现项 + 待实现项)
|
||||
> **阅读前提**:建议先读 [`docs/README.md`](../../docs/README.md)(文档索引)与
|
||||
> [`docs/架构设计/项目架构总览.md`](../../docs/架构设计/项目架构总览.md)(全景架构)。
|
||||
> **范围口径:1:1 复刻**——本产品是参考产品 **CLS100**(`Scatter_P_HV03.01_SV01.01`,OMAP-L138
|
||||
@@ -507,8 +507,10 @@ sequenceDiagram
|
||||
| **GD5F2GQ5UE NAND** | SPI1 | PE0 CS / PB3 SCK / PB4 MISO / PB5 MOSI / PB8 WP / PE1 HOLD | 256 MB SPI NAND(2 Gbit) |
|
||||
| **TPAFE5160 ADC** | 并行 16 位 | PG0~PG15 数据 / **PC6 FRSTDATA** / **PC7 BUSY**(EXTI) / **PC8 RD** / **PC9 CONVST** / **PA8 OS2** / **PA11 OS1** / **PA12 OS0** | 高精度多通道 ADC |
|
||||
| **SD2506 RTC** | I2C1 | PB6 SCL / PB7 SDA | 提供墙钟基准与日志时间戳 |
|
||||
| **USART1(调试串口)** | UART | PA9 TX / PA10 RX | 115200 8N1;printf 日志 + `@test` 采集通道 |
|
||||
| **UART4(RS-485)** | UART | PC10 TX / PC11 RX / **PA15 DE** | 半双工通信 |
|
||||
| **USART1(调试串口 / U5 直连 TTL)** | UART | PA9 TX / PA10 RX | 115200 8N1;现为 printf 日志 + `@test` 采集通道。**端口重排后改作屏板链路**(700 kbaud,§5.16.2)。⚠ PA10 目前**未接线**,作屏板链路前必须接上 |
|
||||
| **UART4(RS-485)** | UART | PC10 TX / PC11 RX / **PA15 DE** | 半双工通信(V0.1 轮换后 RS485#4 = UART4,`docs/硬件平台/V0.1_网表详细分析报告.md` §4.2) |
|
||||
| **USART2(RS-232 #3)** | UART | PD5 TX / PD6 RX | 经 U10 隔离 → U13 TPT3232E → CN1;**端口重排后为日志口** |
|
||||
| **UART5(RS-232 #1)** | UART | PC12 TX / PD2 RX | 经 U9 隔离 → U13 → CN1;备选日志口 |
|
||||
| **状态 LED ×6** | GPIO | PC5 / PB0 / PB1 / PB2 / PF11 / PF12 | **低电平点亮** |
|
||||
| SWD | — | PA13 SWDIO / PA14 SWCLK | V0.1 已修复 V0.0 的 SWCLK 引脚缺陷 |
|
||||
| 调试口 | — | CN2(XH-3A,1=SWDIO/2=SWCLK/3=GND) | V0.1 由 H2 排针改为 XH 端子 |
|
||||
@@ -1057,17 +1059,29 @@ sequenceDiagram
|
||||
| 发送 | `HAL_UART_Transmit(..., 1000)` 阻塞发完,随即切回接收 | `RS485_SendBuff()` |
|
||||
| 缓冲 | RX **4208 B**、TX **8 B** | `UART_RX_LEN` / `UART_TX_LEN` |
|
||||
|
||||
> **700 kbaud 在本产品主控上零误差**:APB1 = 42 MHz(`PLLM=4 / PLLN=168 / PLLP=2 / APB1÷4`,
|
||||
> 见 `Src/main.c` 时钟配置),`42 000 000 / 700 000 = 60` 整除 → `USARTDIV = 60.0`、`BRR = 0x3C0`,
|
||||
> 误差 **0 %**。若改时钟树或改用 HSI,必须重算——700 kbaud 下 2 % 误差已足以丢帧。
|
||||
> 收发器须选 **≥ 1 Mbps** 档(3485 / 自动方向类),700 kbaud 不是普通 485 的常规工况。
|
||||
> **700 kbaud 在两种候选时钟下都零误差**(2026-10-28 更正分频算法):16 倍过采样(`OVER8 = 0`)时
|
||||
> `USARTDIV = fCK / (16 × 波特率)`,写入值 `BRR = (整数部分 << 4) | (小数部分 × 16)`。
|
||||
> - 屏板链路的**默认端口 USART1 挂 APB2 = 84 MHz**:`84 000 000 / (16 × 700 000) = 7.5` →
|
||||
> 整数 7、小数 8 → **`BRR = 0x0078`**,误差 **0 %**。
|
||||
> - 若改用 APB1 上的实例(UART4 / USART2 / USART3,42 MHz):`42 000 000 / (16 × 700 000) = 3.75` →
|
||||
> 整数 3、小数 12 → **`BRR = 0x003C`**,误差 **0 %**。
|
||||
>
|
||||
> ⚠ **700 kbaud 在本板现有 485 通道上物理做不到**(2026-10-28 核查):唯一的板侧收发器
|
||||
> `U15 = TP8485E-SR` 速率上限 **250 kbps**(`docs/芯片手册/TP8485E-SR.md`),差 2.8 倍。
|
||||
> 而 4208 B 在 250 kbps 下需 **168.3 ms**,已占满屏板 200 ms 应答窗口的 84 %,无实用余量。
|
||||
> 出路只有两条:**换 ≥1 Mbps 收发器**,或**屏板降速并同步放大 `RS485_ACK_COUNT_MAX`**。
|
||||
> 这是本项**唯一的硬件阻塞点**,处置方案与代价见 `docs/任务规划/屏板链路.md` §2 决策一。
|
||||
> 软件侧不受影响——可先用 TTL 直连在台架跑通全链路,再等硬件定版。
|
||||
> ⚠ **旧版本本节写的"`42 000 000 / 700 000 = 60` → `USARTDIV = 60.0`、`BRR = 0x3C0`"是错的**——
|
||||
> 漏掉了公式里的 16 倍过采样。照 `0x3C0` 写下去实际波特率是 **43 750**,不是 700 000。
|
||||
> 若改时钟树或改用 HSI,必须重算——700 kbaud 下 2 % 误差已足以丢帧。
|
||||
>
|
||||
> **端口裁定(用户决定,2026-10-28):屏板走 USART1,日志口让位。**
|
||||
> 屏板链路改用 **USART1(PA9/PA10)**——这条通道是 **MCU 引脚直出 TTL,不经过板上任何收发器**,
|
||||
> 因此**收发器速率上限问题不复存在**:本板 485 通道上的 `U15 = TP8485E-SR` 只有 250 kbps
|
||||
> (`docs/芯片手册/TP8485E-SR.md`)这件事,对屏板链路**不再构成约束**。
|
||||
> 作为交换,**调试日志迁到 RS-232 通道**(V0.1 板上 RS232#3 = **USART2 PD5/PD6**,
|
||||
> 备选 RS232#1 = UART5 PC12/PD2,两者都经隔离器 → `U13` TPT3232E → CN1),
|
||||
> 迁移在屏板链路跑通之后做,见下方"主机侧端口重排"。
|
||||
>
|
||||
> ⚠ **USART1 的 RX(PA10)目前没有接线**:`App/log/console_log.c` 的文件头与自愈函数注释都记着
|
||||
> "PA10 未接线"——RX 悬空噪声锁存 ORE/NE/FE/PE,正是控制台历史上反复静默的根源。
|
||||
> 屏板链路是**双向**的(主机必须收 6 B 召唤帧),所以 **PA10 必须物理接上**,
|
||||
> 否则只能发不能收,链路做不成。这是**两条物理前置**之一,另一条是把台架串口线从 USART1 挪到 RS-232 侧(见 §9.13)。
|
||||
|
||||
**帧 A:召唤 / 按键(屏板 → 主机,固定 6 B)**
|
||||
|
||||
@@ -1122,25 +1136,36 @@ CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法 `auch
|
||||
但若主机把整帧拆成多次 `HAL_UART_Transmit` 且中间被高优先级任务抢占,很容易越线——
|
||||
**建议一次性 DMA 发送 + 发送完成中断,不要逐块阻塞发**。
|
||||
|
||||
**主机侧端口选型**
|
||||
**主机侧端口重排(2026-10-28 用户裁定)**
|
||||
|
||||
| 串口 | 引脚 | 当前用途 | 用于屏板 |
|
||||
| 串口 | 引脚 | V0.1 板上通道(`docs/硬件平台/V0.1_网表详细分析报告.md` §4.2) | 重排后用途 |
|
||||
|---|---|---|---|
|
||||
| USART1 | PA9 / PA10 | 调试日志 115200(单写者) | ❌ 占用 |
|
||||
| UART4 | PC10 / PC11 + **PA15(DE)** | RS-485 采集簇(**冻结**) | ⚠ 唯一自带硬件 DE 的实例,但与冻结簇争用 PC10/PC11 |
|
||||
| UART5 | PC12 / PD2 | 已初始化、未接 | ✅ 空闲,需另配 DE GPIO |
|
||||
| USART2 | PD5 / PD6 | 已初始化、未接 | ✅ 空闲,需另配 DE GPIO |
|
||||
| USART3 | PB10 / PB11 | 已初始化、未接 | ✅ 空闲,需另配 DE GPIO |
|
||||
| **USART1** | PA9 / PA10 | 调试口 + **U5 直连 TTL**(ST_TX0/RX0),**MCU 直出、不经任何收发器** | ✅ **屏板链路**(700 kbaud) |
|
||||
| **USART2** | PD5 / PD6 | **RS232#3**(U10 隔离 → U13 TPT3232E → CN1) | ✅ **调试日志**(115200,屏板链路之后迁移) |
|
||||
| UART5 | PC12 / PD2 | **RS232#1**(U9 隔离 → U13 → CN1) | 备选日志口,与 USART2 二选一 |
|
||||
| UART4 | PC10 / PC11,DE = **PA15** | **RS485#4**(U11 隔离 → U15 → A/B → CN1) | 冻结簇,本项不碰 |
|
||||
| USART3 | PB10 / PB11 | U5 直连 TTL(ST_TX2/RX2) | 空闲 |
|
||||
|
||||
**默认选型:USART3(PB10/PB11)+ 一个空闲 GPIO 作 DE**——不与调试口、不与 RS-485 采集簇争用,
|
||||
外设实例独立,且同挂 APB1(42 MHz,分频零误差)。
|
||||
**为什么是 USART1**:它是唯一一条**不经收发器、MCU 引脚直出**的通道,而 700 kbaud 恰好卡在收发器上
|
||||
(`U15 = TP8485E-SR` 只有 250 kbps,`docs/芯片手册/TP8485E-SR.md`)。换到这条线上,速率问题从根上消失,
|
||||
也不用改任何硬件。UART4 保持 RS-485 冻结簇不动——`rs485_init(&g_rs485, &huart4, …)` 与 V0.1 一致,**无需摘除**。
|
||||
|
||||
> ⚠ **DE 极性不可照抄屏板**。屏板的"低=发"是**它自己那套收发器**的接法;主机侧极性由本板收发器决定。
|
||||
> 若用高有效 DE 的器件,软件必须取反,或改用自动方向芯片(免 DE)。**这是最容易接反、且症状最像"协议不对"的一处。**
|
||||
**这次重排带来两件事,必须在任务里体现:**
|
||||
|
||||
> ⚠ 主机 RX 侧要能吃下 **4208 B 整帧**(缓冲 ≥ 4208 B + 空闲中断断帧)。
|
||||
> 且需处理**自发自收**:半双工总线上自己的 4208 B 会回灌 RX(若收发器带 echo 或 DE 时序不对),
|
||||
> 必须丢弃而非当作帧 A 解析。
|
||||
1. **日志口迁移不是一行改动**:`App/log/console_log.c` 里 `huart1` 出现 5 处(含
|
||||
`huart1.Instance == NULL` 的空指针短路判据),自愈函数 `con_uart_reinit()` 还直接写
|
||||
`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()`。建议收口成**一处可配置端口宏**,
|
||||
而不是逐处散改。
|
||||
2. **新日志口必须设成只发不收**(`UART_MODE_TX`):USART1 控制台之所以要背一整套僵尸通道自愈,
|
||||
根源就是"RX 悬空 + RX 使能 → ORE 锁存 → HAL 轮询 TX 恒快速失败"。日志口不需要收,
|
||||
就别再开 RX,否则等于把同一场病搬到新口上。
|
||||
|
||||
> ⚠ **TTL 直连没有 DE**:主机侧不再有半双工方向控制,DE 极性、建立时间、等 TC 收尾全部不适用。
|
||||
> 只有选"USART1 引脚 → 外部 485 模块 → 屏板 A/B"这种接法时才需要处理外部模块的 DE,
|
||||
> 此时**极性由那个模块决定,不可照抄屏板**(屏板的"低=发"是它自己那套收发器的接法)。
|
||||
|
||||
> ⚠ 主机 RX 只需吃下 **6 B 召唤帧**(不像屏板要吃 4208 B):16 B 缓冲 + 空闲中断断帧就够。
|
||||
> TTL 直连**没有自发自收**问题(TX/RX 是两根独立线);只有走外部 485 模块时才会回灌。
|
||||
|
||||
#### 5.16.3 屏板侧行为:状态灯 / 按键 / 背光 / LOGO
|
||||
|
||||
@@ -1409,7 +1434,7 @@ for (i = 1; i < LED_COUNT; i++) /* LE
|
||||
|
||||
- **角色反转**:屏板是 **Modbus 主站(主动召唤)**,主机是**从站 `0x01`**;与网络通道"客户端召唤"方向相反。
|
||||
- **帧长 4208 B**(有效载荷 3208 B + 998 B 填充 + 2 B CRC),不是 readme 写的 3208 B(§5.16.2)。
|
||||
- **700000 8N1**,软件 DE;主机侧 DE 极性由本板收发器决定,**不可照抄屏板**。
|
||||
- **700000 8N1**,主机侧走 **USART1 TTL 直连**(无 DE);若改走外部 485 模块,DE 极性由该模块决定,**不可照抄屏板**。
|
||||
- **屏板每 ≈5000 s 自复位一次**,约 1 s 空窗;主机链路监视须容忍(建议连续 ≥10 s 无应答才判离线)。
|
||||
- **屏板只有 7 个物理键**,键值 `9`/`10` 是"复位 / 工厂",与参考主机的 `F1` / `F1|ENT` **语义不同**。
|
||||
- **单色**:屏板是 1 bpp 单色面板,参考的 13 B 颜色信息(颜色位 + RGB 三色)**无接收方**,不对齐。
|
||||
@@ -1921,7 +1946,7 @@ pre-commit run --all-files
|
||||
| **SNTP 对时** | 17 | 参考对时走 SNTP | 私有 TCP 8888 + 104 `C_CS` | SNTP 客户端 |
|
||||
| **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 |
|
||||
| **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 |
|
||||
| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / 软件 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | 只有 7003 四命令(INIT **8 B**);**串口通道 0**;无状态灯下行;无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 串口通道整条(协议已定版)+ 7003 报文口径 6 项(明细见 §9.13) |
|
||||
| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | 只有 7003 四命令(INIT **8 B**);**串口通道 0**;无状态灯下行;无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 串口通道整条(协议已定版)+ 7003 报文口径 6 项(明细见 §9.13) |
|
||||
|
||||
> **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」
|
||||
> 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**,
|
||||
@@ -2528,12 +2553,13 @@ pre-commit run --all-files
|
||||
| 7 | **KEEPLIVE 静默** | 去掉空帧回显,改为仅重置计时 | §5.16.10 第 4 条通过 | **是** |
|
||||
| 8 | **发送重试评估** | 对比参考"BUSY + 200 ms 放弃"与现有 `net_send` 阻塞模型,出结论并回填 §5.16.9 第 7 行 | 结论有实测数据支撑(实现 / 明确不实现) | 否 |
|
||||
| 9 | **客户端一致性回归** | `DTU-RemoteLCD` 按 **16 B** 解析;把 §5.16.10 第 1~7 条做成自动化用例 | 七条判据全 PASS | **是** |
|
||||
| 10 | **串口物理层落地** | 按 §5.16.2 定版:**700000 8N1**、软件 DE(默认 **USART3 PB10/PB11** + 一个空闲 GPIO 作 DE)、RX 缓冲 ≥4208 B + 空闲中断断帧、发送走 **DMA 一次性发完**(禁逐块阻塞) | 环回 + 示波器实测 700 kbaud 分频零误差;屏板能收到帧 A 并回帧 B | 否 |
|
||||
| 10 | **串口物理层落地** | 按 §5.16.2 定版:**700000 8N1、`BRR = 0x0078`**(USART1,APB2 84 MHz)、**无 DE**(TTL 直连,不走收发器)、RX 缓冲 16 B + 空闲中断断帧、发送走 **DMA 一次性发完**(禁逐块阻塞,`DMA2_Stream7` TX / `DMA2_Stream2` RX 已在 `.ioc` 配好但控制台未用) | 环回 + 示波器实测 700 kbaud 分频零误差;屏板能收到帧 A 并回帧 B | 否 |
|
||||
| 11 | **帧 A 解析 / 帧 B 组帧** | 新增屏板通道模块:识别 6 B 请求(`01 03 type key CRC_H CRC_L`)、校验 CRC-16/MODBUS(**高字节在前**);组 **4208 B** 帧 B(3200 显存 + 4 B LED + 4 B info 保留 + 998 B 填充 + 2 B CRC) | 屏板出图与 `g_ui_fbuf` 逐字节一致;`info[0..3]` 与下发的 LED 掩码一致 | 否 |
|
||||
| 12 | **状态灯位映射表** | 定义"**业务状态 → 屏板 LED 位**"映射(参考源码**无此表**,须自定);`info[0..3]` 按 **32 位小端**填,bit0 恒 0、bit20~31 恒 0 | §5.16.10 第 11 条通过 | 否 |
|
||||
| 13 | **串口上行按键** | 帧 A 的 `key` 字节按**屏板 `KEY_TYPE`** 解释——实际可达值只有 **`1/2/3/4/7/8/9`**(`5`/`6`/`10` 无物理入口);映射为逻辑键值后与 7003 注入**同一入口**合并 | §5.16.10 第 10 条通过;`9`/`10` 语义按 §5.16.3 ② 处置 | 否 |
|
||||
| 14 | **双通道并发 + 自复位容忍** | 两出口各自独立发送上下文;串口 4208 B 阻塞不拖 7003;链路监视按"**连续 ≥10 s 无应答**"判离线,**忽略屏板 ≈5000 s 周期自复位** | §5.16.10 第 12、13、14 条通过 | 否 |
|
||||
| 15 | **LOGO 下发流程** | 一次性下发 LOGO 帧(`info[4..5] = 0x89 0x45`,宽高大端);放在出厂 / 联调流程,**不进常规刷新循环** | §5.16.10 第 15 条通过;断电重启后 LOGO 仍在 | 否 |
|
||||
| 16 | **日志口迁移(USART1 → RS-232 通道)** | ① `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 RS232#3(`huart2` / USART2,默认)或 RS232#1(`huart5` / UART5);② 该实例改 **`UART_MODE_TX`**(只发不收,避免重演 ORE 锁存);③ **不动** UART4 的 `g_rs485` 绑定 | 日志在 RS-232 侧(CN1)可读且内容与迁移前一致;USART1 **完全空出**;连续 10 分钟无 ORE 锁存、无 `[ERR]` | 否 |
|
||||
|
||||
**批次划分**:
|
||||
|
||||
@@ -2541,7 +2567,7 @@ pre-commit run --all-files
|
||||
|---|---|---|
|
||||
| 第一批(无跨端风险,可独立发版) | 3、6、8 | 只动本端,旧客户端不受影响 |
|
||||
| 第二批(跨端,须与客户端同步发版) | 2、4、5、7、9 | 报文口径变更,两端必须同版本 |
|
||||
| 第三批(**独立立项**,不随 RS-485 冻结) | 10、11、12、13、14、15 | 屏板串口通道是**独立需求**,与 §5.10 冻结的"对下采集簇"不是一回事;物理层已按屏板源码定版(**700000 8N1 / 软件 DE**),默认走 USART3 另配 DE GPIO,**不必解冻 UART4** |
|
||||
| 第三批(**独立立项**,不随 RS-485 冻结) | **16**、10、11、12、13、14、15 | 屏板串口通道是**独立需求**,与 §5.10 冻结的"对下采集簇"不是一回事。**第 16 条必须排在 10 之前**:日志不腾出 USART1,屏板链路就没法独占这条通道(两者共用同一个 `USART1->DR`,同时用就是互相插字节) |
|
||||
|
||||
> ⚠ **唯一破坏性变更**:第 2 条把 INIT 应答从 8 B 改成 **16 B**。**旧客户端会把 16 B 的前 8 B 当全部、
|
||||
> 把后 8 B 当作下一帧的 TAG 去找**,解析状态机会被这 8 B 拖住直到超时——表现为"连上了但不出图"。
|
||||
@@ -2559,6 +2585,13 @@ pre-commit run --all-files
|
||||
> 第 11 条的帧长仍有一处待实测复核——代码实参是 **4208 B**,屏板 readme 写 **3208 B**(§5.16.2);
|
||||
> 台架抓到第一帧真实报文后**立即固化**,在此之前以代码实参为准,不得按 readme 实现。
|
||||
>
|
||||
> **两条物理前置(软件做不了,须先落硬件)**:
|
||||
> ① **PA10 接线**——USART1 的 RX 现在是悬空的(`App/log/console_log.c` 文件头有明确记载),
|
||||
> 屏板链路要收 6 B 召唤帧就必须把它接上;顺带这一接也消掉了控制台 ORE 锁存的老病根。
|
||||
> ② **台架串口线挪位**——现在的 CH340/`COM6` 接在 USART1 调试口上,日志迁到 RS-232 侧后
|
||||
> 必须改接到 CN1(或 U14 RJ45),否则 `@test` 与 `serial-assistant` 全部抓不到日志,
|
||||
> 等于把台架弄瞎。**这条要在第 16 条动代码之前完成。**
|
||||
>
|
||||
> **已消解的旧阻塞**:原"屏板协议拿不到、不得按猜测定契约"的告警**不再适用**——物理层、帧格式、
|
||||
> 键值、状态灯、时序均已从 `DTU-LCD` 源码确定。剩下的只是"实物联调确认",不是"协议未知"。
|
||||
|
||||
@@ -2681,3 +2714,4 @@ pre-commit run --all-files
|
||||
| 2026-10-28 | **v1.5 补串口屏板通道(显示信息不只走网络)** | ① **口径再更正**:v1.4 把串口通道写成"链路 A,随 RS-485 簇冻结",等于把它降级成可选——**错**。参考的架构是**一份显存、两个出口**:**串口屏板通道是主通道**(`LCD_LED_Update(显存 3200 B, LED 4 B)` 变化驱动 + `WriteScreenByByte` 500 ms 兜底),**TCP 7003 是镜像**;上行同理(`getRs485Key()` 物理键号 1~10 为主,`g_tRemoteKey` 为镜像,两者在 `Key_Read()` 汇合且**本地优先**)。§5.16 标题改为「**屏板链路:串口主通道 + 网络镜像**」并重写开篇;② **§5.16.1 重写为「一份显存、两个出口」**:显存物理基址 `CN_VIDEO_ADDRESS_BASE = 0xC1F00000`(非 cache 区)、三条下行路径与两条上行路径的归属任务 / 调用 / 载荷 / 节拍对照表;③ 新增 **§5.16.2「本产品的串口通道(待建)」**:V0.1 串口资源盘点(USART1 调试占用 / UART4 被冻结 RS-485 占用 / **UART5、USART2、USART3 空闲**),默认选 **USART3(PB10/PB11)**,若屏板为 RS-485 半双工则改 UART4 并先解冻该簇;④ 新增 **§5.16.3「参考实现的屏板侧接口一览」**,并**明确列出交付源码推不出的四项**(波特率与数据格式 / 帧头与校验 / 半双工方向控制 / 3200 B 是否分片与应答)——在拿到实测前不得声称"按参考协议实现";⑤ **§5.16.9 差异表由 10 行扩到 14 行**,新增「串口屏板通道整条缺失」「双出口并发缺失」「面板指示灯语义不同」「背光对比度」四项,并注明第 11/12 条是**整条链路缺失**而非报文细节;⑥ **§5.16.10 判据由 7 条扩到 12 条**,新增串口侧 5 条(键号注入 / 500 ms 内出帧 / 双通道并发不丢帧不串帧 / 拔插恢复 / 背光);⑦ **§9.13 任务由 10 条扩到 13 条**:原「RS-485 屏板通道」一条拆为「串口通道物理层定版 / 串口下行显存 / 串口上行按键 / 双通道并发回归」四条,批次表第三批改为**独立立项、不随 §5.10 冻结**,并补前置阻塞(需屏板实物验收;拿不到固件或抓包时不得把猜测定成契约);⑧ §5.16.8 `tTimerLCD` 行由"此路不实现"改为"串口通道周期兜底节拍(待建)",§2.5.2 第 20 项、§9.1.2、§9.12、§10.3 同步。**本次只改本文件** |
|
||||
| 2026-10-28 | **v1.6 屏板源码到手:串口通道协议定版 + 状态灯下行** | ① **屏板固件已获得**(`D:\Code\DTU Code\DTU-LCD`,STM32F103ZE + UC1698U 160×160 单色 + **20 路状态指示灯** + 7 个物理按键),v1.5 列的"四项未知"**全部消解**;② **§5.16.2 重写为「串口通道:物理层与帧格式(屏板源码实测)」**:**700000 8N1**(APB1 42 MHz 分频零误差、`BRR = 0x3C0`)、软件 DE、**角色反转(屏板是 Modbus 主站、主机是从站 `0x01`)**、帧 A 6 B 召唤(`01 03 type key CRC_H CRC_L`,`KEY_CMD=0` / `RT_CMD=1`,CRC-16/MODBUS 只覆盖前 4 B、**高字节在前**)、帧 B **4208 B** 图像应答(3200 显存 + 4 B 状态灯 + 4 B info + 998 B 填充 + 2 B CRC,覆盖 `[0, 4205]`)、时序 275 ms / 200 ms / 5 次超时、200 ms 预算下 4208 B 约 60.1 ms(占 30 %)、主机端口默认 **USART3 + 另配 DE GPIO**(**不必解冻 UART4**);③ **§5.16.3 重写为「屏板侧行为:状态灯 / 按键 / 背光 / LOGO」**,新增**状态灯下行**:`info[0..3]` 为 **32 位小端位掩码**、**ID 0 = 电源灯硬件常亮、ID 1~19 对应 bit1~19**,给出 20 路 LED 引脚表,并指出"**位 → 业务状态映射表参考源码没有、须由本产品自定**";键值 `KEY_TYPE` 表(`0` 无键 / `1` ENTER / `2` UP / `3` DOWN / `4` ESC / `5` ADD / `6` DEC / `7` LEFT / `8` RIGHT / `9` RESET / `10` FACTORY),并**指出与参考主机 `getRs485Key()` 的 `9` / `10` 语义冲突**(参考是 `F1` 与 `F1+ENT`)、`key_configs[]` 仅 7 项且无 ADD/DEC 入口;背光自管、LOGO(Flash `0x0803F000`、魔数 `0x89 0x45`)、屏板健壮性(CRC 错 ≥3 仅清计数**不自愈**、**≈5000 s 自复位**、DMA 接收问题未解决);④ **§5.16.9 差异表**第 8 / 11 / 12 / 13 / 14 行按屏板实测重写,并新增"来自屏板固件的新增约束"5 条;⑤ **§5.16.10 判据由 12 条扩到 15 条**(275 ms 召唤 / ≤200 ms 回 4208 B、显存逐字节、7 键、**状态灯逐位**、双通道并发、**自复位容忍**、拔插恢复、**LOGO 下发**);⑥ **§9.13 任务由 13 条改为 15 条**:第 10 条由"物理层定版"改为"**串口物理层落地**"(参数已定)、新增第 12 条"**状态灯位映射表**"与第 15 条"**LOGO 下发流程**"、第 14 条并入"自复位容忍",批次表第三批改 10~15 并注明**不必解冻 UART4**,删除"拿不到固件不得定契约"告警(已消解),保留"**4208 vs 3208 待台架复核**";⑦ **§5.8 补屏板 20 路指示灯与主板 6 路 LED 是两套独立输出**;§5.6 FR-UI-1 改为"**双出口推流**";§6.2 口径注改为"串口通道是 Modbus RTU 风格裸帧、**不能共用组帧代码**";§2.4.1 X3、§2.5.2 第 20 项、§5.16.1、§5.16.8 `tTimerLCD` 行、§9.1.2、§9.12、§10.3 第 13 项同步。**本次只改本文件** |
|
||||
| 2026-10-28 | **v1.7 单色口径:删除多色协议,INIT 由 29 B 改 16 B** | 用户裁定"屏幕板都是单色的,多色协议可以删除、不必对齐"。**核查后确认这不是让步,而是删死字段**:① **三处源码证据**——`RemoDispBus.h:46` `CN_RDISP_TYPE_MONO = TRUE` → `CN_RDISP_LCD_TYPE = CN_MODE_GREY_MONO`、`CN_RDISP_MEMSIZE = (X>>3)*Y`(链路显存本就是 1 bpp);`RDisp_Form_InitInf` 里 `CN_RGB_RED/GREEN/BLUE` 是**编译期常量**而非逐帧数据;`RDisp_LcdColor_To_Mono()` 对 `CN_MODE_GREY_MONO` **直接 `return TRUE` 不转换**,真正干活的 `RDisp_Lcd16B_To_Mono()`(RGB565→单色)挂在 `CN_MODE_COLOR_16B` 下**本构建永不进入**(死代码);② **§5.16.5 INIT 应答表由 29 B 重写为 16 B**(宽 2 + 高 2 + 显存 4 + 8 键值表),删掉 1 B 颜色位 + 12 B RGB,并补"为什么是 16 B"的证据块;③ **§6.2 命令集 INIT 行**同步改 16 B 并加"单色口径"注(颜色位与 RGB 整段删除、`RDisp_LcdColor_To_Mono()` 不存在);④ **§5.16.6 第 6 条注**改为"该函数在参考单色构建下就是空转",避免误以为本产品漏了一步转换;⑤ **§5.16.9 第 1 行**由"补 21 B"改为"**补 8 B 键值表 → 16 B**,颜色 13 B 不对齐";"新增约束"补"单色"一条;末尾警示改为 **16 B vs 29 B 不可互换**(从偏移 4 起含义即不同,客户端不得复用参考 29 B 解析器截前 16 B);⑥ **§5.16.10 判据第 1 条**改 16 B 且"不得出现颜色位或 RGB";⑦ **§9.13 第 2 条**改"INIT 应答补足 **16** 字节 / 不加颜色位与 RGB"、第 9 条客户端按 16 B 解析、破坏性变更警示改 16 B(后 8 B 而非后 21 B)并补"不可与参考 29 B 互换";⑧ **§2.4.1 补"多色显示不在本表内"**——参考与本产品都是单色链路,删的是死字段,**不属于"决定不做"的能力**;§2.5.2 第 20 项、§9.1.2、§9.12、§10.3 第 13 项同步;⑨ **§8.1 色深行**补"无灰度、无彩色,7003 INIT 颜色字段已删",渲染行改为"串口屏板通道(主)+ TCP 7003(镜像)双出口"。**本次只改本文件** |
|
||||
| 2026-10-28 | **v1.8 端口重排:屏板占 USART1,日志迁 RS-232 通道** | 用户裁定"把现在的日志 UART 让给屏幕,RS-232 通道后面用来输出日志"。**这条裁定把 v1.6/v1.7 的头号阻塞直接消掉了**:① **§5.16.2 新增「端口裁定」块**——屏板改走 **USART1(PA9/PA10,MCU 直出 TTL、不经任何收发器)**,因此 `U15 = TP8485E-SR` 只有 250 kbps 这件事**对屏板链路不再构成约束**;日志迁 **RS-232 通道**(V0.1 板上 RS232#3 = USART2 PD5/PD6 为默认,RS232#1 = UART5 PC12/PD2 为备选,两者都经隔离器 → U13 TPT3232E → CN1);② **纠正分频算法**——旧文写"`42 000 000 / 700 000 = 60` → `USARTDIV = 60.0`、`BRR = 0x3C0`"**漏了 16 倍过采样**,照此写实际波特率只有 43 750;正确值:USART1(APB2 84 MHz)`USARTDIV = 7.5` → **`BRR = 0x0078`**,APB1 实例(42 MHz)`USARTDIV = 3.75` → **`BRR = 0x003C`**,两者误差均为 0;③ **§5.16.2「主机侧端口选型」整表重写为「主机侧端口重排」**,按 `docs/硬件平台/V0.1_网表详细分析报告.md` §4.2 的三对 UART 轮换列明 RS485#4 = UART4(DE = PA15)、RS232#1 = UART5、RS232#3 = USART2,并补两条实现约束(`console_log.c` 里 `huart1` 5 处 + 自愈函数直写 `USART1_IRQn` / `MX_USART1_UART_Init()` 需收口成一处端口宏;新日志口必须 `UART_MODE_TX`,否则重演 ORE 锁存);④ **DE 口径改为「TTL 直连无 DE」**,仅"经外部 485 模块接 A/B"时才需处理,且极性由该模块决定;⑤ **主机 RX 口径**由"吃下 4208 B"改为"只需 6 B(16 B 缓冲够)",并说明 TTL 直连无自发自收;⑥ **§4.2 外设接口表**:USART1 行补"端口重排后改作屏板链路 + PA10 目前未接线",新增 USART2(RS-232 #3,日志口)与 UART5(RS-232 #1,备选)两行,UART4 行注明 V0.1 轮换依据;⑦ **§5.16.9「新增约束」**与 **§9.12** 的 700000 行同步为"USART1 TTL 直连、无 DE";⑧ **§9.13 新增第 16 条「日志口迁移」**并置于第三批首位,批次表注明 **16 必须排在 10 之前**(两者共用 `USART1->DR`);第 10 条改为 `BRR = 0x0078`、无 DE、`DMA2_Stream7/2` 现成;**前置阻塞**补两条物理前置(PA10 接线、台架串口线从 USART1 挪到 CN1)。**本次只改本文件** |
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@ docs/测试说明/模拟器差距清单.md §2.3「开机账本 boot_stats」一
|
||||
| **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 |
|
||||
| **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 |
|
||||
| **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、故障录波、SNTP 单独立项;RS-485 与内存优化按各自重启条件 |
|
||||
| **独立** | **屏板链路(对上屏板)** | **规划已出(未开工)** | 独立立项,插在任一顺位之间都能做,不占主序列;**先决条件是硬件决策**——本板现有 485 收发器只到 250 kbps,而屏板固件写死 700 kbaud(见 docs/任务规划/屏板链路.md §2 决策一);**软件可先用 TTL 台架验证,不必等硬件** |
|
||||
| **独立** | **屏板链路(对上屏板)** | **规划已出(未开工)** | 独立立项,插在任一顺位之间都能做,不占主序列;**端口已裁定(2026-10-28):屏板占 USART1,日志迁 RS-232 通道**,所以原来的 250 kbps 收发器阻塞已解除;剩下的是三条物理前置——**接 PA10、台架串口线挪到 CN1、日志口迁移**(见 docs/任务规划/屏板链路.md §0 与 §3 批 0);**软件可先用 PC + USB 转 TTL 台架验证,不必等屏板实物** |
|
||||
|
||||
### 2.1 关键依赖
|
||||
|
||||
|
||||
+96
-68
@@ -4,27 +4,34 @@
|
||||
> **需求侧**(这条链路要求做什么、与参考的差异)在 `docs/产品需求/产品需求设计文档.md` §5.16 与 §9.13,本文不重复。
|
||||
> **协议事实源**在屏板固件工程 `D:\Code\DTU Code\DTU-LCD`(不在本仓库)。
|
||||
>
|
||||
> **边界**:只做**主机侧**。屏板固件不改(除非走「决策二·方案 B」要求它降速,那是屏板侧的事)。
|
||||
> **边界**:只做**主机侧**。屏板固件不改——屏板已经把 `BAUDRATE` 编译成 700000 且跑得动,我们迁就它即可。
|
||||
> 屏板实物是验收前置条件——没有实物,本文只能做到"帧发出去了"。
|
||||
|
||||
---
|
||||
|
||||
## 0. 先看结论:三个必须先解决的硬约束
|
||||
## 0. 先看结论:一条硬约束已解除,四条前置顶上来
|
||||
|
||||
在写任何代码之前,这三条决定了这件事**能不能按 700 kbaud 做成**:
|
||||
**2026-10-28 用户裁定:屏板走 USART1,日志口让位给 RS-232 通道。** 这条裁定把原来的头号阻塞直接消掉了,
|
||||
代价是换成几条**物理**前置——都不是软件能解决的,但都比换收发器便宜。
|
||||
|
||||
| # | 硬约束 | 实测值 | 后果 |
|
||||
| # | 项 | 实测 / 出处 | 后果 |
|
||||
|---|---|---|---|
|
||||
| 1 | **本板现有 485 收发器只到 250 kbps** | `U15 = TP8485E-SR`,手册 "300 bps to 250 kbps"(`docs/芯片手册/TP8485E-SR.md`) | **700 kbaud 在这条通道上物理不可能**,差 2.8 倍 |
|
||||
| 2 | **屏板 200 ms 应答窗口 + 4208 B 帧 ⇒ 波特率下限** | 4208 B × 10 bit = 42 080 bit;700 kbaud = **60.1 ms**;250 kbps = **168.3 ms** | 250 kbps 虽勉强塞进 200 ms,但只剩 16 % 余量、且是收发器极限值 → **不可用**。留 50 % 余量需 **≥ 500 kbaud** |
|
||||
| 3 | **现有 RS-485 驱动装不下长帧** | `RS485_RX_BUF_SIZE = 256`、`RS485_TX_MAX_LEN = 256`(`Drivers/BSP/RS485/rs485.h`) | 4208 B 会被 `rs485_transmit()` 直接判 `BSP_ERR_PARAM` 拒发 |
|
||||
| 1 | ~~485 收发器只到 250 kbps~~ **已解除** | 屏板改走 **USART1 TTL 直连**,不经任何板上收发器 | 700 kbaud 不再受 `U15 = TP8485E-SR`(250 kbps)限制;`BRR = 0x0078`(APB2 84 MHz,误差 0 %) |
|
||||
| 2 | **PA10 未接线** | `App/log/console_log.c` 文件头与 `con_uart_reinit()` 注释均记"PA10 未接线" | 屏板链路要收 6 B 召唤帧 → **PA10 必须物理接上**,否则只能发不能收 |
|
||||
| 3 | **日志口占着 USART1** | `console_log.c` 里 `huart1` 5 处;自愈函数直写 `USART1_IRQn` / `MX_USART1_UART_Init()` | 两者共用同一个 `USART1->DR`,同时用就是互相插字节 → **日志必须先迁到 RS-232 通道** |
|
||||
| 4 | **台架串口线接在 USART1 上** | CH340 → `COM6`,`@test` / `serial-assistant` 都靠它抓日志 | 日志一迁,台架立刻瞎 → **先把线挪到 RS-232 侧(CN1)再动代码** |
|
||||
|
||||
**结论**:第 1 条是**唯一可能让整件事搁浅的点**,必须先定(见 §2 决策一)。
|
||||
第 2 条是它派生的算术,第 3 条纯软件,改起来不难。
|
||||
**执行顺序因此是**:接 PA10 → 挪台架线 → 迁日志口 → 才开始写屏板链路。
|
||||
前两步是拧螺丝,第三步约 20 行代码(§3 批 0),第四步才是原来规划的那些批次。
|
||||
|
||||
好消息是:**主机侧 RX 只需要 6 B**(屏板发的是 6 字节召唤帧),4208 B 只出现在**发送方向**,
|
||||
所以内存和缓冲压力比想象中小得多(§1.3)。
|
||||
|
||||
> 顺带纠正一条旧结论(本文 v1 写错了):`docs/硬件平台/V0.1_网表详细分析报告.md` §4.2 做过一次
|
||||
> "三对 UART 轮换"——**V0.1 的 RS485#4 = UART4(PC10/PC11,DE = PA15)**,RS232#1 = UART5、RS232#3 = USART2。
|
||||
> 所以 `rs485_init(&g_rs485, &huart4, …)` 与 V0.1 **一致,不用动**;V0.0 报告里的"RS485 = UART5"是旧板。
|
||||
> 之前把它当成"网表自相矛盾"是拿 V0.0 摘要行对 V0.1 代码,判断依据错了,结论也就错了。
|
||||
|
||||
---
|
||||
|
||||
## 1. 现状盘点
|
||||
@@ -37,13 +44,13 @@
|
||||
| 注入按键 | 同上,`ui_net_sink_inject_key(uint8_t)` | **直接复用**,串口与 7003 走同一入口,无需改 `ui_net_sink.c` |
|
||||
| 1bpp 显存 | `g_ui_fbuf`(`ui_port.c`),`UI_FB_SIZE = 3200` | 160×160÷8,与屏板 `Picture[3200]` 逐字节同构 |
|
||||
| 半双工 DE 时序经验 | `Drivers/BSP/RS485/rs485.c`(拉 DE → 等建立 → 发 → 等 TC → 收 DE) | **照思路,不照代码**(长帧限制见 §1.2) |
|
||||
| UART 外设已初始化 | `Src/usart.c`:USART1/2/3、UART4/5 全部 `MX_*_Init()` 已调用(`Src/main.c:130-137`) | 端口是现成的,只需改波特率与补 DE GPIO |
|
||||
| UART 外设已初始化 | `Src/usart.c`:USART1/2/3、UART4/5 全部 `MX_*_Init()` 已调用(`Src/main.c:130-137`) | 端口是现成的,只需改波特率(USART1 侧**不需要 DE**) |
|
||||
| 静态任务分配 | `Inc/FreeRTOSConfig.h` `configSUPPORT_STATIC_ALLOCATION = 1` | 可用 `xTaskCreateStatic`,**不占 RTOS 堆**(堆已满,见 §1.3) |
|
||||
|
||||
### 1.2 缺什么(要新建)
|
||||
|
||||
1. **协议层**:CRC-16/MODBUS(仓内没有现成的,`App`/`Drivers` 里搜不到)、帧 A 解析、帧 B 组帧。
|
||||
2. **传输层**:700 kbaud 配置、DE 控制、6 B 收 + 4208 B 发的时序。
|
||||
2. **传输层**:USART1 的 700 kbaud 配置、6 B 收 + 4208 B 发的时序(**无 DE**——TTL 直连没有方向控制)。
|
||||
3. **状态灯映射表**:19 路业务状态 → 屏板 LED 位的表,**参考源码里没有,必须自己定义**(`docs/产品需求/产品需求设计文档.md` §5.16.3 ①)。
|
||||
4. **一个宿主**:谁来跑这个链路(决策三)。
|
||||
|
||||
@@ -59,51 +66,53 @@
|
||||
**DMA 不是必须的**。4208 B 在 700 kbaud 下只占 60 ms,放在**独立任务里阻塞发送**完全可行
|
||||
(屏板 275 ms 才问一次,200 ms 内答完即可)。省掉 DMA 就省掉了一堆流冲突:
|
||||
|
||||
> ⚠ 若要上 DMA:USART3_TX 只能用 `DMA1_Stream3`(ch4) 或 `DMA1_Stream4`(ch7),
|
||||
> 而这两条**已被 SPI2 占用**(`Src/spi.c:198/216`)。USART2 的 `DMA1_Stream5/6` 才是空的。
|
||||
> 这是**选端口时必须一起考虑**的一条(见决策二)。
|
||||
> **USART1 的 DMA 是现成的**:`.ioc` 里已配 `DMA2_Stream7`(TX,NORMAL)/ `DMA2_Stream2`(RX,CIRCULAR),
|
||||
> 控制台从没用过(它直接轮询 `USART1->DR`),所以这两条**空着**,要用直接开,不必重新分配流。
|
||||
> 反过来,若哪天想把链路挪到 USART3,`DMA1_Stream3/4` 已被 SPI2 占用(`Src/spi.c:198/216`),
|
||||
> 得先解决冲突——这是"选 USART1"的附带好处之一。
|
||||
|
||||
---
|
||||
|
||||
## 2. 四个必须先定的决策
|
||||
## 2. 四个决策(一、二已由用户裁定,三、四待定)
|
||||
|
||||
### 决策一:波特率与收发器(**阻塞项,最优先**)
|
||||
### 决策一:波特率与物理介质(**已裁定 2026-10-28**)
|
||||
|
||||
屏板固件把 `BAUDRATE` 编译成 **700000**(`DTU-LCD/Drivers/BSP/RS485/rs485.h`),改不了我们这边。
|
||||
而我们板上唯一的 485 收发器 `TP8485E-SR` 上限 **250 kbps**。三条出路:
|
||||
用户裁定:**屏板挂 USART1(PA9/PA10),日志迁 RS-232 通道。** 原来那个"250 kbps 收发器"的死结因此消失:
|
||||
|
||||
| 方案 | 做法 | 代价 | 可行性 |
|
||||
| 项 | 结论 |
|
||||
|---|---|
|
||||
| 端口 | **USART1**——唯一一条 MCU 引脚直出 TTL、不经收发器的通道,同时引到 U5 子板连接器 |
|
||||
| 波特率 | 700000 8N1,`BRR = 0x0078`(APB2 84 MHz → `84 000 000 / (16 × 700 000) = 7.5`,误差 0 %) |
|
||||
| DE | **不需要**——TTL 直连是两根独立线,没有半双工方向控制 |
|
||||
| 剩余子决策 | **USART1 那端接什么**:① 直连屏板 UART2 的 TTL 侧(PA2/PA3,绕过屏板自己的收发器);② 经一个 ≥1 Mbps 的外部 485 模块接屏板 A/B。**台架先按 ① 做**,产品形态再定 |
|
||||
|
||||
> ⚠ 选 ② 时 DE 由外部模块决定,**不可照抄屏板的"低 = 发送"**——那是屏板自己那套收发器的接法。
|
||||
> 而且模块的速率上限要单独核,别又买回一个 250 kbps 的。
|
||||
|
||||
> 原方案 A(换 `U15`)/ B(屏板降速)**不再需要**:屏板不走板上 485 通道,`TP8485E-SR` 与本项无关。
|
||||
> 若将来又要回到 485 通道,那两条路的代价表还在本文 v1 的历史里,届时重新评估。
|
||||
|
||||
### 决策二:用哪个 UART(**已裁定 2026-10-28**)
|
||||
|
||||
| 端口 | 引脚 | V0.1 板上通道 | 重排后用途 |
|
||||
|---|---|---|---|
|
||||
| **A. 换收发器** | 把 `U15` 换成 ≥1 Mbps 的 485 器件(THVD1450 / MAX3485E / SP3485 类,3.3 V、SOIC-8 同封装优先) | 改板或飞线;隔离侧电源域不变 | ✅ **推荐**。唯一代价是硬件 |
|
||||
| **B. 屏板降速** | 屏板把 `BAUDRATE` 改到 250 kbps 以下,**同时**把 `RS485_ACK_COUNT_MAX`(200 ms)放大 | 改屏板固件 + 两个参数要配套算;250 kbps 下 4208 B 已占 168 ms | ⚠ 勉强可行,余量极小;≤115200 则 365 ms **必然超时** |
|
||||
| **C. TTL 直连** | 绕开两侧收发器,主机 UART ↔ 屏板 UART2 的 TTL 侧(PA2/PA3)直连 | 只能同机箱短距;屏板要引出 TTL 焊盘 | ⚠ 台架验证可以,**不能当产品形态** |
|
||||
| **USART1** | PA9 / PA10 | 调试口 + U5 直连 TTL(ST_TX0/RX0) | ✅ **屏板链路** |
|
||||
| **USART2** | PD5 / PD6 | **RS232#3**(U10 隔离 → U13 TPT3232E → CN1) | ✅ **日志**(默认) |
|
||||
| UART5 | PC12 / PD2 | **RS232#1**(U9 隔离 → U13 → CN1) | 备选日志口 |
|
||||
| UART4 | PC10 / PC11,DE = **PA15** | **RS485#4**(U11 → U15 → A/B → CN1) | 冻结簇,**不碰** |
|
||||
| USART3 | PB10 / PB11 | U5 直连 TTL(ST_TX2/RX2) | 空闲 |
|
||||
|
||||
**决策要点**:
|
||||
1. 先确认**屏板自己的收发器型号与速率上限**——屏板硬件资料不在 `DTU-LCD` 仓库里(只有固件)。
|
||||
如果屏板侧也是 250 kbps 器件,那 700 kbaud 是**两边都做不到**,方案 B 才是唯一路。
|
||||
2. 方案 A 换器件时,**DE 极性与建立时间**要重新核(新器件的 tPZH/tPZL 可能比 562 ns 大)。
|
||||
3. **台架可以先用方案 C 跑通协议**(不动硬件、不依赖收发器),把软件全部做完,
|
||||
再回头等硬件决策——**这是让软件不空等的关键**,建议按这个顺序排。
|
||||
**日志口选 USART2 还是 UART5**:两者都经隔离器 → `U13` TPT3232E → CN1,能力等价;
|
||||
控制台是**只发不收、寄存器轮询**,DMA 也用不上,所以挑哪个只取决于**现场把 CH340 接到哪个端子**。
|
||||
默认写 **USART2(RS232#3)**;若实际接的是 RS232#1,就换成 `huart5`——**迁移时收口成一处宏,别散改**。
|
||||
|
||||
### 决策二:用哪个 UART
|
||||
> ⚠ **UART4 不要动**:`rs485_init(&g_rs485, &huart4, …)` 与 V0.1 网表一致(V0.1 把 RS485#4 轮换到了 UART4),
|
||||
> 摘它等于动冻结簇的验收基线。本文 v1 曾把这里判成"网表自相矛盾",是拿 V0.0 摘要行对 V0.1 代码,
|
||||
> 判断依据错了——见 §0 末尾那条纠正。
|
||||
|
||||
| 端口 | 引脚 | 现状 | DMA 可用性 | 评价 |
|
||||
|---|---|---|---|---|
|
||||
| **USART2** | PD5 / PD6 | 已初始化、未接 | `DMA1_Stream5/6` **空闲** | ✅ **软件最优**:DMA 有退路,引脚独立 |
|
||||
| **USART3** | PB10 / PB11 | 已初始化、未接;**经 U5 子板连接器直连 TTL** | `DMA1_Stream3/4` **被 SPI2 占** | ⚠ 硬件最顺(U5 上就是 TTL,若屏板做成子板正好),但**没有 DMA 退路** |
|
||||
| UART4 | PC10 / PC11 + **PA15(DE)** | RS-485 采集簇(**冻结**),`g_rs485` 绑的就是它 | — | ❌ 不要动,会牵动冻结簇的验收基线 |
|
||||
| UART5 | PC12 / PD2 | 已初始化、未接 | `DMA1_Stream0/7` 空闲 | 可用,但无硬件 DE |
|
||||
|
||||
**建议**:
|
||||
- 若**走 485 且需要新收发器**(决策一方案 A)→ 选 **USART2**(DMA 有退路、与 U5 无关)。
|
||||
- 若**屏板作为子板插 U5、走 TTL**(决策一方案 C 且产品化)→ 选 **USART3**(U5 上现成)。
|
||||
- **两者都先不写死**:端口用句柄参数传入,模块不写死外设实例(照 `rs485_handle_t` 的做法)。
|
||||
|
||||
> ⚠ 网表报告口径有矛盾,接线前必须实物核对:`docs/硬件平台/V0.0_网表详细分析报告.md` 的摘要行写
|
||||
> "RS485#4 = **UART5**(PC12/PD2)",但同一文档的 `docs/硬件平台/V0.0_网表详细分析报告.md` §4.4 逐脚接线
|
||||
> (U11→`ST_TX4`→U15)与固件
|
||||
> (`App/app/app_main.c:197` `rs485_init(&g_rs485, &huart4, ST_DIR4_…)`)都指向 **UART4 + PD0**。
|
||||
> 摘要行与该节自相矛盾,摘要行疑误——**以实物为准,别按摘要行接线**。
|
||||
> ⚠ **USART1 交接前必须确认两件事**:① `PA10` 已接线(否则收不到召唤帧);
|
||||
> ② 控制台已不再写 `USART1->DR`(否则两条流互相插字节,症状是"屏板偶尔花屏 + 日志偶尔乱码",
|
||||
> 很容易误判成 CRC 或时序问题)。
|
||||
|
||||
### 决策三:谁来跑这个链路(宿主)
|
||||
|
||||
@@ -136,15 +145,21 @@
|
||||
|
||||
## 3. 任务分解
|
||||
|
||||
分 4 批。**批 0 不通过就不写代码**(除了台架 TTL 验证那条路)。
|
||||
分 5 批。**批 0 不做完就不要碰屏板链路代码**——批 0 干的是"把 USART1 腾出来",腾不出来就没地方接屏板。
|
||||
|
||||
### 批 0 · 可行性与硬件定版(3 项)
|
||||
### 批 0 · 腾位置(4 项,全是前置,做完才有 USART1 可用)
|
||||
|
||||
| 序 | 任务 | 改动点 | 判据 |
|
||||
|---|---|---|---|
|
||||
| 0-1 | **确认屏板收发器型号与速率上限** | 只读屏板实物 / 原理图,结论回填本文 §2 决策一 | 拿到型号,且写明"是否支持 700 kbaud" |
|
||||
| 0-2 | **定 700 kbaud 方案(A/B/C)** | 出结论,不改代码 | 三选一落纸,含代价与验收方式 |
|
||||
| 0-3 | **选端口与 DE 引脚** | 定 `USART2` 还是 `USART3`;DE 用哪个空闲 GPIO(极性按本板收发器,**不可照抄屏板 PA1 低=发**) | 引脚表落纸,且与 `.ioc`、网表、实物三方核对过 |
|
||||
| 0-1 | **接 PA10** | 硬件:把 USART1_RX(PA10)接到屏板 TX 一侧 | 主机能收到字节(先用 115200 手动发几个字节验证) |
|
||||
| 0-2 | **台架串口线挪位** | 硬件:CH340 从 USART1 调试口改接 CN1 的 RS-232 端(或 U14) | `serial-assistant` 在 RS-232 侧能收到日志 |
|
||||
| 0-3 | **日志口迁移(USART1 → RS-232)** | ① `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 `huart2`(RS232#3)或 `huart5`(RS232#1);② 该实例改 **`UART_MODE_TX`**(只发不收,别把 ORE 病搬过去) | 日志在 RS-232 侧可读、内容与迁移前一致;连续 10 min 无 ORE 锁存、无 `[ERR]`;USART1 完全空出 |
|
||||
| 0-4 | **定 USART1 那端的物理介质** | 直连屏板 TTL 侧,或外部 ≥1 Mbps 485 模块(决策一的剩余子决策) | 结论落纸,含接法与验收方式 |
|
||||
|
||||
> 0-3 是最容易出岔子的一步:`console_log.c` 是**看门狗喂狗节奏的唯一写者**
|
||||
> (机制见 `docs/子系统设计/控制台单写者日志设计说明.md`),改端口后必须台架跑一轮长稳,
|
||||
> 确认没把发送超时判据、drain 预算、僵尸通道自愈这些保护改坏。
|
||||
> 改完先跑一次 `@test`,别急着往下做。
|
||||
|
||||
> 批 0 期间可以先做**批 1 的第 1 项**(协议层纯软件、不碰硬件),不冲突。
|
||||
|
||||
@@ -153,12 +168,12 @@
|
||||
| 序 | 任务 | 改动点 | 判据 |
|
||||
|---|---|---|---|
|
||||
| 1-1 | **协议层模块(纯逻辑,可主机单测)** | 新建 `Drivers/BSP/ScreenLink/sb_proto.c/h`:CRC-16/MODBUS(表与屏板 `auchCRCHi/Lo` 逐字节一致)、帧 A 解析、帧 B 组帧 | 主机单测:给定 6 B 召唤帧能算出屏板同样的 CRC;组出的 4208 B 帧 CRC 自校验通过 |
|
||||
| 1-2 | **波特率与格式落地** | `STM32F407-Demo.ioc` 里把选定 UART 改 **700000 / 8N1 / 16 倍过采样**(改 `.ioc` 而不是只改 `Src/usart.c`,否则 CubeMX 重生成会丢);`Src/usart.c` 只写 USER CODE | 示波器/逻辑分析仪实测位宽误差 **< 1 %**(42 MHz ÷ 700 kHz = 60 整除,理论误差 0) |
|
||||
| 1-3 | **DE 控制与收发切换** | 新建 `Drivers/BSP/ScreenLink/sb_link.c/h`:拉 DE → 等建立(**不要用 `HAL_Delay(1)`,用 DWT 忙等 ≤10 µs**)→ 发 → 等 TC → 松 DE | 逻辑分析仪上看 DE 与最后一字节的时序:DE 必须在 TC 之后才翻转,不得截断末字节 |
|
||||
| 1-4 | **6 B 召唤帧接收** | 选定 UART 开 IDLE 中断接收(缓冲 **16 B**);`HAL_UARTEx_RxEventCallback` 里**加本端口分支**(现有回调只认 `g_rs485.huart`,不加分支会静默收不到);`HAL_UART_ErrorCallback` 同样要加 | 屏板每 275 ms 发来的 6 B 能稳定收到,`Size == 6`,CRC 通过率 100 % |
|
||||
| 1-2 | **波特率与格式落地** | `STM32F407-Demo.ioc` 里把 **USART1** 改 **700000 / 8N1 / 16 倍过采样**(改 `.ioc` 而不是只改 `Src/usart.c`,否则 CubeMX 重生成会丢);`Src/usart.c` 只写 USER CODE | 示波器/逻辑分析仪实测位宽误差 **< 1 %**;理论值 `USARTDIV = 7.5`、`BRR = 0x0078`(APB2 84 MHz),误差 0 % |
|
||||
| 1-3 | **USART1 收中断与全局回调分支** | 开 IDLE 中断接收(缓冲 **16 B**);`HAL_UARTEx_RxEventCallback` 里**加 USART1 分支**(现有回调只认 `g_rs485.huart`,不加分支会静默收不到);`HAL_UART_ErrorCallback` 同样要加 | 屏板每 275 ms 发来的 6 B 能稳定收到,`Size == 6`,CRC 通过率 100 % |
|
||||
| 1-4 | **(条件项)外部 485 模块的 DE** | **仅当** 0-4 选了"经外部模块接 A/B"才做:新建 `sb_link.c/h`,拉 DE → 等建立(**不要用 `HAL_Delay(1)`,用 DWT 忙等 ≤10 µs**)→ 发 → 等 TC → 松 DE | 逻辑分析仪上看 DE 与最后一字节的时序:DE 必须在 TC 之后才翻转,不得截断末字节 |
|
||||
|
||||
> ⚠ **`HAL_UARTEx_RxEventCallback` / `HAL_UART_ErrorCallback` 是全局单例**(`Drivers/BSP/RS485/rs485.c:189/205`),
|
||||
> 现在只判 `huart == g_rs485.huart`。新端口必须加分支,否则中断进来了但没人处理——
|
||||
> 现在只判 `huart == g_rs485.huart`。USART1 必须加分支,否则中断进来了但没人处理——
|
||||
> 表象是"屏板一直超时",很容易误判成协议错。
|
||||
|
||||
### 批 2 · 协议实现(5 项)
|
||||
@@ -199,9 +214,11 @@
|
||||
```
|
||||
Drivers/BSP/ScreenLink/
|
||||
├── sb_proto.c/h 纯逻辑:CRC-16、帧 A 解析、帧 B 组帧 ← 可主机单测
|
||||
└── sb_link.c/h 传输:UART、DE、任务宿主、状态灯映射表 ← 依赖 HAL,仅 MCU
|
||||
└── sb_link.c/h 传输:USART1、任务宿主、状态灯映射表 ← 依赖 HAL,仅 MCU
|
||||
```
|
||||
|
||||
DE 控制不单独成模块:**只有 0-4 选了"外部 485 模块"才需要**,届时并进 `sb_link.c` 里两个小函数即可。
|
||||
|
||||
**为什么拆两层**:协议层不碰 HAL 才能在 `test/host/` 里跑单测(项目既有做法:原样 include 生产 `.c`,
|
||||
stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉验证**是最省事的正确性保证。
|
||||
|
||||
@@ -246,7 +263,10 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
|
||||
### 4.4 不要做的事
|
||||
|
||||
- ❌ **不要改 `rs485.c` 的常量**(`RS485_RX_BUF_SIZE` / `RS485_TX_MAX_LEN` 改大会牵动冻结的采集簇基线)。
|
||||
长帧走新模块,DE 时序照思路自己实现。
|
||||
长帧走新模块;万一要 DE 时序,照思路自己实现。
|
||||
- ❌ **不要让控制台继续写 `USART1->DR`**——这是本项最容易犯的错。`console_log.c` 是逐字节轮询直写,
|
||||
和屏板链路的 4208 B 共用同一个数据寄存器,两条流一混,症状是"屏板偶尔花屏 + 日志偶尔乱码",
|
||||
查起来会误以为是 CRC 或时序问题。批 0 的 0-3 就是干这个的。
|
||||
- ❌ **不要在 `Src/freertos.c` 里加任务**——那是 CubeMX 生成物,重生成会丢。
|
||||
- ❌ **不要用 `HAL_Delay(1)` 做 DE 建立延时**(`rs485.c` 那样做是为了兼容它自己的场景):
|
||||
700 kbaud 下每帧多 1 ms 无所谓,但任务里阻塞 1 ms 是白给;用 DWT 忙等 ≤10 µs 更干净。
|
||||
@@ -257,18 +277,19 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
|
||||
|
||||
## 5. 台架联调步骤(可以逐级停下来)
|
||||
|
||||
**核心思路:先不碰硬件、先用 TTL 把软件全部跑通,再等硬件决策。** 这样硬件没定时软件不空等。
|
||||
**核心思路:先在 USART1 上把软件全部跑通,再接真屏板。** 屏板不是必需的前置——PC 就能当屏板。
|
||||
|
||||
| 步 | 做什么 | 需要什么 | 停下也能交付什么 |
|
||||
|---|---|---|---|
|
||||
| 0 | **腾位置**:接 PA10、CH340 挪到 RS-232 侧、日志迁走 | 一根飞线 + 改接串口线 | USART1 空出来,日志照旧能看(批 0) |
|
||||
| 1 | 协议层单测(`test/host/screenlink/`) | 无硬件 | CRC 与组帧的正确性,可回归 |
|
||||
| 2 | PC 串口助手**模拟屏板**:手发 6 B 召唤帧,看主机回的 4208 B | USB 转 485 模块或 USB 转 TTL 模块 + 主机板 | 主机侧协议 100 % 可验证 |
|
||||
| 2 | PC 串口助手**模拟屏板**:手发 6 B 召唤帧,看主机回的 4208 B | **USB 转 TTL 模块**接 USART1(PA9/PA10)+ 主机板 | 主机侧协议 100 % 可验证 |
|
||||
| 3 | 反向:PC 收主机帧,用脚本核对 4208 B / CRC / 显存内容 | 同上 | 帧内容正确性(与 `g_ui_fbuf` 逐字节比) |
|
||||
| 4 | **接真屏板**(TTL 直连,或经 USB 转 485 模块转接,绕过板上收发器) | 屏板实物 | 出图 + 按键 + 状态灯全链路 |
|
||||
| 5 | 换成板上 485 通道(需决策一落地) | 换好收发器的主板 | 产品形态验证 |
|
||||
| 4 | **接真屏板**(TTL 直连屏板 UART2 的 PA2/PA3 一侧) | 屏板实物 + 屏板 TTL 引出 | 出图 + 按键 + 状态灯全链路 |
|
||||
| 5 | 产品形态:换外部 ≥1 Mbps 485 模块或直连线束 | 模块 + 线束 | 产品形态验证 |
|
||||
|
||||
> 第 2、3 步是**性价比最高的两步**:不用屏板、不用改硬件,就能把 90 % 的软件问题挖出来。
|
||||
> 建议先做这两步,再谈硬件。
|
||||
> 注意这两步用的是 **USB 转 TTL**(不是 USB 转 485)——USART1 侧没有收发器,直连 TTL 就对了。
|
||||
|
||||
---
|
||||
|
||||
@@ -276,11 +297,13 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
|
||||
|
||||
| 风险 | 触发条件 | 影响 | 回退/应对 |
|
||||
|---|---|---|---|
|
||||
| **700 kbaud 硬件做不到** | 决策一判 A 但换器件来不及 | 整条链路卡住 | 走方案 C(TTL 直连)先出功能,硬件下版再补;软件不受影响 |
|
||||
| 屏板侧收发器也不够快 | 屏板实物核对后发现 | 700 kbaud 两边都做不到 | 只能走方案 B(屏板降速 + 放大 ack 窗口),需屏板方配合 |
|
||||
| **日志迁移把台架弄瞎** | 先改代码、后挪串口线 | 什么都看不到,误以为固件挂了 | 顺序钉死:0-2 先挪线、0-3 再改代码;改完先跑一次 `@test` |
|
||||
| **控制台与屏板链路抢 `USART1->DR`** | 日志没迁干净就接屏板 | 屏板花屏 + 日志乱码,像 CRC / 时序错 | 0-3 的判据明确要求"USART1 完全空出" |
|
||||
| **PA10 没接或接了仍悬空** | 只接了 TX | 收不到召唤帧,主机永远不回帧 | 0-1 单独验一次"能收到字节"再往下做 |
|
||||
| **日志口又染上 ORE 锁存** | 新日志口照抄 `UART_MODE_TX_RX` | 控制台静默、看门狗误复位(老病复发) | 新日志口设 `UART_MODE_TX`;判据含"连续 10 min 无 ORE" |
|
||||
| 帧长按 3208 实现 | 照 readme 写 | CRC 全失败、屏板不亮 | 已写进 §4.2 警示;联调第一步就核 4208 |
|
||||
| DE 极性接反 | 照抄屏板 PA1"低=发" | 总线一直被占、屏板收不到 | 本板 `DIR4` 是**高=发**(`rs485.c` `RS485_DIR_TX` = `GPIO_PIN_SET`);新通道按本板收发器定,逻辑分析仪一看便知 |
|
||||
| 中断回调漏加分支 | 只改自己模块,忘改 `rs485.c` 的全局回调 | 收不到召唤帧,表象像协议错 | 批 1 第 4 项已列为判据 |
|
||||
| DE 极性接反(仅外部模块方案) | 照抄屏板 PA1"低=发" | 总线一直被占、屏板收不到 | 极性由那个模块定,逻辑分析仪一看便知 |
|
||||
| 中断回调漏加分支 | 只改自己模块,忘改 `rs485.c` 的全局回调 | 收不到召唤帧,表象像协议错 | 批 1 第 3 项已列为判据 |
|
||||
| 屏板自复位被误判离线 | 链路监视窗口设得太小 | 每 83 分钟误报一次 | 判据定为"连续 ≥10 s 无帧" |
|
||||
| 状态灯语义返工 | 映射表拍脑袋定的 | 后期改表要重测 | 把表做成一张 `const` 数组,改表不改逻辑 |
|
||||
| RAM 超门禁 | 误把 RX 缓冲也做成 4208 B | `RW_IRAM1` 逼近 92 % | RX 只要 16 B(§1.3) |
|
||||
@@ -291,6 +314,7 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
|
||||
|
||||
做完这一项,要能同时满足(逐条可测,对应 `docs/产品需求/产品需求设计文档.md` §5.16.10 第 8~15 条):
|
||||
|
||||
0. **腾位置**:日志在 RS-232 侧可读、内容与迁移前一致;USART1 已无任何控制台写入;连续 10 min 无 ORE 锁存。
|
||||
1. 屏板按 275 ms 召唤,主机每帧在 **≤200 ms** 内回 **4208 B**,连续 10 min 零超时。
|
||||
2. 帧 B 前 3200 B 与 `g_ui_fbuf` **逐字节一致**。
|
||||
3. 屏板 7 个物理键逐个按下 → UI 动作正确;无键时 `key = 0` 不产生事件。
|
||||
@@ -304,8 +328,12 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
|
||||
|
||||
## 8. 与其它工作的关系
|
||||
|
||||
- **与 `docs/任务规划/暂缓-RS485.md` 无关**:那条是"对下采集簇"(UART4 + `g_rs485`),本项是"对上屏板",
|
||||
两者**不共用外设、不共用驱动常量**。本项**不需要解冻** RS-485 采集簇。
|
||||
- **与 `docs/任务规划/暂缓-RS485.md` 无关**:那条是"对下采集簇"(UART4 + `g_rs485`;V0.1 网表确认
|
||||
RS485#4 就是 UART4),本项是"对上屏板",走 USART1。两者**不共用外设、不共用驱动常量**,
|
||||
本项**不需要解冻** RS-485 采集簇。
|
||||
- **与日志/控制台工作强耦合**:批 0 的 0-3 要改 `App/log/console_log.c`——那是看门狗喂狗节奏的唯一写者
|
||||
(机制见 `docs/子系统设计/控制台单写者日志设计说明.md`)。这项改动**不能与其它动控制台的活儿并行**,
|
||||
而且必须台架长稳验证过才算完;**它比屏板链路本身风险更高**,建议单独排一轮、单独回滚。
|
||||
- **与 UI 补齐无关**:本项只消费 `ui_net_sink_get_lcdmem()` / `ui_net_sink_inject_key()`,
|
||||
不改任何页面。UI 页面已在 2026-10-28 收口,正好可以直接拿来当被测对象。
|
||||
- **不占用并行工作树名额的额外理由**:改的是新目录 + `app_main_init` 一处 + `task_handles.h` 一处 +
|
||||
|
||||
Reference in New Issue
Block a user