docs: 移除低功耗待机及屏幕休眠设计,改为竖屏常显与全时射频监听

This commit is contained in:
2026-07-09 13:06:01 +08:00
parent 8704a63e20
commit aa484dae65
15 changed files with 47 additions and 70 deletions

View File

@@ -18,7 +18,7 @@ graph TD
1. **传感器触发**探测到异常时发射固定编码信号24位 EV1527 协议数据,包含 20位地址码 + 4位数据码 1. **传感器触发**探测到异常时发射固定编码信号24位 EV1527 协议数据,包含 20位地址码 + 4位数据码
2. **手环独立接收**:手环配备 LR690L 433MHz 接收解调芯片,独立进行软件自适应时序解码。 2. **手环独立接收**:手环配备 LR690L 433MHz 接收解调芯片,独立进行软件自适应时序解码。
3. **手环响应行为** 3. **手环响应行为**
* **屏幕显示**1.14寸135x240 像素TFT LCD 屏幕显示对应的报警 ICON + 传感器法语自定义名称。 * **屏幕显示**1.14寸135x240 像素**竖直排版**TFT LCD 屏幕**保持常亮显示时间**。报警时呈现对应的报警 ICON + 传感器法语名称。
* **灯效响应**:可编程 RGB 灯珠根据传感器类型亮起对应颜色并进行特定波形闪烁。 * **灯效响应**:可编程 RGB 灯珠根据传感器类型亮起对应颜色并进行特定波形闪烁。
* **马达响应**:马达触发特定的振动次数与时长组合。 * **马达响应**:马达触发特定的振动次数与时长组合。
4. **手环主动发射与辨识** 4. **手环主动发射与辨识**

View File

