STM32开发 -- 低功耗模式详解(2)

发布者:平章大人最新更新时间:2019-09-02 来源: eefocus关键字:STM32  低功耗模式 手机看文章 扫描二维码
随时随地手机看文章

简单的总结了一下低功耗的三种模式。

但是还留了不少问题需要搞清楚。

接下来继续总结。。


一、其他几种退出待机模式的方法:

上篇文章只介绍了通过WKUP引脚上的上升沿退出待机模式。接下来再看一下剩下的RTC闹钟事件的上升沿、 NRST引脚上外部复位、 IWDG复位该如何操作呢?


RTC闹钟事件的上升沿

RTC部分之前是有讲过的:

参看:STM32开发 – RTC详解

参看:STM32开发 – 时钟系统详解

参看:STM32开发 – Systick定时器


软件实现:

参看:stm32f103的RTC作为闹钟唤醒单片机待机模式RTC_Alarm.rar

或者 百度网盘下载


●RTC中断配置


static void RTC_NVIC_Config(void)

{    

    NVIC_InitTypeDef NVIC_InitStructure;


    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;        //RTC全局中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;    //先占优先级1位,从优先级3位

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        //使能该通道中断

    NVIC_Init(&NVIC_InitStructure);        //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

}


●RTC闹钟初始化:启动时钟、配置LSI做RTC时钟、设置预分频40000得到1Hz设置运行时间WORK_TIMES


void RTC_Alarm_Configuration(void)

{

/* Enable PWR and BKP clocks */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

/* Allow access to BKP Domain */

PWR_BackupAccessCmd(ENABLE);

/* Reset Backup Domain */

BKP_DeInit();


    /* RTC clock source configuration ----------------------------------------*/

/* Enable the LSI OSC */

  RCC_LSICmd(ENABLE);

    /* Wait till LSI is ready */

    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)

    {

    }

    /* Select the RTC Clock Source */

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

    /* Enable the RTC Clock */

    RCC_RTCCLKCmd(ENABLE);

/* Wait for RTC registers synchronization */

RTC_WaitForSynchro();

/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask(); 

/* 使能RTC闹钟中断*/

RTC_ITConfig(RTC_IT_ALR, ENABLE);

/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();

/* Set RTC prescaler: set RTC period to 1sec */

RTC_SetPrescaler(40000);

/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();

//中断配置

RTC_NVIC_Config();


//设置运行WORK_TIMES

RTC_SetAlarm(RTC_GetCounter() + WORK_TIMES);

RTC_WaitForLastTask();

}


●设置闹钟时长并进入待机,s为中断秒数


void RTC_Enter_StandbyMode(u32 s)

{


    RTC_SetAlarm(RTC_GetCounter() + s);

    RTC_WaitForLastTask();

    // 进入待机模式, 此时所有1.8V域的时钟都关闭,HIS和HSE的振荡器关闭, 电压调节器关闭.

    // 只有WKUP引脚上升沿,RTC警告事件,NRST引脚的外部复位,IWDG复位.

/* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */

    PWR_EnterSTANDBYMode();

}


●中断服务函数


void RTC_IRQHandler(void)

{

 if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断

 {

  RTC_ClearITPendingBit(RTC_IT_ALR);  //清闹钟中断

RTC_Enter_StandbyMode(STANDBY_TIMES);//进入待机

 }                 

}


上面的这个示例,不是真正的RTC闹钟唤醒。而是通过闹钟来进入待机模式的。

不过根据需要更改一下代码,就可以得到相关的功能了。

重点在于RTC中断配置,和RTC_SetAlarm闹钟设置,这些倒是我之前没有总结过的。


IWDG复位

看门狗之前也有讲过的,参看:STM32开发 – 看门狗详解


//保存 WWDG 计数器的设置值,默认为最大.

u8 WWDG_CNT=0x7f;

//初始化窗口看门狗

//tr :T[6:0],计数器值

//wr :W[6:0],窗口值

//fprer:分频系数(WDGTB) ,仅最低 2 位有效

//Fwwdg=PCLK1/(4096*2^fprer).

void WWDG_Init(u8 tr,u8 wr,u32 fprer)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE); // WWDG 时钟使能

WWDG_CNT=tr&WWDG_CNT; //初始化 WWDG_CNT.

WWDG_SetPrescaler(fprer); //设置 IWDG 预分频值

WWDG_SetWindowValue(wr); //设置窗口值

WWDG_Enable(WWDG_CNT); //使能看门狗,设置 counter

WWDG_ClearFlag(); //清除提前唤醒中断标志位

WWDG_NVIC_Init(); //初始化窗口看门狗 NVIC

WWDG_EnableIT(); //开启窗口看门狗中断

}

//重设置 WWDG 计数器的值

void WWDG_Set_Counter(u8 cnt)

{

WWDG_Enable(cnt); //使能看门狗,设置 counter .

}

//窗口看门狗中断服务程序

void WWDG_NVIC_Init()

