docs: optimize SOS button behavior, add 2-step pairing wizard, and IPC exit action
This commit is contained in:
@@ -1,30 +1,78 @@
|
||||
# 编码实现 - 电源管理与常亮控制 (Docs/60_coding/mod-power.md)
|
||||
# 编码实现 - 电源管理与休眠唤醒 (Docs/60_coding/mod-power.md)
|
||||
|
||||
本文件对应取消低功耗休眠、保持屏幕常亮及系统全时监测的具体编码实现。
|
||||
本文件对应低功耗休眠、关屏切断 PMIC 以及外部中断唤醒的具体编码实现。
|
||||
|
||||
## 1. 对应代码源文件
|
||||
|
||||
* [App/main.c](file:///c:/workfile/105/stc32g12k128/App/main.c) (初始化供电配置)
|
||||
* [App/main.c](file:///c:/workfile/105/stc32g12k128/App/main.c) (定义电源控制引脚使能、超时判断及进入 Power-Down 和中断唤醒的实现)
|
||||
|
||||
## 2. 关键代码片段与逻辑实现
|
||||
|
||||
### 2.1 供电引脚常使能
|
||||
在系统初始化阶段,配置 `LCD_PWR_CTRL`(控制屏和背光供电的引脚)为推挽输出模式,并输出高电平:
|
||||
### 2.1 供电引脚初始化
|
||||
系统初始化时,配置 `SGM_CTRL`(控制 SGM3833 供电的引脚 `P3.4`)为推挽输出,并拉高使能:
|
||||
```c
|
||||
sbit SGM_CTRL = P3^4;
|
||||
|
||||
void Power_Init(void) {
|
||||
// P3.4 (LCD_PWR_CTRL) 配置为推挽输出
|
||||
// P3.4 (SGM_CTRL) 配置为推挽输出
|
||||
P3M1 &= ~(1 << 4);
|
||||
P3M0 |= (1 << 4);
|
||||
|
||||
// 拉高引脚,开启 LCD 背光与供电使能
|
||||
LCD_PWR_CTRL = 1;
|
||||
// 拉高引脚,开启 SGM3833 负压供电
|
||||
SGM_CTRL = 1;
|
||||
}
|
||||
```
|
||||
|
||||
### 2.2 移除睡眠超时与休眠指令
|
||||
在主循环事件分发中,不再轮询待机时间累加器,也不再调用休眠流程:
|
||||
* **移除** `Enter_Deep_Sleep` 函数。
|
||||
* **移除** 端口 P0 的引脚中断设置(`P0INTE` 等)及 `PD` 停机指令。
|
||||
* 手环时刻保持主频运转,Timer 1 中断不断累加,`EV1527_Decode` 全时监听射频,随时处理防区报警 and SOS 求救触发。
|
||||
### 2.2 进入低功耗睡眠 (Enter_Low_Power_Sleep)
|
||||
在 10 秒无按键操作发生后,关闭屏幕显示,断电,配置中断,并进入 Power-Down 挂起状态:
|
||||
```c
|
||||
void Enter_Low_Power_Sleep(void) {
|
||||
// 1. 给 AMOLED 发送 Sleep In 命令
|
||||
LCD_WriteCmd(0x10);
|
||||
|
||||
// 2. 切断 SGM3833 电源,停止输出负压
|
||||
SGM_CTRL = 0;
|
||||
|
||||
// 3. 配置引脚中断 (以 P0.4 确认键、P0.2/P0.5 SOS键为例)
|
||||
// 允许 P0 口引脚下降沿中断以供按键唤醒
|
||||
P0IM1 &= ~0x36; // P0.1, P0.2, P0.3, P0.4, P0.5 设为下降沿或电平触发
|
||||
P0IM0 &= ~0x36;
|
||||
P0INTE |= 0x36; // 开启中断使能
|
||||
|
||||
// 4. 配置射频 carrier 接收脚 (如 P3.6) 为外部中断唤醒
|
||||
EX2 = 1; // 使能外部中断2
|
||||
|
||||
// 5. 写入 PCON.1 使单片机进入 Power-Down 深度睡眠状态
|
||||
PCON |= 0x02; // MCU 挂起,主时钟停振,直到外部中断唤醒
|
||||
_nop_();
|
||||
_nop_();
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Checked and verified with always-on screen and sleep removal changes -->
|
||||
### 2.3 中断唤醒与恢复 (Wakeup_Restore)
|
||||
当产生按键或射频中断后,单片机被唤醒,首先执行外部中断 ISR,退出低功耗并重新使能 OLED:
|
||||
```c
|
||||
// 外部中断服务子程序 (以按键 P0 端口中断为例)
|
||||
void Port0_Isr(void) interrupt 37 {
|
||||
P0INTF = 0x00; // 清除 P0 中断标志
|
||||
Wakeup_Restore();
|
||||
}
|
||||
|
||||
void Wakeup_Restore(void) {
|
||||
if (SGM_CTRL == 1) return; // 已经在工作状态,直接返回
|
||||
|
||||
// 1. 拉高 SGM_CTRL 重新使能 SGM3833 供电
|
||||
SGM_CTRL = 1;
|
||||
|
||||
// 2. 延时约 50ms 等待升压/负压输出稳定
|
||||
Delay50ms();
|
||||
|
||||
// 3. 重新对 RM69310 屏幕控制器做初始化序列
|
||||
LCD_Init();
|
||||
|
||||
// 4. 重置无按键操作的超时计时器
|
||||
inactivity_timer = 0;
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Checked and verified with SGM3833 boost/inverting PMIC removal and LCD_PWR_CTRL update changes V2 -->
|
||||
|
||||
Reference in New Issue
Block a user