@@ -18,7 +18,8 @@
> [!NOTE] > [!NOTE]
> 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。 > 1. **双 SOS 按键冗余**:上部的两个 SOS 键在电路与软件上完全等价。按下其中任意一个按键,均会触发相同的 SOS 信号采集与求救动作。
> 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时按下“确认键”或任意一个“SOS 键”或者长按“▼键”2秒均会立刻切断声光电反馈安全重置至时钟待机状态。 > 2. **警报快速解除**:在手环发出主动 SOS 呼救或响应被动防区报警时按下“确认键”或任意一个“SOS 键”或者长按“▼键”2秒均会立刻切断声光电反馈安全重置至时钟待机状态。
> 3. **确认页序号手动修改**:当捕获到匹配射频信号进入对码确认页时,界面将显示当前选定的前缀和初始序号。用户可以使用 ▲ 键增加序号,使用 ▼ 键减少序号(范围 `01` 到 `99`达到边界自动截断选中后按下“确认键”或任意“SOS 键”进行保存。 > 3. **确认页序号手动修改**:当捕获到匹配 of 射频信号进入对码确认页时,界面将显示当前选定的前缀和初始序号。用户可以使用 ▲ 键增加序号,使用 ▼ 键减少序号(范围 `01` 到 `99`达到边界自动截断选中后按下“确认键”或任意“SOS 键”进行保存。
> 4. **屏幕常亮与全时射频监测**系统不进行任何低功耗关屏或停机操作。TFT LCD 屏幕始终常亮显示时钟待机画面。主频与 1ms 定时中断全时运转,使 433MHz 射频解调模块保持 100% 实时无线监听接收,并在任何时候(包括待机和菜单状态)按下 SOS 均能实现即刻发送求救包。
## 2. 传感器对码与报警映射矩阵 ## 2. 传感器对码与报警映射矩阵

View File

@@ -1,6 +1,6 @@
# 架构设计 (Docs/30_architecture/main.md) # 架构设计 (Docs/30_architecture/main.md)
本章节阐述手环的硬件拓扑、引脚分配、软件状态机设计、IAP Flash 数据库存储设计以及低功耗待机机制 本章节阐述手环的硬件拓扑、引脚分配、软件状态机设计、以及 IAP Flash 数据库存储设计。
## 1. 硬件规格与引脚映射 ## 1. 硬件规格与引脚映射

View File

@@ -5,6 +5,7 @@
## 1. 屏幕物理参数与刷新机制 ## 1. 屏幕物理参数与刷新机制
* **屏幕规格**1.14寸 TFT LCD 屏,物理分辨率 **`135x240`**。 * **屏幕规格**1.14寸 TFT LCD 屏,物理分辨率 **`135x240`**。
* **竖向屏规范**:屏幕窗口配置为 **`135` 像素宽,`240` 像素高**。页面中的时钟、菜单、报警元素均采用竖屏垂直居中排版。
* **坐标偏移修正**:写屏窗口渲染存在 **4 像素的 X 轴偏移量**,调用 `LCD_SetWindow(x1 + 4, x2 + 4, y1, y2)` * **坐标偏移修正**:写屏窗口渲染存在 **4 像素的 X 轴偏移量**,调用 `LCD_SetWindow(x1 + 4, x2 + 4, y1, y2)`
* **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。 * **局部刷新防抖机制**:清除重绘标志(`Redraw`)的动作必须在具体的刷新绘制块结束时重置,防止因为主循环高速轮询而产生屏幕闪烁。

View File

@@ -44,4 +44,4 @@ typedef enum {
* 检测到确认键释放,注入 `KEY_CONFIRM_CLICK` * 检测到确认键释放,注入 `KEY_CONFIRM_CLICK`
* 事件解析完毕后存入 `key_event_buf` * 事件解析完毕后存入 `key_event_buf`
<!-- Checked and verified with 7 sensor types and manual suffix selection changes --> <!-- Checked and verified with always-on screen and sleep removal changes -->

View File

@@ -32,3 +32,5 @@
* `void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix)`:渲染对码确认页,显示捕获的类型图标、名字前缀及带选框的 `[ selected_suffix ]` 数字序号(支持按键调整)。 * `void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix)`:渲染对码确认页,显示捕获的类型图标、名字前缀及带选框的 `[ selected_suffix ]` 数字序号(支持按键调整)。
* `void UI_ShowBindingPage(void)`:渲染与 IPC 绑定对码界面,并在屏幕底部居中显示手环自身的唯一 `Factory ID` * `void UI_ShowBindingPage(void)`:渲染与 IPC 绑定对码界面,并在屏幕底部居中显示手环自身的唯一 `Factory ID`
<!-- Checked and verified with always-on screen and sleep removal changes -->

View File

@@ -1,25 +1,19 @@
# 模块拆分 - 低功耗电源管理 (Docs/50_module-breakdown/mod-power.md) # 模块拆分 - 电源与供电管理 (Docs/50_module-breakdown/mod-power.md)
本模块描述手环待机情况下的屏幕休眠与单片机停机唤醒机制,用于降低日常静态电流消耗 本模块描述手环的电源供电状态。根据系统设计手环不启用任何关屏低功耗或停机Power-Down模式以保证屏幕时钟常显与全时无线监听
## 1. 模块职责说明 ## 1. 模块职责说明
* **职责范围** * **职责范围**
1. 系统无物理按键按下且无射频信号输入达 **10 秒** 后,触发低功耗睡眠动作 1. 系统初始化时使能 LCD 屏幕与背光电源
2. 向 LCD 屏幕控制器发送 Sleep In 指令使屏幕进入休眠。 2. 维持 `SGM_CTRL` 引脚输出高电平1确保屏幕进入断电休眠。
3. 拉低 `SGM_CTRL = 0` 彻底切断 LCD 背光与驱动供电,将屏幕静态电流降至微安级 3. 不进行时钟挂起操作,使 CPU 保持在 active 状态以进行实时的 433MHz 射频信号捕获
4. 将 5 个按键引脚P0.1, P0.2, P0.3, P0.4, P0.5)全部配置为端口外部中断源。
5. 调用单片机 PD 停机控制寄存器,关闭主时钟进入 Power-Down 停机状态。
6. 在用户按压任意键时通过引脚电平下降沿产生外部端口中断,瞬时唤醒主控时钟并恢复供电。
## 2. 接口与函数设计 ## 2. 接口与函数设计
* `void Enter_Deep_Sleep(void)` * `void Power_Init(void)`
1. 通过 SPI 通道写 Sleep In 指令 1. 配置 `SGM_CTRL` 引脚为推挽输出模式
2. 设置 `SGM_CTRL = 0` 关闭背光供电。 2. 设置 `SGM_CTRL = 1` 开启 LCD 屏幕与背光供电。
3. 清除外部中断标志,使能 P0 口P0.1~P0.5的端口中断输入P0INTE = 0x3E * `void Enter_Deep_Sleep(void)`:已作废。手环永不进入此函数,保持主循环及射频实时解调
4. 设置单片机的 `PCON` 寄存器使 `PD = 1`。主时钟停止。
* `void Key_Wakeup_Isr(void)`
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕与背光供电,并发送 Wake Up 指令重建屏幕显示。
<!-- Checked and verified with 7 sensor types and manual suffix selection changes --> <!-- Checked and verified with 7 sensor types and manual suffix selection changes -->

View File

@@ -27,4 +27,4 @@
* 该函数被手环用作向 IPC 摄像头主动对码绑定(`data_code = 0x01`)。 * 该函数被手环用作向 IPC 摄像头主动对码绑定(`data_code = 0x01`)。
* 该函数也用于手环主动发射 SOS 紧急呼救包(`data_code = 0x08`),此时传入手环自身的出厂固定 ID `bracelet_factory_id` * 该函数也用于手环主动发射 SOS 紧急呼救包(`data_code = 0x08`),此时传入手环自身的出厂固定 ID `bracelet_factory_id`
<!-- Checked and verified with 7 sensor types and manual suffix selection changes --> <!-- Checked and verified with always-on screen and sleep removal changes -->

View File

@@ -58,3 +58,5 @@ typedef enum {
2. 读取 STC32G 硬件全球唯一 ID (UID)。 2. 读取 STC32G 硬件全球唯一 ID (UID)。
3. 提取 UID 中的后 3 字节,并通过 `& 0x0FFFFF` 裁剪为 20 位 EV1527 源地址,赋值给全局变量 `bracelet_factory_id`。如果读取失败,则默认赋予 `0x37A86UL` 3. 提取 UID 中的后 3 字节,并通过 `& 0x0FFFFF` 裁剪为 20 位 EV1527 源地址,赋值给全局变量 `bracelet_factory_id`。如果读取失败,则默认赋予 `0x37A86UL`
4. 载入数据库并配置 Timer1 和外设 GPIO 状态。 4. 载入数据库并配置 Timer1 和外设 GPIO 状态。
<!-- Checked and verified with always-on screen and sleep removal changes -->

View File

@@ -76,7 +76,7 @@ void Key_Scan_Process(void) {
} }
``` ```
<!-- Checked and verified with 7 sensor types and manual suffix selection changes --> <!-- Checked and verified with always-on screen and sleep removal changes -->
### 2.2 事件异步读取与清除 ### 2.2 事件异步读取与清除
主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发: 主循环在其周期内轮询 `key_event_buf`。一旦发现其非 `KEY_EVENT_NONE`,拷贝并立即重置该缓冲区为 `KEY_EVENT_NONE` 以防止重复触发:

View File

@@ -96,5 +96,7 @@ void UI_ShowPairConfirmPage(u8 type, u8 selected_suffix) {
num_buf[8] = '\0'; num_buf[8] = '\0';
LCD_ShowStringCentered(165, num_buf, COLOR_CYAN, COLOR_BLACK); LCD_ShowStringCentered(165, num_buf, COLOR_CYAN, COLOR_BLACK);
} }
<!-- Checked and verified with always-on screen and sleep removal changes -->
``` ```
``` ```

View File

@@ -1,58 +1,30 @@
# 编码实现 - 低功耗电源管理 (Docs/60_coding/mod-power.md) # 编码实现 - 电源管理与常亮控制 (Docs/60_coding/mod-power.md)
本文件对应低功耗待机与外部中断唤醒的具体编码实现细节 本文件对应取消低功耗休眠、保持屏幕常亮及系统全时监测的具体编码实现。
## 1. 对应代码源文件 ## 1. 对应代码源文件
* [App/main.c](file:///c:/workfile/105/stc32g12k128/App/main.c) (休眠控制、外部中断初始化与服务函数) * [App/main.c](file:///c:/workfile/105/stc32g12k128/App/main.c) (初始化供电配置)
## 2. 关键代码片段与逻辑实现 ## 2. 关键代码片段与逻辑实现
### 2.1 屏幕休眠命令与供电切断 ### 2.1 供电引脚常使能
待机检测到达 10秒超时后调用进入睡眠流程 系统初始化阶段,配置 `SGM_CTRL`(控制屏和背光供电的引脚)为推挽输出模式,并输出高电平
```c ```c
void Enter_Deep_Sleep(void) { void Power_Init(void) {
// 1. 发送屏幕休眠指令 (Sleep In) // P1.0 (SGM_CTRL) 配置为推挽输出
LCD_WriteCmd(0x10); P1M1 &= ~0x01;
Delay_ms(120); // 必须等待 120ms 供屏幕电容放电 P1M0 |= 0x01;
// 2. 切断 LCD 供电与背光 // 拉高引脚,开启 LCD 背光与电平供电
SGM_CTRL = 0;
// 3. 配置 KEY 端口的中断触发(配置为下降沿触发)
P0IM0 = 0x00; // 下降沿
P0IM1 = 0x00;
P0INTE = 0x3E; // 开启 P0.1(UP), P0.2(SOS1), P0.3(DOWN), P0.4(CONFIRM), P0.5(SOS2) 的端口中断 (0011 1110)
// 4. 调用单片机 PD 指令挂起主时钟
PCON |= 0x02; // PD = 1
_nop_();
_nop_();
}
```
### 2.2 端口中断唤醒与显示重建
当任意按键被按下P0.1~P0.5 电平下降沿跳变触发外部端口中断CPU 被唤醒并从停机处继续执行:
```c
void Port0_Isr(void) interrupt 37 {
u8 int_src = P0INTF;
P0INTF = 0x00; // 清除中断标志位
if (int_src & 0x3E) { // 检查是否是 5 个按键引发的唤醒
// 1. 恢复 LCD 背光与供电
SGM_CTRL = 1; SGM_CTRL = 1;
Delay_ms(20); // 等待供电稳定
// 2. 发送唤醒屏幕指令 (Sleep Out)
LCD_WriteCmd(0x11);
Delay_ms(120);
// 3. 恢复工作状态与屏幕刷新
current_state = STATE_NORMAL;
clock_updated = 1;
}
} }
``` ```
### 2.2 移除睡眠超时与休眠指令
在主循环事件分发中,不再轮询待机时间累加器,也不再调用休眠流程:
* **移除** `Enter_Deep_Sleep` 函数。
* **移除** 端口 P0 的引脚中断设置(`P0INTE` 等)及 `PD` 停机指令。
* 手环时刻保持主频运转Timer 1 中断不断累加,`EV1527_Decode` 全时监听射频,随时处理防区报警和 SOS 求救触发。
<!-- Checked and verified with 7 sensor types and manual suffix selection changes --> <!-- Checked and verified with 7 sensor types and manual suffix selection changes -->
通过中断直接退出 `PD` 模式,恢复手环的常规时钟显示。

View File

@@ -37,4 +37,4 @@ void EV1527_Transmit(u32 addr, u8 data_code) {
* **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id``data_code = 0x01`。 * **绑定对码**:当用户触发对码绑定时,传入 `addr = bracelet_factory_id``data_code = 0x01`。
* **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id``data_code = 0x08`(即二进制 `1000`)。 * **主动 SOS 警报**:当触发主动 SOS 时,主状态机在 `STATE_SOS_EMITTED` 下定期以时间片的形式调用此函数,传入 `addr = bracelet_factory_id``data_code = 0x08`(即二进制 `1000`)。
<!-- Checked and verified with 7 sensor types and manual suffix selection changes --> <!-- Checked and verified with always-on screen and sleep removal changes -->

View File

@@ -74,4 +74,6 @@ void Add_Sensor(u32 addr, u8 type, u8 suffix_idx) {
// ... // ...
Save_Database(); Save_Database();
} }
<!-- Checked and verified with always-on screen and sleep removal changes -->
``` ```

View File

@@ -42,11 +42,12 @@
1. 进入配对时LED 亮白色闪烁3Hz马达短振 1 次确认。 1. 进入配对时LED 亮白色闪烁3Hz马达短振 1 次确认。
2. 解码匹配成功后OLED 屏显示 `✓已保存` 以及 `PIR 02`LED 绿色常亮 2 秒,马达强振 1 次400ms随后自动退回配对菜单。 2. 解码匹配成功后OLED 屏显示 `✓已保存` 以及 `PIR 02`LED 绿色常亮 2 秒,马达强振 1 次400ms随后自动退回配对菜单。
### 3.3 低功耗休眠与按键唤醒 ### 3.3 常亮长显与射频全时监听验证
* **测试方法**:在常态下静置手环 10 秒钟不作任何操作 * **测试方法**:在常态待机下静置手环超过 10 秒,并在此期间使用发射装置发送已配对的传感器射频报警包,或随时短按上部的 SOS 键
* **预期结果** * **预期结果**
1. 10秒后屏幕全黑关闭,且 LED 熄灭,马达不鸣叫(`SGM_CTRL` 拉低为0 1. 手环在静置超过 10 秒后,屏幕背光不关闭,继续常亮展示时钟待机画面
2. 按下任意一个物理按键▲、▼、确认键、SOS1、SOS2屏幕瞬间被点亮并重新恢复时钟待机画面 2. 无线接收解调模块 100% 保持在监听状态,即使在长时间静置后,只要触发匹配的射频报警,手环能立即接收响应,进入报警闪烁及马达震动状态
3. 随时短按 SOS 键能立刻跳转到主动发送界面并开启 EV1527 信号广播。
### 3.4 手环主动发射 SOS 与 Factory ID 验证 ### 3.4 手环主动发射 SOS 与 Factory ID 验证
* **测试方法** * **测试方法**