[原创] 读《RT-Thread设备驱动开发指南》--- 第五篇

xiaolinen   2023-9-28 15:29 楼主

读《RT-Thread设备驱动开发指南》---  PM设备驱动的学习

第一部分:认识PM组件

        PM组件采用分层的设计理念,分离架构和芯片相关的部分,提取公共部分作为核心,既保证应用层调用的接口统一性,又实现底层驱动适配的灵活性。框架结构图如下:

PM.jpg

        个人拙见:

                1)PM组件是一个管理框架,我们应该根据实际情况使用,并不是梏桎,要求用上rt-thread就一定要用PM组件;

                2)既然是一个框架,就需要我们进行适配,根据应用层的业务需求,进行修改和验证,从而实现功耗最优

                3)PM组件框架不仅仅适用于rt-thred,同样可以移植到其他的rtos上去。

第二部分:使用PM组件

        在ENV工具中,开启PM组件,如图:

1.jpg
        文件存放位置:
2.png

 

第三部分:部分代码和实验现象
        代码:
/*
功能:深度睡眠
*/
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 编辑

回复评论 (4)

都没太关注这个PM电源管理组件,它会在MCU不工作的时候进入休眠吗?

点赞  2023-9-28 17:07
引用: wangerxian 发表于 2023-9-28 17:07 都没太关注这个PM电源管理组件,它会在MCU不工作的时候进入休眠吗?

是的,在MCU需要的情况下,使MCU休眠

点赞  2023-9-28 17:22
引用: xiaolinen 发表于 2023-9-28 17:22 是的,在MCU需要的情况下,使MCU休眠

应该是标准版RTThread的才有这个组件吧?

点赞  2023-9-30 09:21
引用: wangerxian 发表于 2023-9-30 09:21 应该是标准版RTThread的才有这个组件吧?

是的

点赞  2023-10-1 22:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复