CH58x/CH59x实现长按键睡眠短按键唤醒

前言:在做产品应用的时候有时可能需要实现长按按键使设备“关机”的功能超长待机,短按实现“开机”唤醒功能。

本次演示使用的是CH585M。

演示示例程序中的"关机"使用的是shutdown模式。shutdown模式可以做到超低功耗。

 上表中的电流范围0.65ua-5.5ua,造成在这个范围内波动的原因是32K,ram保持供电有关系。

例如程序中写了PB22为唤醒源,另外配置了PB5中断,这时候可能会出现Shutdown模式下PB5将芯片唤醒的情况。

此时可以在进入掉电模式之前关闭对应的IO的中断功能。

R16_PB_INT_EN &= ~GPIO_Pin_5;

配置PB22作为中断的IO的时候需要将PB8的中断功能映射过来。

 GPIOPinRemap(ENABLE, RB_PIN_INTX);

代码实现

// 延时函数,用于消抖和长按检测
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 120; j++);
}

// 检测按键是否被长按
int key_long_press(void) {
    unsigned int press_time = 0; // 记录按键按下的时间

    // 检测按键是否被按下
    while (GPIOB_ReadPortPin(KEY_PIN) == 0) { // 假设低电平为按下
        delay_ms(1); // 简单的延时,用于轮询检测
        press_time++; // 增加计时

        // 检查是否达到长按时间
        if (press_time >= LONG_PRESS_TIME) {
            while (GPIOB_ReadPortPin(KEY_PIN) == 0); // 等待按键释放
            PRINT("shut down mode sleep \n");
          //  DelayMs(2);

            GPIOPinRemap(ENABLE, RB_PIN_INTX);
            GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU);
            GPIOB_ITModeCfg(GPIO_Pin_22, GPIO_ITMode_FallEdge); // 下降沿唤醒
            R16_PB_INT_EN &= ~GPIO_Pin_5;
            PFIC_EnableIRQ(GPIO_B_IRQn);
            PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay);

            LowPower_Shutdown(0); //全部断电,唤醒后复位
            return 1; // 返回长按事件
        }
    }
    return 0; // 未检测到长按
}

 仅是个人学习分享;如有任何错漏敬请留言指正。

如有侵权,请留言删除。

posted @ 2024-12-04 13:49  小舟从此逝_1  阅读(15)  评论(0编辑  收藏  举报