英飞凌
直播中

李继明

8年用户 1155经验值
私信 关注

求助,关于PSoC6在CM0+中用于进入休眠和深度休眠的函数的问题

我有一个关于 PSoC6 在 CM0+ 中用于进入休眠和深度休眠的函数的问题。 应用程序接口

Cy_SysPm_CpuEnterSleep(CY_SYSPM_WAIT_FOR_EVENT);


Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_EVENT);

这两个应用程序接口应将 CM0+ 置于 WFE 中。 根据 PSoC6 文档:
" 执行 WFI 指令时,CPU 进入休眠或深度休眠状态(取决于 SCR 寄存器的 SLEEPDEEP 位),并在中断请求(优先级高于当前优先级)或调试请求时唤醒。 WFE 指令与 WFI 类似,但会在下一次中断或发送事件(SEV 指令)、外部事件或调试信号等事件发生时唤醒。"

不过,在使用 CY_SYSPM_WAIT_FOR_EVENT 测试该 API 时,我只能使用 SEV 指令唤醒 CM0+。 无论优先级如何,任何触发的中断都不能将 CPU 从睡眠状态唤醒。

深入研究 ARM 文档后,我发现在调用 Cy_SysPm_CpuEnterSleep() 之前,如果设置了系统控制寄存器中的 SEVONPEND 位,就可以使用中断将 CPU 从 WFE 唤醒。

我的问题是:
- 在调用 Cy_SysPm_CpuEnterSleep() 之前手动设置该位是否是正确的使用方法?
- 为什么英飞凌的文档从未在任何地方提到过这些信息?

                                                                                                                                                                                                                                                                                                                                                                                                        
                                                        


回帖(1)

小镇故事多

2024-7-5 17:21:27
在PSoC 6中,CM0+内核提供了两种低功耗模式:休眠(Sleep)和深度休眠(Deep Sleep)。这两种模式可以通过Cy_SysPm_CpuEnterSleep()和Cy_SysPm_CpuEnterDeepSleep()函数来实现。这两个函数分别将CM0+内核置于WFE(Wait For Event)和WFI(Wait For Interrupt)指令。

首先,我们来了解一下这两个函数的参数:

1. Cy_SysPm_CpuEnterSleep(CY_SYSPM_WAIT_FOR_EVENT):这个函数将CPU置于休眠状态。当使用CY_SYSPM_WAIT_FOR_EVENT作为参数时,CPU将等待一个事件(如中断、SEV指令、外部事件或调试信号)来唤醒。

2. Cy_SysPm_CpuEnterDeepSleep(CY_SYSPM_WAIT_FOR_EVENT):这个函数将CPU置于深度休眠状态。与休眠状态类似,CPU将等待一个事件来唤醒。但是,深度休眠状态下的功耗更低。

根据PSoC 6文档,WFE和WFI指令的主要区别在于唤醒条件。WFI指令在中断请求(优先级高于当前优先级)或调试请求时唤醒,而WFE指令在下一次中断或发送事件(SEV指令)、外部事件或调试信号等事件发生时唤醒。

在使用这些函数时,需要注意以下几点:

1. 在调用这些函数之前,确保已经配置了中断和事件,以便CPU可以在适当的条件下唤醒。

2. 在休眠或深度休眠状态下,CPU的时钟和电源管理将受到影响。因此,在进入这些模式之前,确保已经正确配置了时钟和电源管理。

3. 在唤醒后,可能需要重新配置某些硬件或软件资源,以确保系统正常运行。

4. 如果需要在特定条件下唤醒CPU,可以使用SEV(Send Event)指令来触发事件,从而唤醒CPU。

5. 在使用深度休眠模式时,请注意,某些外设可能无法在深度休眠状态下工作。因此,在进入深度休眠模式之前,确保已经正确配置了外设。

总之,PSoC 6的CM0+内核提供了休眠和深度休眠模式,可以通过Cy_SysPm_CpuEnterSleep()和Cy_SysPm_CpuEnterDeepSleep()函数来实现。在使用这些函数时,需要注意配置中断、事件、时钟和电源管理,以确保系统在低功耗状态下正常运行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分