读《RT-Thread设备驱动开发指南》--- PM设备驱动的学习
第一部分:认识PM组件
PM组件采用分层的设计理念,分离架构和芯片相关的部分,提取公共部分作为核心,既保证应用层调用的接口统一性,又实现底层驱动适配的灵活性。框架结构图如下:
个人拙见:
1)PM组件是一个管理框架,我们应该根据实际情况使用,并不是梏桎,要求用上rt-thread就一定要用PM组件;
2)既然是一个框架,就需要我们进行适配,根据应用层的业务需求,进行修改和验证,从而实现功耗最优。
3)PM组件框架不仅仅适用于rt-thred,同样可以移植到其他的rtos上去。
第二部分:使用PM组件
在ENV工具中,开启PM组件,如图:
/*
功能:深度睡眠
*/
void pm_bsp_enter_deepsleep(struct rt_pm *pm)
{
HAL_SysTickDisable();
if (pm->run_mode == PM_RUN_MODE_LOW_SPEED)
{
/* Enter LP SLEEP Mode, Enable low-power regulator */
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
}
else
{
/* Enter SLEEP Mode, Main regulator is ON */
pmu_to_deepsleepmode(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
}
HAL_SysTickEnable();
}
/*
功能:深度睡眠1
*/
void pm_bsp_enter_deepsleep_1(struct rt_pm *pm)
{
HAL_SysTick_IRQ_Disable();
if (pm->run_mode == PM_RUN_MODE_LOW_SPEED)
{
/* Enter LP SLEEP Mode, Enable low-power regulator */
pmu_to_deepsleepmode_1(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
}
else
{
/* Enter SLEEP Mode, Main regulator is ON */
pmu_to_deepsleepmode_1(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
}
HAL_SysTick_IRQ_Enable();
}
/*
功能:深度睡眠2
*/
void pm_bsp_enter_deepsleep_2(struct rt_pm *pm)
{
rt_base_t level;
//level = rt_hw_interrupt_disable();
HAL_SysTick_IRQ_Disable();
if (pm->run_mode == PM_RUN_MODE_LOW_SPEED)
{
/* Enter LP SLEEP Mode, Enable low-power regulator */
pmu_to_deepsleepmode_2(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
}
else
{
/* Enter SLEEP Mode, Main regulator is ON */
pmu_to_deepsleepmode_2(PMU_LDO_LOWPOWER,PMU_LOWDRIVER_ENABLE,WFI_CMD);
}
//system_lowpower_set(SCB_LPM_DEEPSLEEP);
HAL_SysTick_IRQ_Enable();
// rt_hw_interrupt_enable(level);
}
/*
功能:待机模式
*/
void pm_bsp_enter_standby(struct rt_pm *pm)
{
pmu_to_standbymode(WFI_CMD);
}
实现现象:
设备正常运行工作状态:165mA;
设备休眠状态(外接传感器掉电操作):27uA;
总结:
调设备功耗是一个技术活,又是一个体力活,调功耗必然会遇到各种各样的问题,坐的住,耐下心来认真干,问题才会越来越少,切记不要一会儿心态崩了,一会儿心态又崩了,心态再崩多少次也没用,毕竟活是你的,你需要干完!!!现在呢,有了PM框架,不能说完全解决了我们的问题,但是至少为我们指明了部分解决方向;个人认为:rt-thread的精髓不仅仅在于它的系统,更多的还是它的组件,这些组件提供便利的同时,也向我们展示着一种编程思想。RT-Thread是一个优美的产品,值得我们去深入学习和充分应用。
本帖最后由 xiaolinen 于 2023-9-28 15:28 编辑
都没太关注这个PM电源管理组件,它会在MCU不工作的时候进入休眠吗?
引用: wangerxian 发表于 2023-9-28 17:07 都没太关注这个PM电源管理组件,它会在MCU不工作的时候进入休眠吗?
是的,在MCU需要的情况下,使MCU休眠
引用: xiaolinen 发表于 2023-9-28 17:22 是的,在MCU需要的情况下,使MCU休眠
应该是标准版RTThread的才有这个组件吧?
引用: wangerxian 发表于 2023-9-30 09:21 应该是标准版RTThread的才有这个组件吧?
是的