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; // 未检测到长按 }
仅是个人学习分享;如有任何错漏敬请留言指正。
如有侵权,请留言删除。