docs(屏板链路): 删除自我纠错叙述与冗余论证,文档只写现状
范围:产品需求设计文档 §5.16 全节(另清 §5.9 一处旧口径、 §9.13 一处旧阻塞)+ 方案文档 §0/§1.3/决策一/批 0/§5 收尾表。 删掉的历史错误叙述: - 旧版本 BRR 推算写错那一整块(42 000 000 / 700 000 = 60 → 0x3C0); - "PA10 未接线这条旧结论已撤销"三段 → 压成一句现状; - "原四项未知已消解"三处、"上表保留作为取证过程"; - 调用契约表里四行已被屏板源码推翻的条目(下行长度、按键 TAG、 面板指示灯、背光对比度)与"四项未知消解"块; - 上行表键号 1~10 就地改成语义正确的 1~9,不再用更正注解释; - 待确认清单里已定版的帧长一条(5 项 → 4 项,重新编号); - "第 14 条从待决定改为已决定不做" → 只写"已决定不做"; - §9.13 末尾"已消解的旧阻塞"整块;§5.9 "旧口径…作废" 一句。 压缩:readme 3208 B 冲突注 5 行 → 4 行;16 B/29 B 论证 15 行 → 6 行。 顺带修掉上一轮删除后留下的三处悬空表述("比换收发器便宜"、 "原来的速率死结因此消失"、"§0 第 2 行")。 刻意保留:屏板固件源码符号与常量(275 ms / 200 ms / 4208 B / 700000 8N1 的出处)、UART4 冻结簇那一行与"为什么是 USART1"的 选型依据——它们是依据不是历史。 口径依据:docs/文档规范.md 已裁定"新文档不再设变更记录节, 文档只写现状"。 核验:doc-links --sections-strict 两份文件均 RC 0(161 处章节引用, 98 % 可判定);新增行编号门禁 [OK];无 BOM / CR 0 / U+FFFD 0 / 无连续空行 / 单个 LF 结尾;表格列数与 HEAD 逐项比对 0 处不一致。 净变化:需求文档 +36 −73,方案文档 +7 −9。
This commit is contained in:
+36
-73
@@ -735,7 +735,7 @@ sequenceDiagram
|
||||
**FR-ADC-5 前端物理口径(已实测盖章)**
|
||||
- `1k 串联 + 1k 到地` 是**源阻抗匹配、不是分压**:`ADCn` 节点只有 {串阻、滤波电容、转换器引脚},
|
||||
「1k 到地」接在差分负端(`ADC7_GND` → R32 → AGND),故 AINn↔引脚变比 **1:1**。
|
||||
- 旧口径「2:1 分压 → 305.18 / 1611.3 µV/码」**作废**(那是芯片手册 ±10 V 档 LSB,不可混用)。
|
||||
- 芯片手册 ±10 V 档的 LSB(305.18 / 1611.3 µV/码)是**另一回事**,不可与本板变比混用。
|
||||
- 剩余未知量只有**子板/端子板变比**,因此系数只能推到"µV/码 @ 引脚"(§4.6 量纲口径)。
|
||||
- 拓扑图 [`docs/images/ADC前端电路.svg`](../images/ADC前端电路.svg)。
|
||||
|
||||
@@ -964,7 +964,7 @@ sequenceDiagram
|
||||
|
||||
### 5.16 屏板链路:串口主通道 + 网络镜像(FR-HMI)🔶
|
||||
|
||||
> **口径更正(2026-10-28)**:参考产品的屏与键**不在主机板上**。主机侧源码里 5 个"碰硬件"的函数
|
||||
> **口径(2026-10-28 定版)**:参考产品的屏与键**不在主机板上**。主机侧源码里 5 个"碰硬件"的函数
|
||||
> `KeyGet()` / `WriteScreenByByte()` / `LCD_LED_Update()` / `getRs485Key()` / `anyNewKey()`
|
||||
> **全树只有声明、没有实现**(由屏板 BSP 库提供);按键轮询函数名即 `Key_Rs485_Process()`
|
||||
> (注释"轮询从485传来的按键值");屏板插槽号 `CN_SLOT_DISP = 0`(注释"显示板插槽号固定为0")。
|
||||
@@ -977,8 +977,7 @@ sequenceDiagram
|
||||
> (§5.16.9 第 11 条),这是本项复刻的最大缺口——没有它,产品无法脱离 PC 独立带屏运行。
|
||||
>
|
||||
> **屏板固件已到手(2026-10-28)**:屏板侧源码在 `D:\Code\DTU Code\DTU-LCD`(STM32F103ZE +
|
||||
> UC1698U 160×160 单色 + **20 路状态指示灯** + 7 个物理按键),**物理层与帧格式全部可从代码确定**。
|
||||
> 原"四项未知"(波特率 / 帧格式 / 方向控制 / 分片)**已全部消解** → 见 §5.16.2、§5.16.3。
|
||||
> UC1698U 160×160 单色 + **20 路状态指示灯** + 7 个物理按键),**物理层与帧格式全部可从代码确定**,见 §5.16.2、§5.16.3。
|
||||
> 该链路**不是可选项**:屏板是**主动召唤方**,主机不应答则屏板**无画面、无灯、无键**。
|
||||
|
||||
#### 5.16.1 一份显存、两个出口(串口为主,网络为镜像)
|
||||
@@ -996,38 +995,25 @@ sequenceDiagram
|
||||
|
||||
| 上行通道 | 采集方式 | 载荷 | 与另一路的关系 |
|
||||
|---|---|---|---|
|
||||
| **串口屏板通道**(主) | `getRs485Key()` 轮询 + `anyNewKey()` / `ClearNewKeyEvent()` 事件 | 物理键号 `1~10` | 映射为逻辑键值写入 `g_tKey` |
|
||||
| **串口屏板通道**(主) | `getRs485Key()` 轮询 + `anyNewKey()` / `ClearNewKeyEvent()` 事件 | 物理键号 `1~9`(实测 7 个物理键,§5.16.3 ②) | 映射为逻辑键值写入 `g_tKey` |
|
||||
| 网络显示总线(镜像) | `RDisp_Proc_SaveKey` → `g_tRemoteKey` | 键值位掩码 1 B | 写入 `g_tRemoteKey` |
|
||||
| 汇合点 | `Key_Read()`(`Key.c:199`) | — | **先取远程、再被本地覆盖**——两键同时挂起时**本地(串口)优先** |
|
||||
|
||||
**串口通道的物理层与协议,交付源码里看不到**——屏板侧的 5 个入口全是**未实现的外部符号**
|
||||
(`KeyGet` / `WriteScreenByByte` / `LCD_LED_Update` / `getRs485Key` / `anyNewKey`),
|
||||
`Release/` 下的 `.o` 与 `.out` 由更完整的树编译而来。能确定的只有**调用契约**(协议本身已由屏板源码补齐,见 §5.16.2):
|
||||
|
||||
> 注:上表"物理键号 `1~10`"是**参考主机侧的假设**。屏板固件实测只有 **7 个物理键**,
|
||||
> 键值 `1~9` 有入口、`10` 无入口,且 `9`/`10` 语义与参考的 `F1`/`F1|ENT` **不同**(§5.16.3 ②)。
|
||||
**串口通道的物理层与协议以屏板源码为准**(§5.16.2 / §5.16.3)。参考主机侧源码给不出物理层,
|
||||
只能给出**调用契约**——能确定的只有这几项:
|
||||
|
||||
| 契约项 | 已确定的内容 | 依据 |
|
||||
|---|---|---|
|
||||
| 下行粒度 | 3200 B 整帧 + 4 B LED,**一次调用一帧**(无分片参数) | `LCD_LED_Update(ptr,len,ledbuf,ledbuflen)` 签名 |
|
||||
| 下行长度 | `len = 3200` 为实参,非推导 | `Disp_Pub.c:8295-8298` |
|
||||
| 上行粒度 | 单字节物理键号,`0` 表示无键 | `getRs485Key()` 返回 `uint8_t`,`Key.c:176` 判 `key == 0` 即返回 |
|
||||
| 事件语义 | 有"新键事件"与"清除事件"两个动作 | `anyNewKey()` / `ClearNewKeyEvent()` |
|
||||
| 屏板地址 | 板件槽号 **0**(`CN_SLOT_DISP`) | `Key.c:8` 注释"显示板插槽号固定为0" |
|
||||
| 按键消息 TAG | `0xC22C`(`CN_MBUS_TAG_KEY`,注释"与开入 TAG 相同") | `Key.c:9`(该宏在本文件内**未被引用**,属备用/历史路径) |
|
||||
| 面板指示灯 | `WritePanelLED(pbyLedFlag)` 已在 BSP 中实现(`SR1200_peri.c:362`) | 与屏板同一块面板 |
|
||||
| 背光 / 对比度 | `Lcd_BackLight()`(`Lcd_BKOn/Lcd_BKOff` 走 GPIO)、`Lcd_SetContrast(值, 亮)` | `omapl138_lcd.c:240-247`、`Disp_Interface.c:3281` |
|
||||
| 屏板初始化 | `Lcd_init_display(0xC1F00000)` 由 `LocalDisp_StartTask()` 调用,**不经过任何 UART 打开动作** | `Disp_Main.c:56` |
|
||||
|
||||
> ⚠ **原"四项未知"已由屏板固件消解**(2026-10-28,实测值见 §5.16.2):
|
||||
> ① 波特率 **700000 8N1**;② 无帧头,**整帧定长 + 尾部 CRC-16/MODBUS**;
|
||||
> ③ **软件 DE**(屏板侧 PA1,低 = 发送);④ **不分片**——一帧一整屏,屏板召唤、主机应答。
|
||||
> 上表保留作为**取证过程**,说明"只看参考主机侧源码能确定什么、不能确定什么",不是待办。
|
||||
|
||||
#### 5.16.2 串口通道:物理层与帧格式(屏板源码实测)
|
||||
|
||||
屏板固件工程 `DTU-LCD` 已在手(STM32F103ZE / 512 KB Flash / 64 KB RAM / 72 MHz,UC1698U 160×160 单色),
|
||||
**链路协议逐字节可确定**。原"四项未知"全部消解,本节即为**主机侧必须实现的契约**。
|
||||
**链路协议逐字节可确定**,本节即**主机侧必须实现的契约**。
|
||||
|
||||
> ⚠ **角色与直觉相反:屏板是 Modbus 主站,主机是从站。** 屏板主动发请求,主机在**请求后**应答;
|
||||
> 主机**从不主动推送**,也不允许主动推送(半双工总线,谁先说谁占用)。
|
||||
@@ -1046,16 +1032,14 @@ sequenceDiagram
|
||||
| 发送 | `HAL_UART_Transmit(..., 1000)` 阻塞发完,随即切回接收 | `RS485_SendBuff()` |
|
||||
| 缓冲 | RX **4208 B**、TX **8 B** | `UART_RX_LEN` / `UART_TX_LEN` |
|
||||
|
||||
> **700 kbaud 在两种候选时钟下都零误差**(2026-10-28 更正分频算法):16 倍过采样(`OVER8 = 0`)时
|
||||
> **700 kbaud 在两种候选时钟下都零误差**: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 %**。
|
||||
>
|
||||
> ⚠ **旧版本本节写的"`42 000 000 / 700 000 = 60` → `USARTDIV = 60.0`、`BRR = 0x3C0`"是错的**——
|
||||
> 漏掉了公式里的 16 倍过采样。照 `0x3C0` 写下去实际波特率是 **43 750**,不是 700 000。
|
||||
> 若改时钟树或改用 HSI,必须重算——700 kbaud 下 2 % 误差已足以丢帧。
|
||||
> 若改时钟树或改用 HSI,**必须重算**——700 kbaud 下 2 % 误差已足以丢帧。
|
||||
>
|
||||
> **端口裁定(用户决定,2026-10-28):屏板走 USART1,日志口让位。**
|
||||
> 屏板链路改用 **USART1(PA9/PA10)**——这条通道是 **MCU 引脚直出 TTL,不经过板上任何收发器**,
|
||||
@@ -1065,16 +1049,13 @@ sequenceDiagram
|
||||
> 备选 RS232#1 = UART5 PC12/PD2,两者都经隔离器 → `U13` TPT3232E → CN1),
|
||||
> 迁移在屏板链路跑通之后做,见下方"主机侧端口重排"。
|
||||
>
|
||||
> ⚠ **"PA10 未接线"这条旧结论已撤销(2026-10-28 用户确认)**:`App/log/console_log.c` 与
|
||||
> `docs/子系统设计/控制台单写者日志设计说明.md` §12 里的"PA10 悬空"是 2026-10-02 的**归因推断**,
|
||||
> 不是实测;PA10 一直是接线的。所以屏板链路**不需要额外飞线**。
|
||||
> **PA10 一直是接线的**(2026-10-28 用户确认)→ 屏板链路**不需要额外飞线**。
|
||||
>
|
||||
> 但 ORE 锁存的**真正充分条件与引脚悬不悬空无关**——**RX 使能了却从不读 `DR`**:线上只要出现
|
||||
> ORE 锁存的充分条件与接线无关——**RX 使能了却从不读 `DR`**:线上只要出现
|
||||
> 任意一个字节或一个噪声沿,`RXNE` 置位后没人读,下一个事件就把 **ORE 锁存**;而 ORE 只能用
|
||||
> "先读 SR 再读 DR"清除,于是**永不自愈**。这条对本实现有两条硬要求:
|
||||
> ① 屏板链路要用 RX,就必须真的消费 `DR`,并在 `HAL_UART_ErrorCallback` 里**清 ORE 后重挂接收**
|
||||
> (否则一次噪声就永久锁死,症状与"屏板不回帧"一模一样);② 新日志口设 `UART_MODE_TX`
|
||||
> 仍然是对的——那是从机制上把 RX 摘掉,与 PA10 接不接线无关。
|
||||
> (否则一次噪声就永久锁死,症状与"屏板不回帧"一模一样);② 新日志口设 `UART_MODE_TX`,从机制上把 RX 摘掉。
|
||||
|
||||
**帧 A:召唤 / 按键(屏板 → 主机,固定 6 B)**
|
||||
|
||||
@@ -1102,11 +1083,10 @@ CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法 `auch
|
||||
| 3208 | 998 | 保留填充 | 屏板不读,**但参与 CRC 计算**,须固定填充(建议 `0x00`) |
|
||||
| 4206 | 2 | CRC-16 | 覆盖 `[0, 4205]`,**高字节在前** |
|
||||
|
||||
> ⚠ **帧长以代码为准:4208 B,不是 3208 B。** 屏板 readme 与 `BMP_LEN` 都写"3208 字节",
|
||||
> 但接收侧实参是 `Check_CRC(DR, UART_RX_LEN)`,`UART_RX_LEN = 4208` → CRC 取 `DR[4206]/DR[4207]`、
|
||||
> 覆盖 `DR[0..4205]`;`rs485.h` 注释亦为"接收缓冲区长度,**与 Modbus 数据帧长度一致**"。
|
||||
> 若主机只发 3210 B,屏板会在 `DR[4206]` 处读到陈旧字节,**CRC 必失败并静默丢弃**。
|
||||
> 有效载荷只有前 3208 B,其后 998 B 为凑齐 CRC 窗口的填充。**此项须台架实测复核后固化。**
|
||||
> ⚠ **帧长以代码为准:4208 B**(屏板 readme 与 `BMP_LEN` 写的"3208 字节"不作准):接收侧实参是
|
||||
> `Check_CRC(DR, UART_RX_LEN)`,`UART_RX_LEN = 4208` → CRC 取 `DR[4206]/DR[4207]`、覆盖 `DR[0..4205]`。
|
||||
> 有效载荷只有前 3208 B,其后 998 B 为凑齐 CRC 窗口的填充;**主机只发 3210 B 时屏板会在
|
||||
> `DR[4206]` 读到陈旧字节,CRC 必失败并静默丢弃**。**此项须台架实测复核后固化。**
|
||||
|
||||
> ⚠ **应答帧不是合法 Modbus RTU 响应**:没有地址、没有功能码、没有字节数域,是一段裸二进制块。
|
||||
> 因此**不能套用现成 Modbus 从站栈**,只能按上表手工组帧。
|
||||
@@ -1153,12 +1133,9 @@ CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法 `auch
|
||||
根源就是"RX 悬空 + RX 使能 → ORE 锁存 → HAL 轮询 TX 恒快速失败"。日志口不需要收,
|
||||
就别再开 RX,否则等于把同一场病搬到新口上。
|
||||
|
||||
> ⚠ **TTL 直连没有 DE**:主机侧不再有半双工方向控制,DE 极性、建立时间、等 TC 收尾全部不适用。
|
||||
> 只有选"USART1 引脚 → 外部 485 模块 → 屏板 A/B"这种接法时才需要处理外部模块的 DE,
|
||||
> 此时**极性由那个模块决定,不可照抄屏板**(屏板的"低=发"是它自己那套收发器的接法)。
|
||||
> ⚠ **TTL 直连没有方向控制**:主机侧不再有半双工方向切换,建立时间、"等 TC 收尾"一类约束全部不适用。
|
||||
|
||||
> ⚠ 主机 RX 只需吃下 **6 B 召唤帧**(不像屏板要吃 4208 B):16 B 缓冲 + 空闲中断断帧就够。
|
||||
> TTL 直连**没有自发自收**问题(TX/RX 是两根独立线);只有走外部 485 模块时才会回灌。
|
||||
> ⚠ 主机 RX 只需吃下 **6 B 召唤帧**(不像屏板要吃 4208 B):16 B 缓冲 + 空闲中断断帧就够——TX / RX 是两根独立线,无自发自收。
|
||||
|
||||
#### 5.16.3 屏板侧行为:状态灯 / 按键 / 背光 / LOGO
|
||||
|
||||
@@ -1277,13 +1254,12 @@ for (i = 1; i < LED_COUNT; i++) /* LE
|
||||
> 主机的链路监视**不能**把这种周期性空窗判成"屏板掉线",更不能联动告警/保护。
|
||||
> 判据建议:连续 **≥ 10 s** 无任何应答才置"屏板离线"。
|
||||
|
||||
**待与屏板固件方确认的 5 项**(不影响本产品先开工,但验收前必须闭环):
|
||||
**待与屏板固件方确认的 4 项**(不影响本产品先开工,但验收前必须闭环):
|
||||
|
||||
1. 线上一帧到底是 **4208 B**(代码实参)还是 **3210 B**(readme + `BMP_LEN`)——决定主机发多少字节。
|
||||
2. `Check_CRC` 用缓冲区容量而非实际接收长度,**短帧会被误判**;是否计划改为传 `Size`。
|
||||
3. 键值 9 / 10 是否要改成 `F1` / `F1|ENT`(对齐参考),还是保持"复位 / 工厂"语义。
|
||||
4. `key_configs[]` 是否要补 ADD / DEC 物理键(当前 7 键,枚举 11 项)。
|
||||
5. 屏板 4208 B 接收缓冲与 700 kbaud 在长线(> 50 m)下的误码率实测数据。
|
||||
1. `Check_CRC` 用缓冲区容量而非实际接收长度,**短帧会被误判**;是否计划改为传 `Size`。
|
||||
2. 键值 9 / 10 是否要改成 `F1` / `F1|ENT`(对齐参考),还是保持"复位 / 工厂"语义。
|
||||
3. `key_configs[]` 是否要补 ADD / DEC 物理键(当前 7 键,枚举 11 项)。
|
||||
4. 屏板 4208 B 接收缓冲与 700 kbaud 在长线(> 50 m)下的误码率实测数据。
|
||||
|
||||
#### 5.16.4 链路 B 帧格式(逐字节)
|
||||
|
||||
@@ -1324,24 +1300,15 @@ for (i = 1; i < LED_COUNT; i++) /* LE
|
||||
| 4 | 4 | 显存字节数(大端) | `UI_FB_SIZE` = `(160*160)/8` = **3200** |
|
||||
| 8 | 8 | 键值表 `F1/F2/U/D/L/R/ENT/ESC` | `0x04/0x80/0x02/0x40/0x10/0x08/0x20/0x01` |
|
||||
|
||||
> **为什么是 16 B 而不是参考的 29 B**:参考的 29 B 里有 **13 B 是颜色信息**
|
||||
> (1 B 颜色位 `CN_RDISP_LCD_TYPE` + 12 B RGB 三色 `CN_RGB_RED/GREEN/BLUE`)。
|
||||
> 三处源码证据表明**这 13 B 在参考自己的构建里就是死字段**:
|
||||
>
|
||||
> 1. `RemoDispBus.h:46` `CN_RDISP_TYPE_MONO = TRUE` → `CN_RDISP_LCD_TYPE = CN_MODE_GREY_MONO`、
|
||||
> `CN_RDISP_MEMSIZE = (X>>3)*Y`,即**链路显存本身就是 1 bpp**,不是彩色显存。
|
||||
> 2. `RDisp_Form_InitInf` 里三个 RGB 值是**编译期常量** `CN_RGB_RED/GREEN/BLUE`,
|
||||
> **不是逐帧数据**,每次召唤都发同样的 12 B。
|
||||
> 3. `RDisp_LcdColor_To_Mono()` 对 `CN_MODE_GREY_MONO` **直接 `return TRUE`**,不做任何转换;
|
||||
> 真正干活的 `RDisp_Lcd16B_To_Mono()`(RGB565 → 单色)挂在 `CN_MODE_COLOR_16B` 分支,
|
||||
> 本构建**永不进入**,是死代码。
|
||||
>
|
||||
> 本产品的屏板同样是**单色 1 bpp**(`DTU-LCD` 的 `ScreenPrintf()` 只吃 1 bpp 点阵),
|
||||
> 所以这 13 B **既无接收方、也无语义**。**整段删除,不对齐多色协议**:29 − 13 = **16 B**。
|
||||
> 这不是"少实现"——**参考能力全集里的多色分支连参考自己都没启用**(§2.4.1)。
|
||||
> **为什么是 16 B 而不是参考的 29 B**:参考的 29 B 里有 **13 B 颜色信息**(1 B 颜色位
|
||||
> `CN_RDISP_LCD_TYPE` + 12 B RGB `CN_RGB_RED/GREEN/BLUE`),而这 13 B 在**参考自己的构建里就是死字段**:
|
||||
> `RemoDispBus.h:46` 的 `CN_RDISP_TYPE_MONO = TRUE` → 链路显存本身就是 1 bpp;三个 RGB 值是编译期
|
||||
> 常量(每次召唤发同样的 12 B);`RDisp_LcdColor_To_Mono()` 对 `CN_MODE_GREY_MONO` 直接 `return TRUE`,
|
||||
> RGB565 分支永不进入(§2.4.1)。本产品屏板同为单色 1 bpp(`DTU-LCD` 的 `ScreenPrintf()` 只吃 1 bpp
|
||||
> 点阵),这 13 B **既无接收方也无语义** → **整段删除,不对齐多色协议**:29 − 13 = **16 B**。
|
||||
|
||||
**键值是位掩码,不是枚举**——可组合下发:`CN_KEY_F1|CN_KEY_ENT = 0x24`(`Key.c` 物理键号 `10` 即此值)。
|
||||
`CN_KEY_ADD=0x82`、`CN_KEY_SUB=0x84` 只在 RS-485 通道使用,不进 7003 键值表。
|
||||
`CN_KEY_ADD=0x82`、`CN_KEY_SUB=0x84` 只在**串口屏板通道**使用,不进 7003 键值表。
|
||||
|
||||
#### 5.16.6 显存上送的续传与拒绝语义
|
||||
|
||||
@@ -1426,21 +1393,20 @@ 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**,主机侧走 **USART1 TTL 直连**(无 DE);若改走外部 485 模块,DE 极性由该模块决定,**不可照抄屏板**。
|
||||
- **帧长 4208 B**(3208 B 有效载荷 + 998 B 填充 + 2 B CRC,§5.16.2)。
|
||||
- **700000 8N1**,主机侧走 **USART1 TTL 直连**(无方向控制)。
|
||||
- **屏板每 ≈5000 s 自复位一次**,约 1 s 空窗;主机链路监视须容忍(建议连续 ≥10 s 无应答才判离线)。
|
||||
- **屏板只有 7 个物理键**,键值 `9`/`10` 是"复位 / 工厂",与参考主机的 `F1` / `F1|ENT` **语义不同**。
|
||||
- **单色**:屏板是 1 bpp 单色面板,参考的 13 B 颜色信息(颜色位 + RGB 三色)**无接收方**,不对齐。
|
||||
|
||||
> 第 1 / 3 / 4 / 5 / 8 条是**客户端可见的报文口径差异**——现有 `DTU-RemoteLCD` 按 8 B INIT 实现,
|
||||
> 补到 **16 B** 后**客户端必须同步改**,否则会错位解析。这是本项复刻唯一的跨端风险点。
|
||||
> 注意:**16 B 与参考的 29 B 不是同一口径**——13 B 颜色字段被有意删掉,
|
||||
> 客户端**不得**按 29 B 预留缓冲再截取前 16 B 使用(**从偏移 4 起含义即不同**:
|
||||
> 参考偏移 4 是颜色位,本产品偏移 4 是显存大小的高字节)。
|
||||
> 注意:**16 B 与参考的 29 B 不是同一口径**——客户端**不得**按 29 B 预留缓冲再截取前 16 B 使用
|
||||
> (**从偏移 4 起含义即不同**:参考偏移 4 是颜色位,本产品偏移 4 是显存大小的高字节)。
|
||||
>
|
||||
> 第 11 / 12 / 13 条是**整条链路缺失**,不是报文细节差异——它决定了本产品能否脱离 PC 独立带屏运行。
|
||||
>
|
||||
> 第 14 条从"待决定"改为**已决定不做**:屏板固件自己管背光与超时熄灭,主机再插一手会打架。
|
||||
> 第 14 条**已决定不做**:屏板固件自管背光与超时熄灭,主机再插一手会打架。
|
||||
|
||||
#### 5.16.10 复刻完成判据
|
||||
|
||||
@@ -2586,12 +2552,9 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
|
||||
> ① **台架串口线挪位**——现在的 CH340/`COM6` 接在 USART1 调试口上,日志迁到 RS-232 侧后
|
||||
> 必须改接到 CN1(或 U14),否则 `@test` 与 `serial-assistant` 全部抓不到日志,等于把台架弄瞎。
|
||||
> **这条要在第 16 条动代码之前完成。**
|
||||
> ② **RX 要真的读、ORE 要真的清**——PA10 一直是接线的(原"未接线"结论已撤销,§5.16.2),
|
||||
> ② **RX 要真的读、ORE 要真的清**——PA10 一直是接线的(§5.16.2),
|
||||
> 但"RX 使能却不读 `DR`"本身就足以让 ORE 永久锁存。第 11 条实现时必须在
|
||||
> `HAL_UART_ErrorCallback` 里清 ORE 并重挂接收,否则一次噪声就永久静默。
|
||||
>
|
||||
> **已消解的旧阻塞**:原"屏板协议拿不到、不得按猜测定契约"的告警**不再适用**——物理层、帧格式、
|
||||
> 键值、状态灯、时序均已从 `DTU-LCD` 源码确定。剩下的只是"实物联调确认",不是"协议未知"。
|
||||
|
||||
---
|
||||
|
||||
|
||||
+7
-9
@@ -9,10 +9,10 @@
|
||||
|
||||
---
|
||||
|
||||
## 0. 先看结论:一条硬约束已解除,三条前置顶上来
|
||||
## 0. 先看结论:裁定已定,三条流程前置顶上来
|
||||
|
||||
**2026-10-28 用户裁定:屏板走 USART1,日志口让位给 RS-232 通道。** 这条裁定把原来的头号阻塞直接消掉了,
|
||||
代价是换成几条**流程**前置——都不是软件能解决的,但都比换收发器便宜。
|
||||
**2026-10-28 用户裁定:屏板走 USART1,日志口让位给 RS-232 通道。** 700 kbaud 只有 USART1 这一条 MCU
|
||||
引脚直出的通道吃得到(其余串口都要过板上的收发器);代价是换成几条**流程**前置——都不是软件能解决的。
|
||||
|
||||
| # | 项 | 实测 / 出处 | 后果 |
|
||||
|---|---|---|---|
|
||||
@@ -20,7 +20,7 @@
|
||||
| 2 | **台架串口线接在 USART1 上** | CH340 → `COM6`,`@test` / `serial-assistant` 都靠它抓日志 | 日志一迁,台架立刻瞎 → **先把线挪到 RS-232 侧(CN1)再动代码** |
|
||||
|
||||
**执行顺序因此是**:挪台架线 → 迁日志口 → 才开始写屏板链路。
|
||||
第一步是拧螺丝,第二步约 20 行代码(§3 批 0),第三步才是原来规划的那些批次。
|
||||
第一步是拧螺丝,第二步约 20 行代码(§3 批 0),第三步才是屏板链路的开发批次。
|
||||
|
||||
---
|
||||
|
||||
@@ -57,8 +57,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"的附带好处之一。
|
||||
|
||||
---
|
||||
|
||||
@@ -66,7 +64,7 @@
|
||||
|
||||
### 决策一:波特率与物理介质(**已裁定 2026-10-28**)
|
||||
|
||||
用户裁定:**屏板挂 USART1(PA9/PA10),日志迁 RS-232 通道。** 700 kbaud 只有这条 MCU 引脚直出的通道吃得到,原来的速率死结因此消失:
|
||||
用户裁定:**屏板挂 USART1(PA9/PA10),日志迁 RS-232 通道。** 700 kbaud 只有这条 MCU 引脚直出的通道吃得到:
|
||||
|
||||
| 项 | 结论 |
|
||||
|---|---|
|
||||
@@ -133,7 +131,7 @@
|
||||
| 0-2 | **日志口迁移(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`**(只发不收,把 RX 从机制上摘掉) | 日志在 RS-232 侧可读、内容与迁移前一致;连续 10 min 无 ORE 锁存、无 `[ERR]`;USART1 完全空出 |
|
||||
| 0-3 | **落定 USART1 到屏板的接线** | 按决策一:TTL 直连屏板 UART2 侧(PA2/PA3);把线束接法与验收方式写清楚 | 接法落纸;照此接线后屏板发来的 6 B 召唤帧能被收到 |
|
||||
|
||||
> PA10 **不需要动**——用户 2026-10-28 确认一直是接线的,原"接 PA10"那条任务作废(§0 第 2 行)。
|
||||
> PA10 已接线(用户 2026-10-28 确认),屏板链路**不需要额外飞线**。
|
||||
|
||||
> 0-2 是最容易出岔子的一步:`console_log.c` 是**看门狗喂狗节奏的唯一写者**
|
||||
> (机制见 `docs/子系统设计/控制台单写者日志设计说明.md`),改端口后必须台架跑一轮长稳,
|
||||
@@ -258,7 +256,7 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
|
||||
| 2 | PC 串口助手**模拟屏板**:手发 6 B 召唤帧,看主机回的 4208 B | **USB 转 TTL 模块**接 USART1(PA9/PA10)+ 主机板 | 主机侧协议 100 % 可验证 |
|
||||
| 3 | 反向:PC 收主机帧,用脚本核对 4208 B / CRC / 显存内容 | 同上 | 帧内容正确性(与 `g_ui_fbuf` 逐字节比) |
|
||||
| 4 | **接真屏板**(TTL 直连屏板 UART2 的 PA2/PA3 一侧) | 屏板实物 + 屏板 TTL 引出 | 出图 + 按键 + 状态灯全链路 |
|
||||
| 5 | 产品形态:按最终线束接法定版(距离 / 隔离有要求时另选器件,并单独核器件速率上限) | 线束(必要时加器件) | 产品形态验证 |
|
||||
| 5 | 产品形态:按最终线束接法定版 | 线束 | 产品形态验证 |
|
||||
|
||||
> 第 2、3 步是**性价比最高的两步**:不用屏板、不用改硬件,就能把 90 % 的软件问题挖出来。
|
||||
> 注意这两步用的是 **USB 转 TTL**——USART1 侧没有收发器,直连 TTL 就对了。
|
||||
|
||||
Reference in New Issue
Block a user