[APM32F1] 【学习笔记】低功耗实现

[复制链接]
 楼主| 多云转晴 发表于 2022-6-2 16:01 | 显示全部楼层 |阅读模式
芯片的低功耗模式在实际应用十分重要,这几天刚好也使用了STOP的两个模式,做一个简单的笔记和分享。
使用的芯片型号是APM32F103XB.
①搭建整体框架,用于通过程序可以简单地选择不同的低功耗模式。
int Lowpower_Select(uint32_t Num)
{
        //IO口设置为模拟输入
        GPIO_Lowpower_Init();
       
        //关闭总线时钟
        RCM->AHBCLKEN = 0;
        RCM->APB1CLKEN = 0;
        RCM->APB2CLKEN = 0;
       
        //选择想要进入的低功耗模式
        if(Num == 1)
        {
                Lowpower_Stop_Regulator_On_lowpower();
        }
        else if(Num == 2)
        {
                Lowpower_Stop_Regulator_lowpower();
        }
        else
        {
                return 0;
        }
        return 0;
}
②对GPIO的初始化,就是将所有的IO口设置为模拟输入,因为将其设置为模拟输入时,其输出缓冲器被关闭,施密特触发器输入被禁用,因此I/O引脚的每个模拟值零消耗。施密特触发器的输出被强制为恒定值(0)。上拉和下拉电阻被硬件关闭。
void GPIO_Lowpower_Init(void)
{
        //打开所有GPIO的时钟
        RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_GPIOC|RCM_APB2_PERIPH_GPIOD|RCM_APB2_PERIPH_GPIOE|RCM_APB2_PERIPH_GPIOF|RCM_APB2_PERIPH_GPIOG);
       
        //将所有IO口配置为模拟输入
        GPIO_Config_T GPIO_Lowpower_ALL_CHANGE_AIN;
        GPIO_Lowpower_ALL_CHANGE_AIN.mode = GPIO_MODE_ANALOG;
        GPIO_Lowpower_ALL_CHANGE_AIN.pin = GPIO_PIN_ALL;
        GPIO_Lowpower_ALL_CHANGE_AIN.speed = GPIO_SPEED_50MHz;
        GPIO_Config(GPIOA,&GPIO_Lowpower_ALL_CHANGE_AIN);
        GPIO_Config(GPIOB,&GPIO_Lowpower_ALL_CHANGE_AIN);
        GPIO_Config(GPIOC,&GPIO_Lowpower_ALL_CHANGE_AIN);
        GPIO_Config(GPIOD,&GPIO_Lowpower_ALL_CHANGE_AIN);
        GPIO_Config(GPIOE,&GPIO_Lowpower_ALL_CHANGE_AIN);
        GPIO_Config(GPIOF,&GPIO_Lowpower_ALL_CHANGE_AIN);
        GPIO_Config(GPIOG,&GPIO_Lowpower_ALL_CHANGE_AIN);
       
        //关闭所有GPIO的时钟
        RCM_DisableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA|RCM_APB2_PERIPH_GPIOB|RCM_APB2_PERIPH_GPIOC|RCM_APB2_PERIPH_GPIOD|RCM_APB2_PERIPH_GPIOE|RCM_APB2_PERIPH_GPIOF|RCM_APB2_PERIPH_GPIOG);
}
③配置不同的低功耗模式,以stop为例
void Lowpower_Stop_Regulator_On_lowpower(void)
{
        //关闭内部高速时钟和内部低速时钟
        RCM_DisableHSI();
        RCM_DisableLSI();
        //打开PMU的时钟
        RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);
        //清除唤醒标志位
        PMU_ClearStatusFlag(PMU_FLAG_WUE);
        //进入停止模式
        PMU_EnterSTOPMode(PMU_REGULATOR_ON,PMU_STOP_ENTRY_WFI);//PMU_STOP_ENTRY_WFE  可选择中断或者事件
}
void Lowpower_Stop_Regulator_lowpower(void)
{
        //关闭内部高速时钟和内部低速时钟
        RCM_DisableHSI();
        RCM_DisableLSI();
        //打开PMU的时钟
        RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);
        //清除唤醒标志位
        PMU_ClearStatusFlag(PMU_FLAG_WUE);
        //进入停止模式
        PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER,PMU_STOP_ENTRY_WFI);//PMU_STOP_ENTRY_WFE  可选择
}

chenqianqian 发表于 2022-6-7 19:15 来自手机 | 显示全部楼层
低功耗模式下能做到多少uA?
daichaodai 发表于 2022-6-8 08:02 来自手机 | 显示全部楼层
实测低功耗能做到多少?
ulystronglll 发表于 2022-9-7 15:57 | 显示全部楼层
低功耗模式         
digit0 发表于 2022-9-7 16:10 | 显示全部楼层
俩种模式下配置完后功耗分别是多少?
jackcat 发表于 2022-9-7 16:54 | 显示全部楼层
多用低功耗的模式吧  
aspoke 发表于 2022-9-7 17:20 | 显示全部楼层
MCU其实比起外围电路功耗很小
youtome 发表于 2022-9-7 19:12 | 显示全部楼层
间歇式工作方式,如何省电,实现低功耗
Bowclad 发表于 2022-9-7 20:30 | 显示全部楼层
低功耗时多少ua啊?
phoenixwhite 发表于 2022-9-8 08:37 | 显示全部楼层
选用低功耗的MCU和将MCU空闲时设置到睡眠状态
louliana 发表于 2022-9-8 10:08 | 显示全部楼层
低功耗设计方法有哪些
updownq 发表于 2022-9-8 12:53 | 显示全部楼层
低功耗方式如何实现?  
htmlme 发表于 2022-9-8 13:45 | 显示全部楼层
实现低功耗mcu是休眠还是断电
jonas222 发表于 2022-9-8 14:38 | 显示全部楼层
掉电运行方式没有什么好说的  
timfordlare 发表于 2022-9-8 15:28 | 显示全部楼层
主要用MCU来将外围电路的功耗降下来。
Stahan 发表于 2022-10-4 20:26 | 显示全部楼层
低功耗模式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部