stm32的3种stm32l151低功耗配置模式(睡眠,停止,待机)各是什么时候使用,以前编程时没用到过

STM32睡眠模式低功耗(停止模式) - CSDN博客
STM32睡眠模式低功耗(停止模式)
目前stm32已经非常流行了,那么本文讨论下stm32低功耗模式,不多说先上手册内容!
这是英文文档
不好看懂是吧,下面看中文文档!
我对比了 STM32F0 和 STM32F1 两者进入低功耗是一样的,STM32F4的类似目前没有研究。
低功耗模式有三种,
1.睡眠模式,( CM3 内核停止,外设仍然运行)此功耗是最高的。
2.停止模式,(所有时钟都停止)此功耗较低,典型大概在20uA左右。
3.待机模式,( 1.8V 内核电源关闭)此功耗最低,典型大概在2uA左右。
如果不行那就看手册,上图
一般我们做开发大多都是选择停机模式,因为停机模式功耗较低。而且任一中断或事件都能唤醒,待机模式虽然功耗最低,也就差10个微安,但是只有特定的唤醒脚可以唤醒,实时性不是很好。
我们用停机模式也能降到10几个uA,实时性又好,干嘛不用呢。
要怎么做才能把停机模式功耗进一步降低呢。我们先看官方库进入低功耗。
void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry);
void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry);
void PWR_EnterSTANDBYMode(void);
这里我们用到停机模式,有两个参数
第一个PWR_Regulator是选择电源是否进入低功耗
#define PWR_Regulator_ON
//电源不进低功耗 唤醒基本没延迟
#define PWR_Regulator_LowPower
//电源进去低功耗 不过唤醒启动有一点延迟
第二个参数PWR_STOPEntry
#define PWR_STOPEntry_WFI
//中断唤醒
#define PWR_STOPEntry_WFE
//事件唤醒
停机模式唤醒后自动选择系统内部时钟,看自己的应用是否需要重新配置;如果你的系统时钟是HSI或者HSE是要重新配置,一般都需要重新配置,直接调用系统时钟配置函数。
另外停机模式唤醒后,flash程序是从中断或事件开始执行的。
我们要做到停机模式更低功耗,例程
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
第一个参数要配置电源低功耗模式,第二个随你是中断唤醒还是事件唤醒,或者两者都要;
第二步你要把所有引脚IO口释放,全部配置成模拟输入状态,IO口几乎0消耗,如果不信下面我们来看手册
我们只要在进入低功耗之前把IO口配置一下就行了(根据自己应用需要配置IO),但是唤醒之后就要重新配置IO口了。
在这里我要提醒广大朋友,在配置IO模拟输入之前,一定不要锁定IO口,我就犯了这个毛病,在配置成模拟输入之前我们串口两个引脚锁定了导致我的功耗一直在90uA左右下不去,老费劲了,挣了我一天时间才发现,最后功耗在10几uA左右,这功耗已经相当低了,能适应现在电池行业不是很发达的时代了,用四节5号电池够你用至少1年了。
本文已收录于以下专栏:
相关文章推荐
今天总结PWR部分知识,请看“STM32F0x128参考手册V8”第六章。提供的软件工程是关于电源管理中的停机模式,工程比较常见,但也是比较简单的一个实例,根据项目的不同还需要适当修改或者添...
STM32F10xxx有三中低功耗模式:●睡眠模式(Cortex?-M3内核停止,外设仍在运行)●停止模式(所有的时钟都以停止)●待机模式(1.8V电源关闭) 时钟频率72MHz时,从闪存执行代码,S...
本文主要研究STM32的低功耗知识,包括待机模式和停机模式。让单片机进入的待机模式和停机模式,并且分别对它唤醒。观察现象,得出唤醒机理。
本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。
一、STM32芯片性能
使用芯片型号:stm32f030f...
stm32用于进入停止模式的中断和用于产生唤醒的中断,后者的抢占优先级一定要高,否则无法唤醒!
STM32F103待机模式测试
一 待机模式简介
  在stm32的低功耗模式中,待机模式可以实现系统的最低功耗,在这种模式下,只需要2uA左右的电流。
