STM32L0低功耗设计5: STOP_RTC模式的真实功耗

发布者:机械梦想家最新更新时间:2018-09-10 来源: eefocus关键字:STM32L0  低功耗设计  RTC模式  真实功耗 手机看文章 扫描二维码
随时随地手机看文章

    本例程测试STOP_RTC模式的真实功耗,主程序如下:


int main(void)

{

while(1)

{

    HAL_Delay(5000);

Target.HAL.Rtc.EnterStopRtcMode();

Target.HAL.SystemClock.SetMode(2);

  }

}

    系统进入主循环后,先进行5秒延时,然后进入低功耗模式,低功耗模式设置的RTC时间为4秒,4秒过后退出低功耗模式,重新进行时钟设置。


    在进入main函数之前,执行了3个操作:时钟设置、低功耗设置和RTC设置,如下面程序:


class CHAL

{

public:

CSystemClock SystemClock;

CSystemLowPower SystemLowPower;

CRtc Rtc;

};

    时钟设置相关程序如下:


void CClock::SetMode(uint8_t mode)

{

RCC_OscInitTypeDef RCC_OscInitStruct;

RCC_ClkInitTypeDef RCC_ClkInitStruct;

RCC_PeriphCLKInitTypeDef PeriphClkInit;

__HAL_RCC_PWR_CLK_ENABLE();

if (mode  == 0)

{

//Configure the main internal regulator output voltage 

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 

//Initializes the CPU, AHB and APB busses clocks 

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;

RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

//Initializes the CPU, AHB and APB busses clocks 

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

//Configure the Systick interrupt time 

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 

//Configure the Systick 

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

//SysTick_IRQn interrupt configuration

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

else if (mode  == 1)

{

//Configure the main internal regulator output voltage 

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 

//Initializes the CPU, AHB and APB busses clocks 

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;

RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

//Initializes the CPU, AHB and APB busses clocks 

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

 

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2

|RCC_PERIPHCLK_USB;

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

//Configure the Systick interrupt time 

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 

//Configure the Systick 

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

//SysTick_IRQn interrupt configuration

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

else if (mode == 2)

{

//Configure the main internal regulator output voltage 

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 

//Initializes the CPU, AHB and APB busses clocks 

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.LSIState = RCC_LSI_ON;

RCC_OscInitStruct.HSIState = RCC_HSI_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_8;

RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;

RCC_OscInitStruct.HSICalibrationValue = 0x10; //HSIÐÞÕýÖµ

if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

//Initializes the CPU, AHB and APB busses clocks 

RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_RTC;

PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;

PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;

PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

 

//Configure the Systick interrupt time 

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

 

//Configure the Systick 

HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

 

//SysTick_IRQn interrupt configuration

HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

}

}

    低功耗设置相关程序如下:


CLowPower::CLowPower(uint8_t mode)

{

if (mode == 1)

{

GPIO_InitTypeDef GPIO_InitStructure;

HAL_PWREx_EnableUltraLowPower(); //ʹÄܳ¬µÍ¹¦ºÄ

    HAL_PWREx_EnableFastWakeUp(); //ʹÄÜ¿ìËÙ»½ÐÑ

__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); //½«HSIʱÖÓ×÷Ϊ»½ÐѺóµÄÖ÷ʱÖÓ

//½«ËùÓÐÒý½Å¶¼ÅäÖÃΪģÄâÊäÈëģʽ

    __HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOC_CLK_ENABLE();

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOH_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_GPIO_Init(GPIOH, &GPIO_InitStructure);

__HAL_RCC_GPIOA_CLK_DISABLE();

__HAL_RCC_GPIOB_CLK_DISABLE();

__HAL_RCC_GPIOC_CLK_DISABLE();

__HAL_RCC_GPIOD_CLK_DISABLE();

__HAL_RCC_GPIOH_CLK_DISABLE();

}

}

    RTC设置相关程序如下:


CRtc::CRtc(void)

{

  this->hRTC.Instance = RTC;

pRTC = &this->hRTC;

this->hRTC.Init.HourFormat = RTC_HOURFORMAT_24;

this->hRTC.Init.AsynchPrediv = 124;

this->hRTC.Init.SynchPrediv = 295;

this->hRTC.Init.OutPut = RTC_OUTPUT_DISABLE;

this->hRTC.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; //²»½øÐÐÊä³öÒý½ÅÖØÓ³Éä

this->hRTC.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

this->hRTC.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

if (HAL_RTC_Init(&this->hRTC) != HAL_OK)

{

Target.ErrorHandler(__FILE__, __LINE__);

}

}

    程序运行后,5秒为正常功耗,4秒为低功耗,测得实际功耗2.4uA,手册中指出的STOP_RTC模式为1uA,产生差错的原因在《STM32L0低功耗设计3: Stop模式下的真实功耗》中已经介绍过,2.4uA已经能够满足项目本身的设计了,还算不错。


关键字:STM32L0  低功耗设计  RTC模式  真实功耗 引用地址:STM32L0低功耗设计5: STOP_RTC模式的真实功耗

上一篇:STM32L031低功耗深度睡眠RTC唤醒注意事项
下一篇:在STM32F中使用UCOSII如何支持低功耗模式

推荐阅读最新更新时间:2024-03-16 16:13

零翻转编码地址总线SoC的低功耗设计
引言 面向便携式设备的SoC设计,不仅仅要求性能高、体积小,更要求功耗低。一般而言,SoC的静态功耗很小,而对负载电容充放电的动态功耗很大。 SoC内部,总线上挂着很多功能设备,导致总线的电容负载很大。如果总线与片外设备联系,那么,它还要驱动很长的片外连线以及片外设备,负载高达50pF,比SoC内部各个节点的电容负载0.05pF高出三个量级。一般而言,总线的功耗占SoC总功耗的10%~80%;一个已经对内部电路优化过的SoC,总线功耗约占50% 。随着宽度的增加,总线消耗的功率占 SoC总功率的比重越来越大,因此,总线的低功耗设计很重要。 很多通过减少总线动态翻转来降低总线功耗的算法已经被提出来。数据总线的数据随机性较大,地址
[单片机]
零翻转编码地址总线SoC的<font color='red'>低功耗</font>设计
STM32L0低功耗设计4: RTC模块1秒时钟的产生方法
在进行低功耗设计时,使用外部中断唤醒CPU是一个非常有用而且有效的方法,但是在某些特定的应用中,我们还希望CPU能够自己醒来去完成一些特定的操作,这就需要用到RTC模块,因为RTC模块在CPU进入低功耗状态后,是还可以工作的。使用RTC,也需要得到一个最小时间间隔,一般我们将其设置为1秒,本文介绍如何设置RTC的这个最小时间间隔。 先来看一下时钟图,RTC可以采用两个时钟模块,1个是外部的低频晶振,一般我们选择32.768KHz,这个比较精准;另一个则是内部的RC振荡器,是37KHz。 STM32L0的预分频器被分成两个预分频器。一个7位的异步预分频器(AsynchPrediv),一个13位同步预分频器(Sync
[单片机]
华为海思采用GALAXY设计平台,实现低功耗设计
Synopsy公司日前宣布,海思半导体有限公司(前身是华为技术公司ASIC设计中心),采用了Synopsys的Galaxy设计平台作为130纳米设计的主要IC设计流程。海思公司目前面对的重大竞争性挑战之一是,降低其先进、高速设计方案的功耗。Synopsys的Galaxy平台为海思公司提供了最为全面的低功耗解决方案,提高了其低功耗的设计能力。 海思半导体有限公司高级副总裁艾伟表示:“毫无疑问,低功耗限制是当今消费电子应用类IC设计中的最大制约因素,也是每个项目成功的决定性要素。通过在从RTL至GDSII的整个设计过程中采用Synopsys的Galaxy低功耗流程,我们能够充分解决目前强大市场压力下的低功耗设计挑战。我们很高兴能够进
[焦点新闻]
FPGA的功耗概念与低功耗设计研究
引言   芯片对功耗的苛刻要求源于产品对功耗的要求。集成电路的迅速发展以及人们对消费类电子产品——特别是便携式(移动)电子产品——的需求日新月异,使得设计者对电池供电的系统已不能只考虑优化速度和面积,而必须注意越来越重要的第三个方面——功耗,这样才能延长电池的寿命和电子产品的运行时间。很多设计抉择可以影响系统的功耗,包括从器件选择到基于使用频率的状态机值的选择等。    1 FPGA功耗的基本概念   (1) 功耗的组成   功耗一般由两部分组成:静态功耗和动态功耗。静态功耗主要是晶体管的漏电流引起,由源极到漏极的漏电流以及栅极到衬底的漏电流组成;动态功耗主要由电容充放电引起,其主要的影响参数是电压、节点电容和工作频
[嵌入式]
FPGA的<font color='red'>功耗</font>概念与<font color='red'>低功耗</font>设计研究
一种具有内置节电电路的继电器驱动的低功耗设计方案
多个继电器线圈可由单电源供电,该电源必须大到足以同时驱动所有线圈。另外,这些继电器被密集的排布在很小的区域内,设计时必需考虑线圈的功耗。继电器线圈所需的吸合电压远高于其保持电压。认识到这一点,就有可能设计出一种通过减少线圈驱动电流来节省能耗的电路。本应用笔记讨论一种具有 内置节电电路 的 继电器驱动 器件,用于降低整个系统的功耗。   节电设计方法 MAX4822/MAX4824继电器驱动器具有节电特性,可在FET先导通一段时间后降低驱动器电压。最初时输出驱动器为完全饱和导通的FET。经过一段可调延时后,FET上的压降调整为寄存器编程值。该延时可由外部电容设定(图1)。 节电特性能同时降低继电器线圈功耗和电源功耗。该器件的输出
[嵌入式]
杂谈单片机低功耗设计
目前,有许多单片机应用领域,都是用电池供电,节能成为设计工程师普遍关心的问题。 进入掉电模式现在有很多的低功耗的片子,特别是在进入掉电模式之后,只有1uA的电流。也可以使用电源管理的方法,在不工作的时候,把系统电源关断,这样更省电。51芯片,本来对它的功耗非常不满,但是因为其价格越来越便宜,本身的性价比依旧很好,所以总也甩不掉。 1、休眠。一般的系统都不会到了忙不过来的地步,适当的休眠还是可以节省一些功耗的,在一些简单的系统,多抽时间休眠成了省电的关键,你看别的芯片都不耗电,只有单片机了,它就是关键了,在有些时候,提高主频反而会获取更多的休眠时间,反而使系统功耗更小了。但是值得注意的是,经常性的切换休眠和工作
[单片机]
面向超低功耗设计的微控制器功效优化方案
不论是消费、工业还是医疗应用,功耗优化一般都是通过缩短有效处理时间以及延长处理器睡眠模式时间来实现的。不过,随着超低功率应用的出现,这种方法已然无法满足要求。单 电池 工作、接近电池阈值的充放电,电机和/或高亮 LED 的控制需求,以及减小器件外形尺寸并降低成本,种种趋势已经改变了开发人员的功耗优化方式。   对于电动牙刷、PMP、遥控器、无线 传感器 以及其它便携和手持式设备来说,必须将功率管理贯穿于系统的各个层面。通过高效单电池电压转换优化功耗、利用多种电流模式、引入智能电池管理、在应用级采用节能技术,便可以在整个系统范围实现功耗调节。    高效的电压转换   许多超低功率应用都在向单电池架构方向发展,以降低器件成本,减小
[嵌入式]
面向超<font color='red'>低功耗</font>设计的微控制器功效优化方案
STM32独立看门狗和低功耗模式_RTC定时唤醒来喂狗
在STM32开发中经常会用到独立看门狗(IWDG)和低功耗模式,看门狗是为了检测和解决由软件错误引起的故障,低功耗模式是为了在CPU不需要继续运行时进入到休眠模式用以节省电能。其中独立看门狗的时钟由独立的RC振荡器(STM32F10x一般为40kHz)提供,即使在主时钟出现故障时,也仍然有效,因此可以在停止和待机模式下工作。而且独立看门狗一旦启动,除了系统复位,它不能再被停止。但这样引发的一个问题是当MCU进入到低功耗模式后由于CPU停止运行无法喂狗,会导致系统频繁复位。那如何解决这个问题呢,难道独立看门狗和低功耗模式没法同时使用? 一个很好的方式是在休眠模式下通过RTC定时唤醒来喂狗,喂完够在进入继续进入到休眠模式。比如看门
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved