项目需要电池供电,没有拨码开关,只有一个按键,长按关机,长按开机
如何做到关机睡眠,电流最小?还要做到长按唤醒?
下电模式是不是程序已经停止了运行?谢谢
项目需要电池供电,没有拨码开关,只有一个按键,长按关机,长按开机
如何做到关机睡眠,电流最小?还要做到长按唤醒?
下电模式是不是程序已经停止了运行?谢谢
您好,需要判断“按键长按”,sleep/shutdown休眠都可以用;在这两种模式的休眠期间都是32M晶振停振的,跑不了代码,需要唤醒后MCU才能运行代码;两者的区别是:sleep休眠,唤醒后继续运行,而shutdown休眠唤醒后需要复位。
在BLE例程中,启用HAL_SLEEP宏是配置为sleep休眠,默认没有TMOS事务就会自动进入sleep休眠,用户只需要安排何时执行事件即可。
sleep休眠“判断长按”,可以在中断唤醒后立即关闭GPIO中断使能,出中断后运行TMOS事件读IO电平状态,检查按键是否已释放来判断是否长按。
shutdown休眠“判断长按”,可以在按下按键后,MCU复位重新初始化时,判断按键是否已经按下,用TMOS事件判断长按。
功耗见下图
我在长按事件发生后,执行
? ? /* 配置唤醒源为 GPIO - PB22 */
? ? GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU);
? ? GPIOB_ITModeCfg(GPIO_Pin_22, GPIO_ITMode_FallEdge); // 下降沿唤醒
? ? PFIC_EnableIRQ(GPIO_B_IRQn);
? ? PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Edge_LongDelay);
? ? PRINT("shut down mode sleep \n");
? ? DelayMs(2);
? ? LowPower_Shutdown(0); //全部断电,唤醒后复位
? ? /*
? ? ?此模式唤醒后会执行复位,所以下面代码不会运行,
? ? ?注意要确保系统睡下去再唤醒才是唤醒复位,否则有可能变成IDLE等级唤醒
? ? ?*/
? ? HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
? ? PRINT("wake.. \n");
? ? DelayMs(500);
PB22为唤醒IO,执行下电模式后,单击按键(松开是高电平,按下是低电平),发现程序没有复位,代码没再次从头开始执行,
是什么问题呢?
加了清除中断,出现编译问题
休眠异常的问题,见另一则帖子ch573 PM睡眠与唤醒例程问题 - 沁恒微电子社区 (wch.cn)
清中断/查询中断接口中,填入PB22编译的警告可以无视,不影响功能。