三 待机唤醒程序分析
实验现象:
  将程序下载到开发板上后,...
一 、STM32待机模式简介
很多单片机都有低功耗模式,STM32也不例外。在系统或电源复位以后,微控制器处于运行状态。运行状态下的HCLK为CPU提供时钟,内核执行程序代码。当CPU不需继续运行时...
在STM32开发中经常会用到独立看门狗(IWDG)和低功耗模式,看门狗是为了检测和解决由软件错误引起的故障,低功耗模式是为了在CPU不需要继续运行时进入到休眠模式用以节省电能。其中独立看门狗的时钟由独...
刚开始进入STOPMode后,整机功耗有300uA的,此时外围其他硬件电路电流已经可以肯定漏电流在nA级,因此调试方向在主芯片,经过实际测试,都是GPIO配置的问题,比如某个GPIO为中断输入,闲置为...
他的最新文章
讲师:宋宝华
讲师:何宇健
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)1893人阅读
单片机(9)
STM32的3种低功耗模式
睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
停止模式:所有时钟都已停止;1.8V内核电源工作;PLL,HIS和HSERC振荡器功能禁止;寄存器和SRAM内容保留。
待机模式:1.8V内核电源关闭;只有备份寄存器和待机电路维持供电;寄存器和SRAM内容全部丢失;实现最低功耗。
STM32的3种低功耗唤醒方式
STM32待机模式
在待机模式下,所有的I/O引脚均处于高阻态,除了复位引脚、被使能的唤醒引脚和TAMPER引脚。待机模式下只有2uA的电流,停机模式下20uA的电流。
库函数进入待机模式
1. 使能电源时钟。
2. 设置WK_UP引脚作为唤醒源。
3. 设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。
#include "wkup.h"
#include "led.h"
#include "delay.h"
void Sys_Standby(void)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_WakeUpPinCmd(ENABLE);
PWR_EnterSTANDBYMode();
void Sys_Enter_Standby(void)
RCC_APB2PeriphResetCmd(0X01FC,DISABLE);
Sys_Standby();
u8 Check_WKUP(void)
if(WKUP_KD)
delay_ms(30);
if(t&=100)
void EXTI0_IRQHandler(void)
EXTI_ClearITPendingBit(EXTI_Line0);
if(Check_WKUP())
Sys_Enter_Standby();
void WKUP_Init(void)
GPIO_InitTypeDef
GPIO_InitS
NVIC_InitTypeDef NVIC_InitS
EXTI_InitTypeDef EXTI_InitS
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_I
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_R
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
if(Check_WKUP()==0) Sys_Standby();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46851次
排名:千里之外
原创:19篇
(3)(6)(10)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'stm32的3种低功耗模式(睡眠,停止,待机)各是什么时候使用,以前编程时没用到过-土地公问答
stm32的3种低功耗模式(睡眠,停止,待机)各是什么时候使用,以前编程时没用到过
stm32的3种低功耗模式(睡眠,停止,待机)各是什么时候使用,以前编程时没用到过
STM32 的低功耗模式有 3种: 1)睡眠模式(CM3内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机(standby)模式(内核电源关闭) 从待机模式唤醒后的代码执行等同于复位后的执行 进入Standby模式后,只能有Wake-up脚和RTC唤醒,特别是唤醒后,程序将从最开始运行,也就是相当于软件复位。提问者评价谢谢!
关注这个问题
其它类似问题
其它人正在问的问题小v电子技术博文
上海鲤鲸网络科技 小v单片机
如下图是一张段式液晶屏的描述,工四个com端,
计算码值表如下
//码值表 & & & & & & & & & & & & & /* 0 & & 1 & & & &2 & & & 3 & & &4 & */
__CONST uint16_t &NumberMap[10] = {0x0, 0x2, 0x2...
产品详细信息
Low Current Consumption:
RX peak: 7.5 mA
TX peak: 8.2 mA @ 0 dBm
MCU: 59 uA/MHz
MCU sleep: 1.65 uA down to 200 nA
蓝牙 - Silicon Labs
降低功耗是每个便携式产品开发人员的设计目标之一,但功耗不仅仅与硬件设计有关,控制软件也会对产品的功耗产生很大影响。不管是操作系统、BIOS控制程序还是外设驱动程序,这些软件编写的方式决定了最终产品的功耗水平,因此在开发时必须加以考虑。本文介绍四种通过软件降低功耗的方法,可供中国的设计工程师们参考。
作为嵌入式软件工程师,我们需要在质量与效率之间寻求平衡。为此,我们要优化软件性能,使之能在速度较慢而价格低廉的处理器上运行;我们要调整软件大小,这样就能使用更小且更便宜的存储器。现在随着为手持式和无线装置编写的软件越来越多,我们还需要优化产品的功耗,以延长小型低成本电源的寿命。
有个好消息是,无论你在开发操作系统、外设驱动程序还是应用程序,现在已有多种软件设计技术可以帮助降...
最近研究STM32l053 &nucleo开发板的睡眠模式例程配置。
main程序如下
int main(void)
& /* STM32L0xx HAL library initialization:
& & & &- Configure the Flash prefetch, Flash preread and Buffer caches
& & & &- Systick timer is configured by default as source of time base, but user&
& & &nbsp...
学习stm32,用在手持便携式的设备项目上,必要考虑到它的功耗和三种模式。
STM32 的低功耗模式有 3种: 1)睡眠模式(CM3内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机(standby)模式(1.8V内核电源关闭) 从待机模式唤醒后的代码执行等同于复位后的执行 进入Standby模式后,只能有Wake-up脚和RTC唤醒,特别是唤醒后,程序将从最开始运行,也就是相当于软件复位。
睡眠模式,要对电源配置,以及睡眠模式下相关的寄存器进行配置,。官方例程为了最大量的节省功耗,会将各个io的时钟关掉。睡眠模式下的唤醒,不会对程序复位,睡眠模式下被唤醒的中断基本 都是外部中断,也就是所有的IO,只要前提配置好中断NViC,以及优先级即可。...
1&&&&&&&&开发环境搭建
1.1& 软件安装
1.&&&&&&&&Keil软件安装;
2.&&&&&&&&Jlink驱动安装;
3.&&&&&&&&nRFgoStdio安装,该软件用来烧写蓝牙协议栈和应用软件。第二步安装了Jlink驱动后,不要安装nRFgo里自带的Jlink驱动。
只看帖不发帖是不好的,我也来发发帖子吧,写的不好谅解啊。
& & &前两个月在公司做了一个低功耗项目,现在功耗最低10uA不到,平均功耗40uA左右,算是达标了。因为是公司产品,就不方便贴代码、原理图了,该产品是一个小模块,可以方便的嵌入到各种系统里面。跟原子哥他们卖的NRF2401类似,是一个读卡器。
& & &做这个项目中间也请了技术支持,因为外围电路芯片的功耗一直降不下来,经过与对方的反复交流,对方提供了低功耗的测试结果、硬件方案、软件方案,经过修改测试,最终成为我们的产品,功耗比较满意。
& & &硬件方案选择的是STM32,外加某公司的读卡芯片。前期完成了读...
关于stm32l0 nucleo开发板上串口的例程只给了三个例程,这三个例程名字文件如下
UART_TwoBoards_ComDMA,UART_TwoBoards_ComIT,UART_TwoBoards_ComPolling
大概就是第一个利用DMA进行发送接收的,第二个就是中断发送接收的,第三个就是用轮训的方式实现的,由于三个例程的并没有完全投入大部分精力去搞,所以说明显得很浅显,如果之前用过stm32f103系列的,那么这点浅显的提示也可以提供一定的提示的,在这里我用了类似stm32f103的经常用的串口方式,就是串口发送不用中断,中断接收模式。
官方例程原文
@par Example Description 例程描述
当你学习stm32l053r8t6这款芯片时,必定要用到他的低功耗功能,所以进入低功耗模式是必须要学习一下的。
官方例程如下
int main(void)
& /* STM32L0xx HAL library initialization:
& & & &- Configure the Flash prefetch, Flash preread and Buffer caches
& & & &- Systick timer is configured by default as source of time base, but user&
上一篇有说到,stm32l053是一款低功耗产品,应客户要求结合低功耗蓝牙4.0,要实现一个低功耗的设计
l053是st在14年初发布的,资料较少,cortex m0+,主频能达36M,但是想要在线调试KEIL4及以下不行,要用KEIL5以上,安装KEIL5后还需要安装PACK,
才能下载调试。
安装教程百度即可。
还有stm32l0库和stm32f103系列的库也是不一样的不能移植拿来直接用。需要自己重新看函数看例程然后才能用。
并且ucosii的也不能直接将一移植好的拿来用,毕竟内核一个是M3& 一个是M0+所以还是有区别的。
最近上手了nucleo& stm32的开发板,做一些记录
问:jackson2005] 從睡眠喚醒至全速運行,約需多久時間
[答:expert6] 從睡眠喚醒至全速運行:从SLEEP可以马上唤醒,从STOP只需8us可唤醒 [ 10:36:13]
[问:liuguod] STM32L15xxx微处理器支持哪些程序调试接口?
[答:expert3] 支持JTAG和SWD两种调试接口。 [ 10:36:46]
[问:jackson2005] 在睡眠被喚醒,有那些方法
[答:expert5] 所有的中断都可以将STM32L从睡眠模式唤醒。 [ 10:37:42]
[问:encaon] 请...
致力于嵌入式系统应用开发 14:32
新年快乐! 23:20
DIY产品推广只需一步,快速开始
后使用快捷导航没有帐号?
STM32CubeMX系列教程14:电源控制器(PWR)
查看: 7757|
评论: |原作者: MyMX1213
摘要: 本章介绍STM32Fxx系统低功耗模式。
一.低功耗模式介绍&&&&&&&&系统提供了多个低功耗模式,可在&CPU&不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡。& & & & 当系统断电时,仍然可以通过电池供电保留备份域的数据。备份域中包含RTC实时时钟,4KB备份SRAM以及调压器,调压器为备份域和待机电路以外数字电路供电,输出电压约为1.2V。器件有三个低功耗模式:& & 睡眠模式(&Cortex(R)-M7&内核停止,外设保持运行)& & 停止模式(所有时钟都停止)& & 待机模式(1.2&V&域断电)此外,可通过下列方法之一降低运行模式的功耗:& & 降低系统时钟速度& & 不使用&APBx&和&AHBx&外设时,将对应的外设时钟关闭。睡眠模式只是内核停止,外接还能继续工作,I/O管脚状态没有改变。停止模式是在睡眠模式的基础上把所有的时钟都停止了,振荡器也被禁止。此时所有外设已经停止工作。待机模式基于&Cortex(R)-M7&深度睡眠模式,此时内核停止,外设也停止工作,1.2V域断电。除备份域和待机电路中的寄存器外,其他全部停止工作,SRAM和寄存器内容将丢失。只是备份域中RTC继续工作,备份ARAM数据不会丢失继续保存。此时三种低功耗模式中,待机模式可达到最低功耗。进入低功耗模式& & & & 当&MCU&执行&WFI(等待中断)或&WFE(等待事件)指令,或者当&Cortex(R)-M7&系统控制寄存器中的&SLEEPONEXIT&位在从&ISR&恢复期间置&1&时,将进入低功耗模式。仅当没有中断和事件挂起时,才能通过&WFI&或&WFE&进入低功耗模式。退出低功耗模式在睡眠和停止模式下,&MCU&根据进入低功耗模式的方式退出低功耗模式。& & &如果使用&WFI&指令或从&ISR&恢复的方式进入低功耗模式,则通过&NVIC&应答的任何外设中断均可唤醒器件& & &如果使用&WFE&指令进入低功耗模式,则&MCU&会在事件发生时立即退出低功耗模式在待机模式下,&MCU&退出低功耗模式的方式包括:外部复位(NRST&引脚)、&IWDG(独立看门狗) 复位、已使能WKUPx&引脚之一的上升沿或者&RTC&事件。stm32F7xx有六个WKUP&引脚(PA0/PA2/PC1/PC13/PI8/PI11)。二.实验例程& & & & 本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。RTC选择内部唤醒开启RTC。PA0(WAKEUP管脚)配置为中断外部中断引脚,同时配置LED管脚。配置RTC时间和日期,其他为默认配置。Wake UP唤醒设置在程序中设置,在此不作设置。开启外部中断0号线中断。生成报告以及代码,编译程序。在stm32f7xx_hal_pwr.h头文件中可以看到低功耗控制函数。下载这两个应用程序文件,c文件放在工程目录下Src文件夹中,头文件放在Inc文件中,并在工程中添加刚才的应用程序文件。打开stm32fxx_lp_modes.c文件中,里面有五个低功耗测试程序。在stm32fxx_lp_modes.h文件中,可以看到函数声明和宏定义低功耗模式。而已通过去掉相应行的注释选择一种低功耗模式。/* Exported constants --------------------------------------------------------*/
#if !defined (SLEEP_MODE) && !defined (STOP_MODE) && !defined (STANDBY_MODE)\
&& !defined (STANDBY_RTC_MODE) && !defined (STANDBY_BKPSRAM_MODE)
/* Uncomment the corresponding line to select the STM32F7xx Low Power mode */
//#define SLEEP_MODE
#define STOP_MODE
//#define STANDBY_MODE
//#define STANDBY_RTC_MODE
//#define STANDBY_BKPSRAM_MODE
#if !defined (SLEEP_MODE) && !defined (STOP_MODE) && !defined (STANDBY_MODE)\
&& !defined (STANDBY_RTC_MODE) && !defined (STANDBY_BKPSRAM_MODE)
#error "Please select first the target STM32F7xx Low Power mode to be measured (in stm32f7xx_lp_modes.h file)"
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void SleepMode_Measure(void);
void StopMode_Measure(void);
void StandbyMode_Measure(void);
void StandbyRTCMode_Measure(void);
void StandbyBKPSRAMMode_Measure(void); 在这里补充一下C语言的语法知识.#if ... #endif为调节编译语句,只有满足条件时才编译中间部分的语句。第一个#if #endif语句的意思是如果没有宏定义相应低功耗模式的则编译中间的宏定义。第二个#if #endif语句的意思是如果还是没有相应的低功耗模式宏定义,则提示错误。此时编译程序时会提示上面的错误提示信息。在main.c文件前面添加头文件,定义用户按键标志变化和声明错误处理函数。/* USER CODE BEGIN Includes */
#include "stm32f7xx_lp_modes.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
__IO uint8_t UserButtonStatus = 0;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void Error_Handler(void);
/* USER CODE END PFP */ 在main.c文件后面添加外部中断回调函数和错误处理函数。中断回调函数将按键标志位置1,错误处理函数打印错误信息,然后进行while循环。/* USER CODE BEGIN 4 */
This function is executed in case of error occurrence.
* @retval None
void Error_Handler(void)
printf("something wrong !!!\r\n");
EXTI line detection callbacks
GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
UserButtonStatus = 1;
/* USER CODE END 4 */ & & & & 在main.c主函数中添加应用测试程序。程序中不断读取用户按键标志,同时LED1不断闪烁。但有WAKEUP按键按下时,跳出循环,然后等待按键释放,关闭LED1。最后根据stm32fxx_lp_modes.h中的宏定义,进入对应的低功耗模式测试函数。
/* USER CODE BEGIN 2 */
printf("\r\n********
STM32F7 LowPower Test
*******\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("Press WAKEUP button to enter LP modes \r\n\r\n");
UserButtonStatus = 0;
/* Wait until USER button is pressed to enter the Low Power mode */
while(UserButtonStatus == 0x00)
/* Toggle LED1 */
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
/* Inserted Delay */
HAL_Delay(200);
/* Loop while User button is maintained pressed */
while(HAL_GPIO_ReadPin(WAKEUP_GPIO_Port,WAKEUP_Pin) != RESET)
/* Turn off LED1 */
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
#if defined (SLEEP_MODE)
/* Sleep Mode Entry
- System Running at PLL (216MHz)
- Flash 5 wait state
- Instruction and Data caches ON
- Prefetch ON
- Code running from Internal FLASH
- All peripherals disabled.
- Wake-up using EXTI Line (USER Button)
printf("SleepMode!\r\nPress WAKE_UP button to wake up ...\r\n");
SleepMode_Measure();
printf("\r\nSLEEP_MODE wake up,system running continue ... \r\n");
#elif defined (STOP_MODE)
/* STOP Mode Entry
- RTC Clocked by LSI
- Regulator in LP mode
- HSI, HSE OFF and LSI OFF if not used as RTC Clock source
- FLASH in deep power down mode
- Automatic Wake-up using RTC clocked by LSI (after ~20s)
printf("StopMode!\r\nAutomatic Wake-up using RTC clocked by LSI (after ~20s) ...\r\n");
StopMode_Measure();
MX_USART1_UART_Init();
printf("\r\nStopMode wake up ,system running continue \r\n");
#elif defined (STANDBY_MODE)
/* STANDBY Mode Entry
- Backup SRAM and RTC OFF
- IWDG and LSI OFF
- Wake-up using WakeUp Pin (PI.11)
printf("StandbyMode!\r\nPress WAKE_UP button to wake up ...\r\n");
StandbyMode_Measure();
printf("StandbyMode wake up ,this will
never be running ,something wrong!! \r\n");
#elif defined (STANDBY_RTC_MODE)
/* STANDBY Mode with RTC on LSI Entry
- RTC Clocked by LSI
- IWDG OFF and LSI OFF if not used as RTC Clock source
- Backup SRAM OFF
- Automatic Wake-up using RTC clocked by LSI (after ~20s)
printf("StandbyRTCMode!\r\nPress WAKE_UP button to wake up ...\r\n");
StandbyRTCMode_Measure();
printf("StandbyMode wake up ,this will
never be running ,something wrong!! \r\n");
#elif defined (STANDBY_BKPSRAM_MODE)
/* STANDBY Mode Entry
- Backup SRAM ON
- IWDG OFF
- Wake-up using WakeUp Pin (PI.11)
printf("StandbyBKPSRAMMode!\r\nPress WAKE_UP button to wake up ...\r\n");
StandbyBKPSRAMMode_Measure();
printf("StandbyBKPSRAMMode wake up ,this will
never be running ,something wrong!! \r\n");
/* USER CODE END 3 */
}& & & & 此处也用到条件编译语句。例如stm32fxx_lp_modes.h头文件中宏定义STOP_MODE。则程序编译的时候只会编译STOP_MODE选项中的语句。其他的语句不会编译进程序,不会写入stm32的flash中。可以在stm32fxx_lp_modes.h头开启不同的宏选择编译对应不同的语句。下面我们来详细分析一下各种低功耗模式的运行流程。1.SLEEP_MODE& php代码:/**
This function configures the system to enter Sleep mode for
current consumption measurement purpose.
Sleep Mode
==========
- System Running at PLL (216MHz)
- Flash 5 wait state
- Instruction and Data caches ON
- Prefetch ON
- Code running from Internal FLASH
- Wakeup using EXTI Line (USER Button)
* @retval None
void SleepMode_Measure(void)
/* Suspend Tick increment to prevent wakeup by Systick interrupt.
Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base) */
HAL_SuspendTick();
/* Request to enter SLEEP mode */
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
/* Resume Tick interrupt if disabled prior to sleep mode entry */
HAL_ResumeTick();
} & & & & 睡眠模式Cortex(R)-M7&内核停止,程序以WFI指令进入睡眠模式,所以只要产生任意中断都会退出睡眠模式。所以进入睡眠模式前先调用HAL_SuspendTick()函数挂起系统滴答定时器,否则将会被系统滴答定时器(SysTick)中断在1ms内唤醒。程序运行到HAL_PWR_EnterSLEEPMode()函数时,系统进入睡眠模式,程序停止运行。当按下WAKEUP按键时,触发外部中断0,此时系统被唤醒。继续执行HAL_ResumeTick()语句回复系统滴答定时器。2.STOP_MODE/**
This function configures the system to enter Stop mode with RTC
clocked by LSE or LSI
for current consumption measurement purpose.
STOP Mode with RTC clocked by LSE/LSI
=====================================
- RTC Clocked by LSE or LSI
- Regulator in LP mode
- HSI, HSE OFF and LSI OFF if not used as RTC Clock source
- FLASH in deep power down mode
- Automatic Wakeup using RTC clocked by LSE/LSI (~20s)
* @retval None
void StopMode_Measure(void)
RTCHandle.Instance = RTC;
/* Configure RTC prescaler and RTC data registers as follow:
- Hour Format = Format 24
- Asynch Prediv = Value according to source clock
- Synch Prediv = Value according to source clock
- OutPut = Output Disable
- OutPutPolarity = High Polarity
- OutPutType = Open Drain */
RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;
RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if(HAL_RTC_Init(&RTCHandle) != HAL_OK)
/* Initialization Error */
Error_Handler();
/*## Configure the Wake up timer ###########################################*/
RTC Wakeup Interrupt Generation:
Wakeup Time Base = (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI))
Wakeup Time = Wakeup Time Base * WakeUpCounter
= (RTC_WAKEUPCLOCK_RTCCLK_DIV /(LSI)) * WakeUpCounter
==& WakeUpCounter = Wakeup Time / Wakeup Time Base
To configure the wake up timer to 20s the WakeUpCounter is set to 0xA017:
RTC_WAKEUPCLOCK_RTCCLK_DIV = RTCCLK_Div16 = 16
Wakeup Time Base = 16 /(~32.768KHz) = ~0,488 ms
Wakeup Time = ~20s = 0,488ms
* WakeUpCounter
==& WakeUpCounter = ~20s/0,488ms = 40983 = 0xA017 */
HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, 0xA017, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
/* FLASH Deep Power Down Mode enabled */
HAL_PWREx_EnableFlashPowerDown();
/* Enter Stop Mode */
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
/* Configures system clock after wake-up from STOP: enable HSE, PLL and select
PLL as system clock source (HSE and PLL are disabled in STOP mode) */
SYSCLKConfig_STOP();
/* Disable Wake-up timer */
if(HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle) != HAL_OK)
/* Initialization Error */
Error_Handler();
}& & & & &停止模式Cortex(R)-M7&内核停止,外设也停止工作,所有外设时钟也关闭。此处设置了RTC唤醒。RTC时钟配置为外部时钟,频率为32.768KHz。经过16分频后的时基为16&/(~32.768KHz)&=&~0,488&ms。若要20s后唤醒,则唤醒计数器的值为~20s/0,488ms&=&40983&=&0xA017。由于停止模式PLL、HSI、HSE RC振荡器均被禁止,所以系统被唤醒(RTC唤醒或WAKUP按键外部中断唤醒)后需要重新配置系统时钟,同时关闭WAKEUP定时器。& & & & 由于外设时钟停止,所以程序返回main()函数中也需要重新初始化串口才能打印输出信息。#elif defined (STOP_MODE)
/* STOP Mode Entry
- RTC Clocked by LSI
- Regulator in LP mode
- HSI, HSE OFF and LSI OFF if not used as RTC Clock source
- FLASH in deep power down mode
- Automatic Wake-up using RTC clocked by LSI (after ~20s)
printf("StopMode!\r\nAutomatic Wake-up using RTC clocked by LSI (after ~20s) ...\r\n");
StopMode_Measure();
MX_USART1_UART_Init();
printf("\r\nStopMode wake up ,system running continue \r\n"); 3.STANDBY_MODE/**
This function configures the system to enter Standby mode for
current consumption measurement purpose.
STANDBY Mode
============
- Backup SRAM and RTC OFF
- IWDG and LSI OFF
- Wakeup using WakeUp Pin (PI.11)
* @retval None
void StandbyMode_Measure(void)
/* Disable all used wakeup sources: Pin1(PA.0) */
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
/* Clear the related wakeup pin flag */
__HAL_PWR_CLEAR_WAKEUP_FLAG(PWR_WAKEUP_PIN_FLAG1);
/* Re-enable all used wakeup sources: Pin1(PA.0) */
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
/* Request to enter STANDBY mode
HAL_PWR_EnterSTANDBYMode();
}& & & & 待机模式Cortex(R)-M7&深度睡眠模式,此时内核停止,外设也停止工作,1.2V域断电,SRAM和寄存器内容将丢失。待机模式唤醒后是重新运行程序,相当于重启,而不是在程序原来的位置继续运行。待机模式只能从WAKEUP引脚上升沿或下降沿,RTC,复位引脚,IWDG(独立看门狗) 复位唤醒。不能通过其他中断唤醒。前面睡眠模式和停止模式可以通过WAKEUP引脚的外部中断唤醒,但是待机模式不能通过外部中断唤醒。& & & & 程序中先失能WAKUP引脚,清除唤醒引脚标志,然后使能WAKEUP 1号管脚,即PA0.stm32F7xx WAKEUP引脚一共有五个,分别为PA0/PA2/PC1/PC13/PI8/PI11。& & & &&待机模式中只有备份域还在工作,可以通过RTC唤醒和通过备SRAM备份数据。具体可以参考程序中STANDBY_RTC_MODE和STANDBY_BKPSRAM_MODE。这里不在详细讲解。& & & & 修改stm32fxx_lp_modes.h头文件中的宏定义注释选择对应低功耗模式,编译程序并下载到开发板。打开串口调试助手,设置波特率为115200。按下Open746I开发板中WAKEUP按键进入低功耗模式,再次按下按键或者等待20s退出低功耗模式。
刚表态过的朋友 ()
上一篇:下一篇:
CubeMX教程
本章讲解LwIP协议栈实现HTTP服务器
本章讲解USB作为主机使用的例程。
本章讲解USB作为设备使用的例程。
本章教程带领大家移植StmemWin 5.22到STM32的LDTC接口控制的RGB接口屏幕。
本章讲解微雪7inch Capacitive Touch LCD (F)屏幕的触摸控制。
本章讲解LDTC接口控制7寸
LCD屏幕显示。
本章讲解通过FMS接口控制Nand Flash K9F1G08U0E (1G Bit)
本章讲解通过FMS接口控制Nand Flash K9F1G08U0E (1G Bit)
本章介绍Quad-SPI总线,通过Quad-SPI接口控制W25Qxx芯片
上一章我们介绍了SD卡读写操作,本章讲过如何通过FATFS文件系统读写SD卡内部的文件
本章介绍SD/SDIO MMC卡主机接口(SDMMC),通过SDMMC接口读写SD卡。
本章介绍stm32F7系列芯片的随机数发生器(RNG)和循环冗余校验(CRC)。
本章介绍STM32Fxx的两种看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)
本章介绍STM32Fxx系统低功耗模式。
摘要:本章介绍实时时钟(RTC)。1.RTC简介
实时时钟(RTC)是一个独立的BCD定时器/计
本章介绍CAN总线协议。
本章介绍如何用程序通过SPI控制w25Q125fv。
本章介绍SPI总线。以及介绍串行flash芯片W25Q128FV
本章介绍I2C总线。通过I2C控制AT24Cxx芯片。
本章通过两个例程介绍STM32的数模转换器(DAC),第一个通过软件控制ADC单次转换输出
本章通过两个例程介绍STM32的模数转换器(ADC),第一个通过ADC采集内部温度传感器通
上一章讲解了串口的轮询和中断模式,这一章介绍一下通过DMA模式控制串口传输。
本章以串口为例讲解,HAL 库轮询,中断,DMA 三种编程模型。
上一章我们讲解了定时器的基本应用,以及定时器中断。这一章我们讲解通过定时器控制管
stm32的定时器功能非常强大,包括基本定时器,通用定时器以及高级定时器。 本章介绍定
本章讲解STM32的外部中断已经中断的运行流程。
本章讲解stm32的GPIO使用,通过按键控制LED灯亮灭
本章通过如何点亮一个LED灯讲解STM32CubeMX软件的使用以及STM32最新的HAL固件库
Powered by

我要回帖

更多关于 stm32l151低功耗配置 的文章

 

随机推荐