stm32l051低功耗之stop模式

STM32L051算是一款使用的人不多的低功耗芯片,资料也没有像F系列那么多,但是它在低功耗方面性能优异。ST官方关于STM32L051停机模式低功耗给的指标如下,在stop without rtc模式下电流消耗能达到0.4ua,在stop with rtc模式下电流消耗能达到0.8ua。 

  在进入停机模式之前,按照ST官方例程,首先对引脚进行配置,设置成模拟输入状态。

void stop_mode_config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  __HAL_RCC_PWR_CLK_ENABLE();
  HAL_PWREx_EnableUltraLowPower();
  HAL_PWREx_EnableFastWakeUp();
  __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_MSI);
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();    
  GPIO_InitStructure.Pin = GPIO_PIN_All;
  GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStructure.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); 
  HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOC, &GPIO_InitStructure);
  HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
  __HAL_RCC_GPIOA_CLK_DISABLE();
  __HAL_RCC_GPIOB_CLK_DISABLE();
  __HAL_RCC_GPIOC_CLK_DISABLE();
  __HAL_RCC_GPIOD_CLK_DISABLE();
}


配置外部中断,进入停止模式,等待唤醒

void valve_enter_ed_stop_mode(void)
{
  //config main key with interrupt
  bsp_init_main_key(BUTTON_MODE_EXTI);    
  //enter STOP without RTC
  __HAL_RCC_PWR_CLK_ENABLE();  
  HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}


单片机供电3.3V,测试功耗,为0.42ua,基本与官方指标一致。

 当然在做低功耗开发时,CPU的低功耗特性只是做低功耗产品的开发的一部分,外围器件的功耗同样起决定作用。要想达到理想的功耗,CPU和外围器件必须能够完美的结合。很多情况下CPU在没有外部器件的情况下功耗是理想的,基本上与数据手册描述的一样,所选的外围器件的功耗也很低,但是CPU与外围器件连起来时就需要另加考虑。

     外部器件能用IO口供电的就尽量用IO口供电,在stop模式下,CPU的IO口的状态是保持的,这样外围器件的供电开关很容易控制。像外部存储芯片可以用IO口供电。有些外围芯片不适合用IO口供电的,像有些射频芯片,因为这些射频芯片上电启动要相当长的时间。

     如果CPU外围有器件连接,且没有用IO供电,一定要将CPU与器件相连的IO口设置成适当的模式,否则这些引脚可能会吸收很大的电流。
————————————————
————————————————

退出停止模式后,内部高速时钟(HSI)默认变成了系统时钟源,造成时钟紊乱。

【其实不仅仅是串口,其他在进入停止模式之前的外设在退出停止模式之后都会工作不正常,重新配置系统时钟即可】

1.根据设备原理图查看IO外部引脚连接电路,闲置状态为低电平时,设置为下拉输入;闲置状态为高电平时,设置为上拉输入;闲置状态为悬空时设置为模拟输入;输出引脚根据功能需要设置就行

原因:当IO通过外围电路电阻接地被拉低时,如果设置为上拉输入,则在芯片内部的上拉电阻和外围的下拉电阻构成回路,电流损耗取决于这两个电阻;当IO通过外围电路电阻接电源被拉高时,则在芯片内部的下拉电阻和外围的上拉电阻构成回路,电流损耗也取决于这两个电阻;当悬空时,斯密特触发器是打开的,要判断输入的是高电平还是低电平,需要一点电流损耗,但是设备模拟输入,这个触发器是关闭的

2.排查外围电路,某些驱动、电源转换IC如果是由软件使能,如果进入停止模式之后不需要则关闭,因为本身就有工作电流;如果是由硬件使能,则需要查看芯片手册看静态工作电流是多少,如果比较高,只能修改硬件电路或者用低耗ic代替

3.外围是否有一些闭合回路,比如电压采集,虽然ADC已经关闭,但是这个分压电路还是有损耗的,大小一般取决于电阻和电源电压

4.另外如果在线调试时,进入停止模式后,调试失去作用,看看是不是SWDIO、SWCLK两个引脚也直接设置成了模拟输入,还关闭了调试功能:GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

停止模式唤醒之后,需要重新初始化系统时钟.
————————————————

static void enter_stop_mode(void)
{
    //1. 配置stop之前各外设
    system_config_before_stop();

    //2.设置唤醒中断
    stop_exit_config();

    //3. 进入stop
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

    //3.退出stop后恢复各外设
    clock_config_after_stop();

    //4.恢复各外设
    gpioInit();
    uart1Init(115200);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值