dab0d8ba17
批 2 五项全部落地(docs/任务规划/屏板链路.md §3): - 2-1 sb_link_frame_update():uiTask 渲染后按需组帧,不留 3200 B 影子 副本,直接拿活显存与帧内点阵段 memcmp;组完自校验,过了才置 ready。 静态 4208 B 帧缓冲实测落 RW_IRAM1(0x20006d98),不在 CCM。 - 2-2 空闲中断校完 6 B 召唤帧直接点 TX DMA(sb_tx_kick),不排队不攒批; busy 期间再来的召唤丢帧并计数,绝不叠发(屏板收帧一次 IDLE 一包)。 - 2-3 按键走环形队列(中断入、任务出),uiTask 按 §4.3 表映射 UI_KEY_* 后调 ui_port_queue_key;9/10(RESET/FACTORY)按决策四先丢弃并留痕。 - 2-4 HAL_UART_TxCpltCallback 在 rs485.c 加第三行转发(三个全局回调 落点收一处,防日后重复定义);busy 冻结帧缓冲,错误中断按 gState 收拾被打断的 TX,防残留 busy 把链路永久锁死。 - 2-5 连续 >=10 s 无有效召唤帧才判离线(不按 500 ms——屏板约 5000 s 自复位有 1 s 空窗),恢复即清标志;CRC 错帧静默丢弃并计数。 实测:台架 40 s(PC 顶替屏板,--key-fixed 2 持续改画面)rx=143 ok=143 keys=143 crc=0 / tx=143 done=143 drop=0 abor=0 fb=144 bad=0;脚本一停 10 s 准点出 OFFLINE。组帧耗时 509 µs 典型 / 709 µs 峰值——原 0.3 ms 判据系估算,已按实测在规划文档改口为 1 ms 并给出压降路径(未做)。 附带:rs485_on_rx 补 CODE-RULE-09 文档块(本轮改 rs485.c 触发整文件 重扫被拦);CRC 循环计数改 32 位(消掉 ARMCC 每轮 UXTH);bench 脚本 加 --reply/--key-fixed/--dump,并写明 CH340 收不了 700 kbaud 连续流、 --reply 收不全 4208 B 不是固件问题。 主机单测 146/146 PASSED(+65);Keil 0 错误 0 警告;ci_local 全绿 (SKIP=nested-comment,worktree 限制,主树脚本另查 0 新发)。 Code=238,936 B / RW_IRAM1 65.5 % / RW_CCM 87.9 %。
Drivers/BSP/RS485/ — RS-485 半双工通信驱动
RS-485 半双工收发驱动:DE(发送使能)方向控制 + 收发时序管理。 配合
App/task/rs485_task.c与App/util/crc.c、App/util/ringbuf.c组成完整协议栈。
文件一览
| 文件 | 作用 |
|---|---|
rs485.c/h |
驱动初始化、DE 引脚方向切换、收发缓冲管理 |
硬件接口
- UART5:PC12 TX / PD2 RX / PD0 DE(发送使能,低=接收、高=发送)
关键点
- 半双工:发送前拉高 DE 并等待发送完成,发送后立即拉低 DE 切回接收
- 方向切换时序与波特率相关——切换过快会截断末字节,过慢会阻塞总线
- 接收经
ringbuf(SPSC 无锁环形缓冲)缓冲,供协议层解析
相关文档
- 协议工具:
App/util/crc.c、App/util/ringbuf.c - 任务实现:
App/task/rs485_task.c - 硬件引脚:根
README.md「外设接口」