Files
stc32g128k/Docs/60_coding/mod-power.md

1.7 KiB
Raw Blame History

编码实现 - 低功耗电源管理 (docs/60_coding/mod-power.md)

本文件对应低功耗待机与外部中断唤醒的具体编码实现细节。

1. 对应代码源文件

  • App/main.c (休眠控制、外部中断初始化与服务函数)

2. 关键代码片段与逻辑实现

2.1 屏幕休眠命令与供电切断

在待机检测到达 10 秒超时后,调用进入睡眠流程:

void Enter_Deep_Sleep(void) {
    // 1. 发送屏幕休眠指令 (Sleep In)
    LCD_WriteCmd(0x10); 
    Delay_ms(120); // 必须等待 120ms 供屏幕电容放电
    
    // 2. 切断 SGM3833 正负高压供电,阻断 VELVDD 的泄露电流
    SGM_CTRL = 0; 
    
    // 3. 配置 KEY 端口的中断触发(配置为下降沿触发)
    P0IM0 = 0x00; // 下降沿
    P0IM1 = 0x00;
    P0INTE = 0x0E; // 开启 P0.1, P0.2, P0.3 的端口中断
    
    // 4. 调用单片机 PD 指令挂起主时钟
    PCON |= 0x02; // PD = 1
    _nop_();
    _nop_();
}

2.2 端口中断唤醒与显示重建

当按键被按下P0.1~P0.3 电平跳变触发外部端口中断CPU 被唤醒并从停机处继续执行:

void Port0_Isr(void) interrupt 37 {
    u8 int_src = P0INTF;
    P0INTF = 0x00; // 清除中断标志位
    
    if (int_src & 0x0E) {
        // 1. 恢复 SGM3833 供电
        SGM_CTRL = 1;
        Delay_ms(20); // 等待供电稳定
        
        // 2. 发送唤醒屏幕指令 (Sleep Out)
        LCD_WriteCmd(0x11);
        Delay_ms(120);
        
        // 3. 恢复工作状态与屏幕刷新
        current_state = STATE_NORMAL;
        clock_updated = 1;
    }
}

通过中断直接退出 PD 模式,恢复手环的常规时钟显示。