ch571/573 Peripheral例程电池供电,如何睡眠?

项目需要电池供电,没有拨码开关,只有一个按键,长按关机,长按开机

如何做到关机睡眠,电流最小?还要做到长按唤醒?

下电模式是不是程序已经停止了运行?谢谢

您好,需要判断“按键长按”,sleep/shutdown休眠都可以用;在这两种模式的休眠期间都是32M晶振停振的,跑不了代码,需要唤醒后MCU才能运行代码;两者的区别是:sleep休眠,唤醒后继续运行,而shutdown休眠唤醒后需要复位。
在BLE例程中,启用HAL_SLEEP宏是配置为sleep休眠,默认没有TMOS事务就会自动进入sleep休眠,用户只需要安排何时执行事件即可。

sleep休眠“判断长按”,可以在中断唤醒后立即关闭GPIO中断使能,出中断后运行TMOS事件读IO电平状态,检查按键是否已释放来判断是否长按。

shutdown休眠“判断长按”,可以在按下按键后,MCU复位重新初始化时,判断按键是否已经按下,用TMOS事件判断长按。

功耗见下图
image.png


我在长按事件发生后,执行



? ? /* 配置唤醒源为 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,执行下电模式后,单击按键(松开是高电平,按下是低电平),发现程序没有复位,代码没再次从头开始执行,

是什么问题呢?



加了清除中断,出现编译问题


image.png


休眠异常的问题,见另一则帖子ch573 PM睡眠与唤醒例程问题 - 沁恒微电子社区 (wch.cn)

清中断/查询中断接口中,填入PB22编译的警告可以无视,不影响功能。


只有登录才能回复,可以选择微信账号登录