Files
STM32F4-Base/Drivers/BSP/UI
wandering1 7708f12c10 fix(ui/screenlink): 按键应答扣到按键后画面,反馈典型 250-450 ms 降至 70-135 ms
按键召唤答的是按键前的旧帧:uiTask 还没消化键答案就发走了,新画面
只能等下一次周期召唤(280 ms/轮)才带得出——真机反馈 250-450 ms 的
主构成(根因账本 docs/子系统设计/屏板链路设计说明.md §7.1)。

改动(用户批准范围 A+B+C;屏板固件未动,决策三不变):
- sb_link:按键召唤改为只入队不起发;uiTask 同拍重绘并组帧成功后交
  凭据(sb_link_key_rendered),TIM3 1 kHz 的 sb_link_ms_tick 以 ≤1 ms
  放行新帧。140 ms 截止(SB_KEY_RESP_MAX_MS,+59.6 ms 线上 <205 ms
  屏板放弃线)保底发旧帧,"一召一答"契约不破;线忙时同旧丢单、
  不留扣件。起发两中断源(USART1 IDLE/TIM3)共用 sb_tx_kick,
  "判忙→占位"在 PRIMASK 临界区原子完成。
- ui_task:排空注键挪到组帧之前,注键→即派即绘→组帧同拍闭环;
  组帧返回 BSP_OK 才交重绘凭据(BUSY 拍帧还没反映按键)。
- ui_port:注键单槽改 8 深环(连按不再互相覆盖,满丢最旧+计数);
  新增 ui_port_service_keys:同拍 lv_indev_read + lv_refr_now,
  省掉 indev ≤20 ms + 刷新 ≤20 ms 两段等待。
- ui_menu_view:菜单移动选中只失效新旧两行带(黄金参考零像素变化),
  滚动/异常回退整框失效。
- simulator:窗口循环 sleep 扣除本轮已耗时(原先无条件睡满
  lv_timer_handler 返回值,叠加 Windows Sleep 15.6 ms 粒度放大观感)。
- 串口 TX 上报新增 dfok/dfold(凭据放行新帧数/超时保底旧帧数):
  dfold 连涨 = uiTask 被饿 ≥140 ms 的直接现场证据。

验证:test/host/sb_link 164/164(新增 18 条:不立刻起发/凭据放行/
140 ms 截止保底/忙时不留扣件/陈旧凭据不放行等边界);菜单 8 状态 +
内容页 66 张黄金像素 PASS;Keil @build 0 错误 0 警告(两次);
BOM 99 文件无漂移、代码规范、doc-links 本次文件零问题、cppcheck PASS。
文档:屏板规划文档已被主干收编进设计说明,延迟账本落
docs/子系统设计/屏板链路设计说明.md §7.1,并同步 §4 口径、§8 接口、
§9.1 单测台账 146→164、§10 坑账本补条。

RAM 台账(分支不跑 --write,并行分支提交约定):本笔盖戳行
RW_IRAM1 94,336 B (72.0%) / RW_CCM 57,376 B (87.9%),较上一台账行
+4,400 B——为距上次台账构建以来分支累计差(含批 3 状态灯等未盖戳
提交),非全部本笔引入;本次自身增量按对象计为 ui_port.o +12 B
(8 深键环+丢计数+indev 指针)与 sb_link/o 数十字节级。
gate: only mem-budget/mem-numbers pending lead ledger backfill
(合并落主干后 Lead 统一 --write 回填受管区)。
2026-10-30 09:50:31 +08:00
..
2026-09-09 17:15:04 +08:00
2026-09-07 10:48:18 +08:00
2026-09-10 11:36:33 +08:00

Drivers/BSP/UI/ — LVGL UI 组件

基于 LVGL 的界面实现:菜单树、内容页、通用组件、中文字库、待机页。 与 PC 模拟器共用同一套 UI 源码(simulator/ 只提供平台层)。

结构

核心 / 框架

文件 作用
ui_port.c/h LVGL 移植层:显示驱动、输入设备、tick 注册
ui_menu.c/h 菜单框架(树结构与导航)
ui_menu_view.c/h 菜单视图渲染
ui_menu_tab.c/h 页签组件
ui_deco.c/h 界面装饰元素(图标、边框等)
ui_standby.c/h 待机页
ui_pwd_def.h 密码页默认值定义
ui_font_cn_12.c 中文字库(由 tools/font_gen/ 生成,勿手改)

内容页

文件 作用
ui_content_page.c/h 内容页框架
ui_page_ac.c/h 交流量页
ui_page_dc.c/h 直流量页
ui_page_device_info.c/h 设备信息页
ui_page_net_cfg.c/h 网口设置页
ui_page_password.c/h 密码页
ui_page_runlog.c/h 运行日志页
ui_page_selftest.c/h 自检页

数据汇入(推流)

文件 作用
ui_net_sink.c/h 远端显示总线(RemoDispBus)数据汇入口
ui_net_sink_backend.h 后端抽象接口(MCU / 模拟器分别实现)
ui_net_sink_backend_mcu.c MCU 端后端实现

⚠️ 编码注意(本目录含中文字符串)

  • 本目录文件带 UTF-8 BOM(.c 内含中文字符串字面量,BOM 使 ARMCC 按 UTF-8 解码)
  • Edit 工具会剥掉 BOM:改完必须核对并按原样补回 3 字节 EF BB BF, 否则 ARMCC 改按 CP936 解读 → #870-D: invalid multibyte character sequence
  • UI 改动一律走 ui-verify skill 五步门禁
  • 含新汉字的文案提交前先跑 font-regen skill 重生成 ui_font_cn_12.c

相关文档

  • UI 架构:docs/UI设计/UI_设计架构.md
  • 菜单设计:docs/UI设计/菜单页面设计.md、docs/UI设计/内容页架构.md
  • 字体:docs/UI设计/UI_中文字体生成与配置.md
  • 模拟器:docs/UI设计/LVGL模拟器部署与使用说明.md
  • 自动化测试:docs/UI设计/UI_自动化测试流程.md
  • 协议:docs/UI设计/RemoDispBus协议与接收设计说明.md