Files
stc32g128k/Docs/walkthrough.md

6.4 KiB
Raw Blame History

STC32G 手环项目工程与功能实现 Walkthrough

本项目完成了手环核心交互逻辑与状态机的全部实现。所有代码已完全用中文进行行级注释,且在 Keil C251 下编译成功0 Errors

实现功能摘要

1. 法语 UI 语言包支持 (French-Only UI)

  • 全界面翻译:手环所有的 UI 屏幕显示内容均已替换为法语。
  • 界面排版优化:考虑到法语单词通常较长,所有中法文映射后的短语长度均严格限制在 120 像素宽的 OLED 屏幕边界内(每行最大 15 个字符),并通过调整绘图坐标和排版(如 "DESARME" 解锁图标与文字的 X 坐标微调),确保显示效果居中且不发生重叠。
    • WATCHMONTRE
    • ARMEDARME
    • DISARMDESARME
    • PAIR MENUMENU APPAI.
    • DOOR SENSORDETEC. PORTE
    • PIR MOTIONDETEC. PIR
    • SMOKE DETECTDETEC. FUMEE
    • GAS LEAKDETEC. GAZ
    • WATER FLOODDETEC. EAU
    • SEARCHING...RECHERCHE...
    • TRIGGER SENSORDECLENCH. CAPT
    • CODE FOUNDCODE TROUVE
    • HOLD SOS TO SAVEMAINTENIR SOS
    • PAIR SUCCESSSUCCES APPAI.
    • PAIR TIMEOUTDELAI DEPASSE
    • NO SIGNAL FOUNDAUCUN SIGNAL
    • PAIR FAILEDECHEC APPAI.
    • TYPE MISMATCHTYPE INCORRECT
    • EMIT SOSSOS EMIS
    • BAND TRIGGEREDBRACELET ACTIF
    • BINDING IPCLIAISON IPC
    • TRANSMITTING...ENVOI EN COURS

2. 单线制幻彩 RGB LED (XL-2020RGBC-2812B) 驱动集成

  • 物理层引脚映射:使用原 LED_R 所属引脚 P0.0 作为单线数据输入DIN引脚将其配置为高速推挽输出。在系统初始化时主动输出熄灭状态防止上电乱闪。
  • 精准 Bit-bang 驱动:根据 XL-2020 的 800Kbps 时序规范1T cycle ≈ 41.67ns @ 24MHz实现了毫微秒级别的 WS2812_Write24Bit(u8 g, u8 r, u8 b)WS2812_Reset() 软件驱动。在发送数据流时,关闭总中断 EA = 0,确保脉冲宽度不被中断打断。
  • 软件级虚拟 LED 兼容层:将原有的 LED_R, LED_G, LED_B 重定义为全局 bit 软件变量。在 1ms Timer1_Isr 结尾捕获到虚拟 LED 的状态改变时,再自动调用 WS2812 驱动输出对应的 GRB 24 位电平。这使得应用层所有的 LED 闪烁及颜色逻辑无需任何改动,保证了系统的高稳定性与高扩展性。

3. 自适应射频解码兼容性

  • 重构为基于电平比例的自适应解码算法。放宽绝对微秒窗口限制,通过低/高电平比例15~48倍基准为31倍自动识别 EV1527 帧并解析数据。
  • 优化串口调试输出,避免大量多行打印造成的 CPU 阻塞。

4. 严格匹配要求的按键与事件交互逻辑

  • 进入配对菜单:在待机模式下,同时长按 + 3秒进入传感器类型选择菜单。
  • 进入对码搜索 (Pair Wait):在菜单中选择好类型后,短按 SOS 确认,此时触发 1 次 100ms 短振确认,且 LED 开启白色快闪3Hz进入雷达扫描信号接收。
  • 主动呼救 (Emit SOS):在待机模式下,短按 SOS 键,立刻切入求救模式并开始向外循环发射 433MHz 警报信号。
  • IPC 对码绑定:在待机模式下,长按 SOS 键 5秒显示 BINDING IPC 页面,向外发射 1 次 433MHz 绑定信号(数据码为 0x01维持 2 秒后自动返回待机。
  • 解除求救模式在求救模式下长按任意一个按键UP、DOWN 或 SOS即可主动解除警报退回时钟待机。

5. 不接收/解析他人 SOS 广播

  • 手环只对已经配对存储在内部数据库门磁、PIR、烟感、燃气、水浸的传感器 ID 触发报警。
  • 防区轮询解码时客观过滤并排除 SOS 信号的被动接收。

6. 电池百分号显示修复与坐标复原

  • 字模基线对齐:将 % 字符0x25的字模数据在 8x16 矩阵中向上平移 2 像素,使其与前面的数字处于同一水平基准线。
  • 坐标优化防重合:将电池图标右移至 X=92, Y=27,电量百分比置于 X=62, Y=24。二者之间保留 6 像素间距,既美观又完美杜绝了贴合与重叠问题。

7. 对码捕获卡顿 Bug 修复

  • 修复了 while(1) 循环开头无条件执行 state_changed = 0 导致在 Section 4 异步检测到射频匹配信号跳入 STATE_PAIR_CONFIRM 后重绘标记被强行抹除、屏幕始终卡死在搜索雷达页面的 Bug。现在已改在重绘判定内部重置检测到对码信号即可瞬间跳转至“捕获成功”确认页。

仿真模式扩展说明

为了支持无物理元件调试,串口输入指令集已同步扩展:

  • 模拟组合按键:串口发送 c 字符,模拟同时长按 + 按键 3 秒进入配对菜单。
  • 模拟确认搜索:在菜单页下发送 s,模拟按下 SOS 键,触发 100ms 短振与白灯快闪,进入对码搜索(雷达显示)。
  • 模拟按键解除:在求救模式下,发送 UDS(代表长按按键),即可解除 SOS 并退回时钟。
  • 模拟切换系统布防状态(用于测试普通防区的触发):
    • 发送 1:强制系统进入 NORMAL 撤防/常态模式(门磁/PIR 触发时会被忽略,烟感/水浸/燃气仍可触发)。
    • 发送 2:强制系统进入 ARMED 布防模式(门磁/PIR 此时被触发会立刻报警)。
    • 发送 3:强制系统进入 DISARMED 撤防模式。

编译与 Git 仓库同步信息

  • 编译器Keil C251 V5.60.0.0
  • 编译输出目标Build\wristband.hex
  • 编译状态0 Errors, 2 Warnings (均属于未调用辅助函数的警告,无任何影响)
  • Program Sizedata=104.7, edata+hdata=351, xdata=352, const=1390, code=13855
  • Git 仓库地址https://dev.xtell.cn/zouhaitao/stc32g128k.git
  • Git 提交记录
    • feat: initial commit for stc32g12k128 wristband firmware (含完整 .gitignore 规则,已成功忽略全部编译器生成的 .obj / .lst / .hex 等中间临时文件)。
    • feat: translate UI to French and implement XL-2020RGBC-2812B addressable RGB LED driver (添加了法语界面翻译与 WS2812B 精准时序单线驱动,并成功推送至远程 master 分支)。