STM32入门学习笔记之低功耗实验

发布者:古宝奇缘最新更新时间:2023-06-25 来源: elecfans关键字:STM32  入门学习  低功耗 手机看文章 扫描二维码
随时随地手机看文章

13.1 STM32低功耗模式概述

STM32在系统或电源复位后,芯片处于运行状态,此时HCLK为CPU提供时钟,内核执行程序代码,当CPU不需要继续运行时,可以采用低功耗模块来降低芯片的运行电流,STM32有3种低功耗模式:

(1)睡眠模式:内核停止,外设继续运行

(2)待机模式:1.8V的内核电源被关闭,SRAM内容丢失,PLL,HIS,HSE振荡器断电,此模式下最低电流2uA

(3)停机模式:停止所有时钟,此模式下最低电流20uA

上述三种模式的配置与唤醒条件如下表所示。

模式进入操作唤醒
睡眠WFI指令任一中断
WFE指令唤醒事件
待机PDDS位+SLEEPDEEP位+WFI或者WFEWKUP引脚上升沿RTC警告事件NRST端口的复位信号IWDG复位
停机PDDS和LPDS位+SLEEPDEEP位+WFI或WFE任一外部中断(需要在外部中断寄存器中设置)


从待机模式唤醒后,除了电源控制/状态寄存器PWR_CSR,所有的寄存器被复位,唤醒后执行的代码等同于复位后的执行,此时电源控制/状态寄存器PWR_CSR将会指示内核由待机状态退出,进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时的TAMPER引脚和被使能的唤醒引脚,其他IO均进入高阻状态。


13.2 相关寄存器

13.2.1 电源控制寄存器:PWR_CR

1514131211109876543210
-DBPPLS[2:0]PVDECSBFCWUFPDDSLPDS







Bit 8:取消后备区域的写保护

0:禁止写入RTC和后备寄存器

1:允许写入RTC和后备寄存器

Bit 7~Bit 5:PVD电平选择

000:2.2V

001:2.3V

010:2.4V

011:2.5V

100:2.6V

101:2.7V

110:2.8V

111:2.9V

Bit 4:电源电压监测器PVD使能

0:禁止PVD

1:开启PVD

Bit 3:清除待机位

0:无功效

1:清除SBF待机位

Bit 2:清除唤醒位

0:无功效

1:2个系统时钟周期后清除WUF唤醒位

Bit 1:掉电深睡眠

0:当CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制

1:CPU进入深睡眠时进入待机模式

Bit 0:深睡眠下的低功耗

0:在停机模式下电压调压器开启

1:在停机模式下电压调压器处于低功耗模式


13.2.2 电源控制/状态寄存器:PWR_CSR

1514131211109876543210

EWUP
PVD0SBFWUF









Bit 8:使能WKUP引脚

0:WKUP引脚为通用I/O

1:WKUP引脚用于将CPU从待机模式唤醒,WKUP引脚被设为输入下拉

Bit 2:PVD输出

0:VDD/VDDA高于由PLS[2:0]选定的PVD阀值

1:VDD/VDDA低于由PLS[2:0]选定的PVD阀值

Bit 1:待机标志

0:系统不在待机模式

1:系统进入待机模式

Bit 0:唤醒标志

0:没有发生唤醒事件

1:在WKUP引脚上发生唤醒事件或出现RTC闹钟事件


13.3 实验例程

功能:芯片运行15s之后进入待机模式,然后按下接在WKUP端口的按键唤醒,CPU在唤醒模式下驱动接在PB5上的LED以1Hz频率闪烁。

(1)打开sys.c文件编写一个功能函数,添加以下代码。

/***************************************************

Name    :Standby_Set

Function  :设置待机模式

Parameter  :None

Return    :None

***************************************************/

void Standby_Set()

{

  SCB->SCR |= 1<<2 ;                                          //使能SLEEPDEEP位

    RCC->APB1ENR |= 1<<28 ;                                        //使能电源时钟      

   PWR->CSR |= 1<<8 ;                                          //设置WKUP用于唤醒

  PWR->CR |= 1<<2 ;                                          //清除Wake-up 标志

  PWR->CR |= 1<<1 ;                                          //PDDS置位      

  __asm volatile("wfi");                                        //执行WFI指令

}