{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //WWDG 中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占 2 子优先级 3 组 2

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //抢占 2,子优先级 3,组 2

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure); //NVIC 初始化

}

void WWDG_IRQHandler(void)

{

WWDG_SetCounter(WWDG_CNT); //当禁掉此句后,窗口看门狗将产生复位

WWDG_ClearFlag(); //清除提前唤醒中断标志位

LED1=!LED1; //LED 状态翻转

}


在待机模式下,使用窗口看门狗,然后产生看门狗复位。

这个代码只做参考,没试过不知道能不能用。。。


二、低功耗模式概念介绍

在这里插入图片描述

上图里低功耗模式介绍里的内核、外设、系统时钟、1.8v内核电源,这些都是什么??

需要了解一下的。


1、电源

STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。

当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

在这里插入图片描述

可以看出VDD为STM32提供供电,通过内置的电压调节器提供所需的1.8V电源,

1.8V供电区域为CPU核心存储器和内置数字外设。

当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

VBAT是后备供电也就是通过后备电池来供电的。其供电区域为LSE 32K晶体振荡器、后备寄存器RCC BDCR和寄存器RTC。


在这里插入图片描述

现在再看这张低功耗的图。

停机和待机模式关闭的是所有1.8V区域的时钟。

其中待机对于VDD区域时钟的影响是HSI和HSE的振荡器关闭。

也就是说待机电路(唤醒逻辑和IWDG)是没有影响的,所以才能通过WKUP引脚的上升沿、IWDG复位等来唤醒呀。


2、外设

这里又有问题了,那么1.8V供电区域的置数字外设包含什么呢?

没有找到包含的数字外设,不过所有的内置外设倒是可以看一下。

在这里插入图片描述

其实最直观的就是看它的系统结构不就好了嘛。哈哈


在这里插入图片描述在这里插入图片描述

3、系统时钟

上面老是提时钟时钟的,到底包含哪些时钟?

其实之前讲过的啦。

参看:STM32开发 – RTC详解

参看:STM32开发 – 时钟系统详解


在这里插入图片描述

那么停机和待机模式下,关闭所有1.8V区域的时钟。

是不是意味着关闭了内置数字外设时钟 APB1和APB2线上外设时钟PCKL1/PCLK2??


而在睡眠模式下CPU时钟关闭,对其他时钟和ADC时钟无影响。

这里的CPU时钟是不是就是Cortex系统时钟HCLK 呢??

(请大佬告知)


三、STM32F4低功耗模式

主要是比较一下:

stm32f10x_pwr.c 和 stm32f4xx_pwr.c

下载:百度网盘

发现多出了一些功能。


多出什么功能呢?? 下次有时间再写。。。


四、HAL库低功耗操作

还有以上讲的都是标准库,那么具体到HAL库低功耗又该如何操作?

首先HAL库和标准库的比较,需要了解一下。

参看:HAL库和标准库的比较 (哈哈,还没写)

然后这部分其实专门问过正点原子,2015年以后的都用HAL库。

那就简单了,网上找到对应的开发资料,程序源码里都是HAL库版本的例程。

加以参看说明就是了。

下载:正点原子阿波罗STM32F429开发板资料

在这里插入图片描述

或者参看:STM32MX电源管理低功耗模式

这里就不再重复讲了,重要的是学会举一反三。


五、总结思考

这篇文章主要是讲了一下待机模式通过RTC闹钟和看门狗复位进行退出待机功能、还有一些系统时钟、外设、电源等的概念。


还是剩下一些问题没有讲:

这三种低功耗模式该如何选择呢?

具体硬件该怎么测低功耗呢?

GPS/4G模块/蓝牙进入休眠和其他功能电路供电切断 这些又该如何操作?


且听下回分解!!!

关键字:STM32  低功耗模式 引用地址:STM32开发 -- 低功耗模式详解(2)

上一篇:STM32开发 -- 主天线和分集天线
下一篇: STM32开发 -- 低功耗模式详解(1)

推荐阅读最新更新时间:2024-11-09 15:12

STM32单片机一般有几种调试方式(stm32与TDC SPI通信调试)
STM32单片机介绍 STM32单片机是由意法半导体(STMicroelectronics)公司开发和生产的一系列32位ARM Cortex-M内核的微控制器。它们广泛应用于工业自动化、消费电子、通信、汽车电子和物联网等领域。 STM32单片机系列涵盖了多个系列和型号,以满足不同应用需求和性能要求。常见的系列包括: 1. STM32F系列:基于ARM Cortex-M4或Cortex-M7内核,具有强大的处理能力和丰富的外设资源,适用于高性能应用。 2. STM32L系列:基于ARM Cortex-M0+或Cortex-M3内核,具有低功耗特性和优异的能效表现,适用于电池供电和低功耗应用。 3. STM32H系列:基于ARM
[单片机]
<font color='red'>STM32</font>单片机一般有几种调试方式(<font color='red'>stm32</font>与TDC SPI通信调试)
零基础入门STM32定时器配置及其中断设置
  我们大家都知道STM32定时器比较多,但调试都是一样的,寄存器都是一一对应的。就拿tiM2举例说明。在网上搜了好多关于定时器的设置,但大多数都是一个版本,而且都是针对库函数操作的,让人看起来一头雾水,对于初学者很是不利(我也是初学者)。下面我将自己的定时器设置过程一一记录下来,以供大家参考,我们共同学习……   首先定义定时器头文件,也就是定义寄存器以供操作:   #define TIM2_CR1 (*((volatile unsigned long *)0x40000000))   #define TIM2_CR2 (*((volatile unsigned long *)0x40000004))   #define
