0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

低功耗实验

汽车电子技术 来源:滑小稽笔记 作者: 电子技术园地 2023-03-01 15:42 次阅读

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或者WFE WKUP引脚上升沿RTC警告事件NRST端口的复位信号IWDG复位
停机 PDDS和LPDS位+SLEEPDEEP位+WFI或WFE 任一外部中断(需要在外部中断寄存器中设置)
从待机模式唤醒后,除了电源控制/状态寄存器PWR_CSR,所有的寄存器被复位,唤醒后执行的代码等同于复位后的执行,此时电源控制/状态寄存器PWR_CSR将会指示内核由待机状态退出,进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时的TAMPER引脚和被使能的唤醒引脚,其他IO均进入高阻状态。

13.2 相关寄存器

13.2.1 电源控制寄存器:PWR_CR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- DBP PLS[2:0] PVDE CSBF CWUF PDDS LPDS

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

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
EWUP PVD0 SBF WUF

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 ) ;
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10860

    浏览量

    211727
  • STM32
    +关注

    关注

    2270

    文章

    10900

    浏览量

    355926
  • 程序代码
    +关注

    关注

    4

    文章

    42

    浏览量

    15437
收藏 人收藏

    评论

    相关推荐

    请问STM32进入睡眠模式怎么下载程序?

    今天做低功耗实验,不小心把唤醒的代码屏蔽了,板子开机后1秒左右就进入深度睡眠了,这下下载不了程序了。尝试用ISP下载,但是不管是读MCU器件信息还清除芯片、下载程序都一直返回1F。莫非要报废了
    发表于 04-24 08:00

    #硬声创作季 #STM32 手把手教你学STM32-044 待机唤醒实验-低功耗-M4-2

    功耗低功耗
    水管工
    发布于 :2022年10月29日 14:06:37

    #硬声创作季 #STM32 手把手教你学STM32-044 待机唤醒实验-低功耗-M4-3

    功耗低功耗
    水管工
    发布于 :2022年10月29日 14:07:05

    【连载】【星光闪电STM32F407开发板】第十四章 低功耗实验

    本帖最后由 hejecu 于 2018-11-14 08:12 编辑 第十四章 低功耗实验14.1 实验目的本章学习STM32的低功耗控制,掌握如何进入
    发表于 11-14 08:08

    无线传感器网络节点低功耗系统设计

    。  2 低功耗实验与结果分析  2.1 ATmega324p小系统的功耗实验  ATmega324p小系统包括ATmega324p单片机、三星公司的S6B0741 LCD模块以及供电
    发表于 11-14 16:29

    测量低功耗实验中如何处理引脚问题?

    测量低功耗实验中如何处理引脚问题?
    发表于 02-08 06:50

    STM32F072单片机的低功耗实验

    STM32F072单片机的低功耗实验/STOP模式低功耗调前言新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个
    发表于 02-11 06:14

    低功耗实验

    基础的电子类资料,电子工程师必备文档,快来下载学习吧。
    发表于 07-04 15:02 6次下载

    通过键盘、LCD来进行超低功耗实验

    电子专业单片机开发中的学习教程资料——超低功耗
    发表于 08-08 15:17 5次下载

    单片机的实验环境参数记录仪的设计详析

    针对高精度的存储测试系统中很少利用实时记录的实验环境参数对其进行校准,文章设计了一种利用 MSP430FG4618单片机采集与实时显示实验环境参数如温度、湿度、大气压、风速及风向的超低功耗实验
    发表于 04-26 17:33 5次下载
    单片机的<b class='flag-5'>实验</b>环境参数记录仪的设计详析

    STM32F072单片机的低功耗实验/STOP模式低功耗调试

    STM32F072单片机的低功耗实验/STOP模式低功耗调前言新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个
    发表于 12-07 20:06 8次下载
    STM32F072单片机的<b class='flag-5'>低功耗</b><b class='flag-5'>实验</b>/STOP模式<b class='flag-5'>低功耗</b>调试

    实验:低功耗系统设计--基于NUCLEO-L476RG

    电子发烧友网站提供《实验:低功耗系统设计--基于NUCLEO-L476RG.pdf》资料免费下载
    发表于 09-26 09:38 0次下载
    <b class='flag-5'>实验</b>:<b class='flag-5'>低功耗</b>系统设计--基于NUCLEO-L476RG

    【GD32H757Z海棠派开发板使用手册】第五讲 PMU-低功耗实验

    PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32H7XX系列MCU具有三个电源域,包括VDD/VDDA电源域、0.9V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电。0.9V由内部LDO或者外部Vcore供电。在备份域中有一个电源切换器,当VDD/VDDA电源关闭时,电源切换器可以将备份域的电源切换到VBAT引脚,此时备份域由V
    的头像 发表于 04-20 09:32 1031次阅读
    【GD32H757Z海棠派开发板使用手册】第五讲 PMU-<b class='flag-5'>低功耗</b><b class='flag-5'>实验</b>

    【GD32F470紫藤派开发板使用手册】第五讲 PMU-低功耗实验

    通过本实验主要学习以下内容: PMU原理; 低功耗的进入以及退出操作
    的头像 发表于 05-07 09:29 682次阅读
    【GD32F470紫藤派开发板使用手册】第五讲  PMU-<b class='flag-5'>低功耗</b><b class='flag-5'>实验</b>

    【GD32F303红枫派开发板使用手册】第六讲 PMU-低功耗实验

    PMU即电源管理单元,其内部结构下图所示,由该图可知,GD32F303系列MCU具有三个电源域,包括VDD/VDDA电源域、1.2V电源域以及电池备份域,其中,VDD /VDDA域由电源直接供电。在VDD/VDDA域中嵌入了一个LDO,用来为1.2V域供电。在备份域中有一个电源切换器,当VDD/VDDA电源关闭时,电源切换器可以将备份域的电源切换到VBAT引
    的头像 发表于 06-02 10:12 735次阅读
    【GD32F303红枫派开发板使用手册】第六讲 PMU-<b class='flag-5'>低功耗</b><b class='flag-5'>实验</b>讲