本帖最后由 YangTwo 于 2024-7-21 11:56 编辑
本次实验将涉及如何进入深度睡眠和休眠模式,并使用RTC警报唤醒。将MCU从深度睡眠和休眠模式唤醒。
软硬件环境:
- ModusToolbox™ v3.1 or later (tested with v3.1)
- Board support package (BSP) minimum required version for:
- CYW920829M2EVK-02: v1.0.1
- Programming language: C
- Associated parts: All PSoC™ 6 MCU parts, AIROC™ CYW20829 Bluetooth® LE SoC and AIROC™ CYW89829 Bluetooth® LE SoC
主循环检查用户按钮是否被按下以及按了多长时间。
如果短按(小于2秒),设置RTC报警,然后进入深度睡眠模式;10秒后产生RTC报警中断,然后通过UART打印DeepSleep唤醒信息。
若长按该按钮(大于2秒),设置RTC报警,将设备从休眠模式唤醒的源配置为RTC报警,系统进入休眠模式;RTC告警在10秒后产生,导致MCU复位。主程序在cyhal_system_get_reset_reason()函数的帮助下检查重置的原因是否为Hibernate唤醒。如果重置的原因是Hibernate唤醒,那么通过UART打印Hibernate唤醒信息。
顺便提一下,在CPU Active功率模式下,看门狗计数器有能力向CPU发出中断请求。在CPU休眠和深度睡眠电源模式下,它可以向唤醒中断控制器(WIC)发送中断请求。
- 活动模式(Active Mode):在此模式下,WDT能够向CPU发送中断,CPU接收中断请求并继续执行中断服务程序(ISR)。ISR负责清除中断
- 休眠或深度休眠模式:来自WDT的中断请求直接发送到WIC。WIC负责唤醒CPU。一旦CPU确认了中断请求,它就继续执行执行ISR。ISR固件负责在其操作中清除中断
- Hibernate模式:很少有外设(如WDT)保持活动状态。任何旨在唤醒的中断设备在此模式下将导致设备复位。没有特定的中断服务程序或与此特定模式相关的机制
实物测试:
烧录程序后,短按SW2进入DeepSleep模式:
10s钟后,退出低功耗模式。
长按SW2进入Hibernate模式。
10s钟后,退出低功耗模式。
在代码层面,可以通过调用如下API来分别进入DeepSleep模式和Hibernate模式。
/* Go to deep sleep */
cyhal_syspm_deepsleep();
/*Go to hibernate and configure the RTC alarm as wakeup source*/
cyhal_syspm_hibernate(CYHAL_SYSPM_HIBERNATE_RTC_ALARM);
进而调用:
cy_rslt_t cyhal_syspm_deepsleep(void)
{
if(_cyhal_deep_sleep_lock != 0)
{
return CYHAL_SYSPM_RSLT_DEEPSLEEP_LOCKED;
}
return _cyhal_syspm_deepsleep_internal();
}
static cy_rslt_t _cyhal_syspm_deepsleep_internal(void)
{
#if defined(COMPONENT_CAT1A) || defined(COMPONENT_CAT1B) || defined(COMPONENT_CAT1C) || defined(COMPONENT_CAT1D)
return Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
#elif defined(COMPONENT_CAT2)
return Cy_SysPm_CpuEnterDeepSleep();
#endif
}
我们这款cyw28029非常适合蓝牙低功耗领域的应用,而且有多种功耗模式可供用户选择,给设计开发提供了非常大的帮助。
|