(2)打开sys.h文件添加功能函数的声明。


void Standby_Set( void ) ;                                        //设置待机模式

(3)打开1.c输入以下代码。


#include "sys.h"

#include "delay.h"

#include "usart1.h"

/***************************************************

Name    :LED_Init

Function  :LED初始化

Parameter  :None

Return    :None

***************************************************/

#define LED PBout( 5 )                                          //定义LED端口

void LED_Init()

{

  RCC->APB2ENR |= 1<<3 ;

  GPIOB->CRL &= 0xFF0FFFFF ;

  GPIOB->CRL |= 0x00300000 ;

  LED = 1 ;

}

/***************************************************

Name    :TIM1_UP_IRQHandler

Function  :TIM1中断服务函数

Paramater  :None

Return    :None

***************************************************/

u8 TIM1_Count ;

void TIM1_UP_IRQHandler()

{

  if( ( TIM1->SR&0x01 )==0x01 )

  {

    TIM1_Count ++ ;

    if( TIM1_Count==15 )

    {

      Standby_Set() ;                                        //进入待机模式

      TIM1_Count = 0 ;

    }

  }

  TIM1->SR &= ~( 1<<0 ) ;

}

/***************************************************

Name    :TIM1_Init

Function  :定时器1初始化

Parameter  :

      psc:预分频系数

      arr:重装载值

Return    :None

***************************************************/

void TIM1_Init( u16 psc, u16 arr )

{

  RCC->APB2ENR |= 1<<11 ;

  TIM1->DIER |= 1<<0 ;

  TIM1->PSC = psc ;

  TIM1->ARR = arr ;

  TIM1->CR1 |= 1<<0 ;

  NVIC_Init( 3, 2, TIM1_UP_IRQn, 2 ) ;

  TIM1_Count = 0 ;

}

/***************************************************

Name    :main

Function  :主函数

Parameter  :None

Return    :None

***************************************************/

int main()

{

  STM32_Clock_Init( 9 ) ;                                        //STM32时钟初始化

  SysTick_Init( 72 ) ;                                        //SysTick初始化

  USART1_Init( 72, 115200 ) ;                                      //初始化串口1波特率115200

  LED_Init() ;                                            //LED初始化

  TIM1_Init( 7199, 9999 ) ;                                      //定时器1初始化

  while( 1 )

  {

    LED = 0 ;

    delay_ms( 500 ) ;

    LED = 1 ;

    delay_ms( 500 ) ;

  }

}


关键字:STM32  入门学习  低功耗 引用地址:STM32入门学习笔记之低功耗实验

上一篇:STM32L0 ADC使用HAL库关于校准问题的说明
下一篇:STM32CubeMx的初始配置顺序是怎么影响DMA功能的

推荐阅读最新更新时间:2024-10-15 20:30