[单片机]
关于STM32系列微控制器的几点认识
STM32系列微控制器是意法半导体旗下的产品,凭借着自身的高性能,低功耗,丰富的数字外围设备和强大的电气处理能力等优势,广泛地应用在工业控制及自动化,消费类电子产品,智能硬件等领域。很多院校和嵌入式培训机构都选用此系列微控制器作为典型的教材! 此系列微控制器采用ARM CORTEX-M处理器内核,关于ARM架构的优势,毋庸置疑是最优秀的架构之一,其CORTEX-A系列微处理器几乎垄断整个移动设备领域!在ARM内核基础上,ST加上自己的数字外围设备,使其具备处理复杂电气问题的能力,例如通过定时器的PWM功能控制电机,通过普通输出端口控制外部继电器,通过片上AD获得外部模拟信号等等,以此系列微控制器为主控的产品不计其数,例如伺服电机
[单片机]
关于<font color='red'>STM32</font>系列微控制器的几点认识
STM32通定时器时间设置步骤和计算公式方法寄存器值
一、STM32通用定时器原理 STM32 系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(
[单片机]
<font color='red'>STM32</font>通定时器时间设置步骤和计算公式方法寄存器值
STM32基础4--中断系统
为什么需要中断 在使用单片机时,最开始我们会使用一个Main函数,然后所有的功能都往里丢。在任务少的时候,并没有什么问题。例如在main函数添加点亮LED,添加延时函数,添加KEY扫描。 一切都好像完美运行,但是如果我们将延时的时间加长,然后去KEY,这时候我们可以发现,我们按的KEY时好是坏。这时候我们就会很痛苦了,我们需要长时间的延时,但是又想我们的KEY功能正常,我们不得不想办法解决这个问题,如果每次按下KEY时,我们都让单片机先去响应KEY的功能,我们就不会有按键时好时坏的感觉了,响应完KEY的功能后,我们在回来执行延时。 为了清除的描述上面的情况,我们取了新的词语描述整一个过程 KEY按下 --中断源请求
[单片机]
<font color='red'>STM32</font>基础4--中断系统
关于STM32的计数与延时
Ⅰ关于STM32的计数和延时 在STM32中,具有计数(或计时)功能的模块基本都能实现延时功能。如:系统滴答SysTick、定时器TIM、实时时钟RTC、看门狗WDG。 精确延时一般使用定时器TIM即可实现。当然,是否精确,取决于你的主频(也就是晶振)是否准确,如果主频精确,那么实现的延时也一定精确。 一般来说,常温下实现us微秒级的延时,误差还是挺小的(应该说挺精确)。拿F407,主频168M来说,可以实现几十ns纳秒的延时,如果选用高精度的晶振,误差还是很小的。 总结:想要TIM定时器实现高精确的延时,就需要高精度的晶振。主频精确,那么延时就精确。 ⅡSTM32的TIM定时器 STM32的定时器有3类: 高级定
[单片机]
关于<font color='red'>STM32</font>的计数与延时
基于STM32的PS2遥控小车
摘要:PS2手柄是索尼的PlayStation2游戏机的遥控手柄。索尼的psx系列游戏主机在全球很是畅销。不知什么时候便有人打起ps2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的智能小车。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。 1.PS2手柄控制 PS2手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机(也可叫作主机,可直接用在PS2游戏机上)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。 2.PS2手柄时序 1、CS线在通讯期间拉低,通信过程中CS信号线在一串数据(9个字节,每
[单片机]
基于<font color='red'>STM32</font>的PS2遥控小车
安全启动 - STM32安全启动架构
安全需要一个起点。 现在我们理解,没有安全启动,设备平台的安全难以得到保证。安全启动要求启动的位置一定是固定在某个地方。那么固定启动位置靠什么保证? 必须靠硬件 。软件本身的特点,决定了它很容易被修改,即使做了加密和加扰,破解的难度依然比硬件低很多。所以,安全启动一定是靠 STM32 硬件来保证。 脱离硬件谈安全启动基本上是不可能的 。 实现 Root of Trust(信任根)通用的做法是什么呢?一般是, 芯片有一个 Bootrom 启动只读存储区 。硬件的设计保证,芯片加电启动一定是从这个只读的甚至不可见的 Bootrom 里执行。 事实上,保持安全启动的原则不变,但是实现的方式可以不一样。 对于这个 Bootrom,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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