docs(屏板): 删掉「日志口改 UART_MODE_TX」的说法

2026-10-26 已裁定不改 RX 配置,ORE 由 console_log.c 既有的 drain 预算与
300 ms 冷却兜住(docs/子系统设计/控制台单写者日志设计说明.md §4.4.1、§12)。
两处文档仍在要求把新日志口设成 UART_MODE_TX,会误导实现,直接删除:

- 屏板链路.md 批 0 的 0-2 第 ② 项、风险表「日志口又染上 ORE 锁存」整行、
  验收清单第 0 条的「无 ORE 锁存」
- 产品需求设计文档.md 的 §5.16 硬要求 ②、端口重排第 2 条、
  §9.13 第 16 条的第 ② 项

0-2 因此只剩「把 huart1 收口成一处端口宏指向 huart5」。
判据里的「无 ORE 锁存」一并去掉——ORE 是已知残余,不按它判。
This commit is contained in:
2026-10-29 18:21:17 +08:00
parent 50c75eb516
commit 27a700b0d8
2 changed files with 8 additions and 12 deletions
@@ -1058,9 +1058,9 @@ sequenceDiagram
>
> ORE 锁存的充分条件与接线无关——**RX 使能了却从不读 `DR`**:线上只要出现
> 任意一个字节或一个噪声沿,`RXNE` 置位后没人读,下一个事件就把 **ORE 锁存**;而 ORE 只能用
> "先读 SR 再读 DR"清除,于是**永不自愈**。这条对本实现有两条硬要求:
> ① 屏板链路要用 RX,就必须真的消费 `DR`,并在 `HAL_UART_ErrorCallback` 里**清 ORE 后重挂接收**
> (否则一次噪声就永久锁死,症状与"屏板不回帧"一模一样);② 新日志口设 `UART_MODE_TX`,从机制上把 RX 摘掉。
> "先读 SR 再读 DR"清除,于是**永不自愈**。这条对本实现有一条硬要求:
> 屏板链路要用 RX,就必须真的消费 `DR`,并在 `HAL_UART_ErrorCallback` 里**清 ORE 后重挂接收**
> (否则一次噪声就永久锁死,症状与"屏板不回帧"一模一样)。
**帧 A:召唤 / 按键(屏板 → 主机,固定 6 B)**
@@ -1144,15 +1144,12 @@ ISR 抢占,一抢就撞第 1 条,而后果在屏板侧完全不可见。时
(`U15 = TP8485E-SR` 只有 250 kbps,`docs/芯片手册/TP8485E-SR.md`)。换到这条线上,速率问题从根上消失,
也不用改任何硬件。UART4 保持 RS-485 冻结簇不动——`rs485_init(&g_rs485, &huart4, …)` 与 V0.1 一致,**无需摘除**。
**这次重排带来两件事,必须在任务里体现:**
**这次重排带来一件事,必须在任务里体现:**
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 直连没有方向控制**:主机侧不再有半双工方向切换,建立时间、"等 TC 收尾"一类约束全部不适用。
@@ -2544,7 +2541,7 @@ docs/任务规划/UI补齐.md §5);原「当前执行 6 项」(记录 5
| 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]` | 否 |
| 16 | **日志口迁移(USART1 → RS-232 通道)** | ① `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 RS232#1(`huart5` / UART5);② **不动** UART4 的 `g_rs485` 绑定 | 日志在 RS-232 侧(CN1)可读且内容与迁移前一致;USART1 **完全空出**;连续 10 分钟无 `[ERR]` | 否 |
**批次划分**:
+3 -4
View File
@@ -111,7 +111,7 @@
> 现有的 TTL CH340 接不上去(接上去轻则不通信,重则打坏 `U13` 或适配器)。
> 另:`U14` 是 RS232#3 的网口座(3 脚 `RS232_TX3` / 6 脚 `RS232_RX3`),**本通道用不上**——别把它当成备选端子。
**迁移时收口成一处端口宏,别散改**:`huart5` 现在是 `115200 8N1 / UART_MODE_TX_RX`(`Src/usart.c:74-81`),
**迁移时收口成一处端口宏,别散改**:`huart5` 已是 `115200 8N1`(`Src/usart.c:74-81`),
业务代码里没人用,只有 `Src/stm32f4xx_it.c:565` 挂着 IRQ 入口。
> ⚠ **USART1 交接前必须确认两件事**:① 控制台已不再写 `USART1->DR`(否则两条流互相插字节,
@@ -195,7 +195,7 @@
| 序 | 任务 | 改动点 | 判据 |
|---|---|---|---|
| 0-1 | **台架串口线挪位** | 硬件:**换成 USB 转 RS-232 适配器**(TTL 的 CH340 直连不了),接 RS232#1 的三个端子——适配器 TXD → **CN1.10**(板子 `RS232_RX1`)、RXD → **CN1.12**(板子 `RS232_TX1`)、GND → **CN1.7 或 CN1.8**(`CGND`)。端子号出自 `docs/硬件平台/V0.1.tel`;`U14` 是 RS232#3 的网口座,本通道用不上 | `serial-assistant` 在 RS-232 侧能收到日志 |
| 0-2 | **日志口迁移(USART1 → RS-232)** | ① `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 **`huart5`(RS232#1,已定)**;② 该实例改 **`UART_MODE_TX`**(只发不收,把 RX 从机制上摘掉)——`huart5` 现为 `UART_MODE_TX_RX`,**改在 `.ioc` 里**(`Src/usart.c` 是 CubeMX 生成物,只写 USER CODE) | 日志在 RS-232 侧可读、内容与迁移前一致;连续 10 min 无 ORE 锁存、无 `[ERR]`;USART1 完全空出 |
| 0-2 | **日志口迁移(USART1 → RS-232)** | `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 **`huart5`(RS232#1,已定)** | 日志在 RS-232 侧可读、内容与迁移前一致;连续 10 min 无 `[ERR]`;USART1 完全空出 |
| 0-3 | **落定 USART1 到屏板的接线** | 按决策一:TTL 直连屏板 UART2 侧(PA2/PA3);把线束接法与验收方式写清楚 | 接法落纸;照此接线后屏板发来的 6 B 召唤帧能被收到 |
> PA10 已接线(用户 2026-10-28 确认),屏板链路**不需要额外飞线**。
@@ -346,7 +346,6 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
| **TTL 适配器直插 CN1** | 沿用那根 CH340 去接 RS-232 端子 | 不通信,且 RS-232 的 ±电平可能打坏 `U13` 或适配器 | 0-1 已写死「换 USB 转 RS-232 适配器」;RS232#1 无 TTL 出口,只能走电平转换后的 CN1 |
| **控制台与屏板链路抢 `USART1->DR`** | 日志没迁干净就接屏板 | 屏板花屏 + 日志乱码,像 CRC / 时序错 | 0-2 的判据明确要求"USART1 完全空出" |
| **一次噪声后链路永久静默** | 错误回调里不清 ORE | 屏板召唤再也收不到,症状与"协议不对"完全一样 | 1-3 判据含"拔插 TX 线制造噪声后自动恢复" |
| **日志口又染上 ORE 锁存** | 新日志口照抄 `UART_MODE_TX_RX` | 控制台静默、看门狗误复位(老病复发) | 新日志口设 `UART_MODE_TX`;判据含"连续 10 min 无 ORE" |
| 帧长按 3208 实现 | 照 readme 写 | CRC 全失败、屏板不亮 | 已写进 §4.2 警示;联调第一步就核 4208 |
| 中断回调漏加分支 | 只改自己模块,忘了那三个全局 UART 回调里唯一的一处实现只分发另一条通道的句柄(§1.3) | 收不到召唤帧,表象像协议错 | 批 1 的 1-3 已列为判据 |
| 屏板自复位被误判离线 | 链路监视窗口设得太小 | 每 83 分钟误报一次 | 判据定为"连续 ≥10 s 无帧" |
@@ -365,7 +364,7 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
做完这一项,要能同时满足(逐条可测,对应 `docs/产品需求/产品需求设计文档.md` §5.16.10 第 8~15 条):
0. **腾位置**:日志在 RS-232 侧可读、内容与迁移前一致;USART1 已无任何控制台写入;连续 10 min 无 ORE 锁存。
0. **腾位置**:日志在 RS-232 侧可读、内容与迁移前一致;USART1 已无任何控制台写入。
1. 屏板按 **280 ms** 召唤(判据是 RT_count > 55 → 第 56 拍 × 5 ms;屏板侧常写的 275 ms 是 55×5 的算法),主机每帧在 **≤200 ms** 内**发完** **4208 B**,连续 10 min **主机侧**零超时、零 CRC 错帧。
2. 帧 B 前 3200 B 与 `g_ui_fbuf` **逐字节一致**。
3. 屏板 7 个物理键逐个按下 → UI 动作正确;无键时 `key = 0` 不产生事件。