SysTick 定时器的使用
SysTick是STM32中的一个24位的定时器。 Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟,或者是外部时钟。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要查找芯片的器件手册来决定选择什么作为时钟源。 Cortex-M3 的内核中包含一个 SysTick 时钟。SysTick 为一个 24 位递减计数器,SysTick 设定初值并使能后,每经过 1 个系统时钟周期,计数值就减 1。计数到 0 时,SysTick 计数器自动重装初值并继续计数,同时内部的
[单片机]
STM32外部中断及定时器编程示例
#include stm32f10x.h #include 12864.h ErrorStatus HSEStartUpStatus; //等待时钟的稳定 u8 count=0; u8 d; void SYS_Configuration(void); /* //ms延时函数 void delayms(unsigned int nValue) //delay 1ms at 8M { unsigned int nCount; unsigned int ii; unsigned int jj; nCount = 1980; for(ii = nValue;ii 0;ii--) { for(jj = nCount
[单片机]
Keil实现对意法半导体STM32互联系列的支持
Keil公司宣布其产品Keil MDK-ARM(微控制器开发套件)及RL-ARM(实时库)实现了对意法半导体STM32互联系列的支持。Keil公司同时推出了新的MCBSTEM32C评估板和开发套件。 STM32 互联系列基于ARM® Cortex™-M3处理器,具有全速USB OTG、两个CAN2.0B接口、10/100以太网(含对IEEE1588精密时间协议 (PTP)的硬件支持)。该产品同STM32家族的其他产品采用同样的外设,因此能够轻松实现项目移植,并有高达256KB的闪存和64KB的SRAM。 MDK-ARM 最新版本的的MDK-ARM支持所有的STM32产品,它包括配置文件、设备专有视图以
[单片机]
Keil实现对意法半导体<font color='red'>STM32</font>互联系列的支持
stm32学习之复位和时钟
1、复位 STM32F支持三种复位形式,分别为系统复位、电源复位和备份区域复位。 1.1 系统复位 当以下事件中的一件发生时,产生一个系统复位: 1. NRST管脚上的低电平(外部复位) 2. 窗口看门狗计数终止( WWDG复位) 3. 独立看门狗计数终止( IWDG复位) 4. 软件复位( SW复位)(将Cortex-M3中断应用和复位控制寄存器中的SYSRESETREQ位置1, 可实现软件复位。) 5. 低功耗管理复位 可通过查看RCC_CSR控制状态寄存器中的复位状态标志位来确认复位事件来源。 1.2 电源复位(电源复位将复位除了备份区域外的所有寄存器,地址0x0000_0000~
[单片机]
STM32单片机闪存存储器里存储的是哪些内容
先看rom也就是flash(0x0800 0000-0x0807 ffff)51 2k ,这个空间就是用户存放程序的地方,用户以后自己写boot loader的时候,也是存放在这个空间里的,system memory这个空间是 2k 大小,是st公司在生产完片子的时候,就固化好的isp代码,用户之所以能用上位机软件烧程序就是靠这部分的代码,用户更改不了这个区域,想了解这个区域就看AN2606文档,option bytes这个区域是16个字节,是控制flash区域的寄存器,想了解这些寄存器看STM32F10xxx闪存编程参考手册,SRAM这个区域的其实地址始终是0x2000 0000,终止地址就得根据你的SRAM的大小来进行计算
[单片机]
<font color='red'>STM32</font>单片机闪存存储器里存储的是哪些内容
如何修改STM32系统时钟
一般的STM32控制板搭载的是8M晶振。我们也熟悉了8M晶振的使用方法。但是,当遇到12M晶振是如何修改STM32系统时钟呢? 具体步骤如下: 第一步,全局搜索HSE_VALUE #define HSE_VALUE ((uint32_t)8000000) /*! Value of the External oscillator in Hz */ 修改为: #define HSE_VALUE ((uint32_t)12000000) /*! Value of the External oscillator in Hz */ 第二步,打开system_stm32f10x.c,修改PLL参数,将 /* PLL
[单片机]
基于CORTEX的STM32的三相电能表方案
  背景   电能表是用来测量电能的仪表,又称电度表,火表,电能表,千瓦小时表,指测量各种电学量的仪表。基于ARM的方案已经出现,但是适合应用的ARM7 TDMI在性能上不尽人意,同时外设资源不足;而更高端的ARM9系统的复杂程度很高,成本也较高。所以要研究一种廉价的,满足客户需求的电能表,来填补这个空缺。   一、关于CORTEX-M3与STM32   最新一代ARM v7内核,命名为Cortex,同ARM7/9/10/11相比在架构上有了革命性突破。它采用高效的哈佛结构三级流水线,达到1.25DMIPS/MHz,在功耗上更是达到0.06mW/MHz。Cortex-M3使用Thumb-2指令集,自动16/32位混合排列。单
[单片机]
基于CORTEX的<font color='red'>STM32</font>的三相电能表方案
ch32可以用keil吗?ch32和stm32编程有区别吗?
CH32是山外电子推出的一款基于RISC-V架构的32位微控制器芯片,其具有性价比高的特点,适用于一些成本敏感的产品。而STM32则是意法半导体推出的一款基于ARM Cortex-M架构的32位微控制器芯片,其具有丰富的外设资源和高性能的特点,适用于一些性能要求较高的产品。本文将对CH32和STM32进行比较,并回答读者的问题:ch32可以用keil吗?ch32和stm32编程有区别吗? 一、CH32和STM32比较 1.架构比较 CH32采用了RISC-V架构,而STM32采用了ARM Cortex-M架构。RISC-V架构是一种开源的指令集架构,其具有可定制性强、可移植性好等优点,但是目前在市场上的占有率较低。ARM Cort
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved