历史上的今天

今天是:2024年09月02日(星期一)

正在发生

2019年09月02日 | STM32开发 -- 低功耗模式详解(2)

发布者:平章大人 来源: 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)

推荐阅读

   irreader 最独特的一个功能就是可以添加自定义源,也就是说它除了可以订阅 RSS 之外,还能订阅网页、播客等内容,比如知乎、豆瓣、B 站等。当你每天要关注的信息越来越多,用 RSS 进行订阅是个不错的方法。你可以把想关注的信息聚合在一起,进行高效的浏览和阅读。不过从 Google 停掉 Google Reader 开始,很多知名的 RSS 阅读器都陆续...
电子后视镜是一个很有用的科技部件,不仅比传统后视镜的视角更广,而且还更加美观,但是由于目前在各国的法律中,规定了汽车必须安装后视镜,所以除非你愿意在车上安装两套不同的后视镜,那么你几乎不可能享受到这个技术带来的便利。不过最近在美国,似乎在考虑是否可以让电子后视镜合法上路。美国的国家公路交通安全管理局(NHTSA)宣布,它将最终开始测试...
除了各色格子衫、黑框眼镜、007加班狂这些刻板印象,大众对工程师这一职业实在了解甚少。为了了解工程师神秘的灵魂,测试测量公司NI携手中国电子工程专业媒体《电子工程专辑》对工程师进行了深度调研,剖析作为前沿科技与人类生活的连接者,作为推动美好生活发展的关键人物的心声。 从受访的1,200多位工程师不难发现,广东是工程师们的大本营,这与跟产业...
  温度过高对防爆电机的影响  防爆电机一般要求的环境温度为-20~40℃,温度组别为T4,最高表面温度不超过135℃,如果环境温度超过40度对电机有没有影响呢。防爆电机高温主要影响的是电机材料的绝缘,如果温度过高电机的绝缘材料融化,会造成短路烧毁防爆电机,那么我们先说一下防爆电机的绝缘材料。  电动机的绝缘等级是指其所用绝缘材料的耐热等级...

史海拾趣

问答坊 | AI 解惑

[超精华]单片机51实验板设计原理图.rar

比较好的学习单片机的资料 和大家分享下…

查看全部问答∨

混合信号测试

在调试嵌人式系统时,有时要求能够同时查看模拟和数字信号。在这种混合信号环境中,通常无法准确地预测开发过程中将会出现的问题类型。如何解决这样的难题?…

查看全部问答∨

你理想中的智能家居什么样?

一直在提“智能家居”,大家觉得是个什么概念? 附文: 相信大家都对“4S”这个词不会陌生,通常所说的“4S”店是集汽车销售、维修、配件和信息服务为一体的销售店,它是一种以“四位一体”为核心的汽车特许经营模式,包括整车销售(Sale) ...…

查看全部问答∨

一个LED的N种玩法(八)—旁门左道

一个LED的N种玩法(八)—旁门左道 Author: chenzhufly Email: chenzhufly@126.com 2010-05-11     一路写来,由浅入深,自己也学到了不少东西,比如多线程和freertos都是我第一次使用,所以写的也不是特别的深入,希望大家谅解, ...…

查看全部问答∨

passthru调试没问题,直接跑就死机

我用windbg设断点,一步步走没问题之后,把断点全都去掉,也没有问题。 但是如果不进调试模式,直接装passthru,就会死机,咋回事呢 …

查看全部问答∨

无线网络下单片机和PC通过无线网卡通讯的问题

想实现多个单片机和一个pc的无线通讯(通过无线网卡), 那位兄弟做过这方面的开发,还望赐教。 注:单片机是一个手持设备,在别的房间有一台pc,当然,pc上有无线网卡,如何实现pc到单片机,单片机到pc的通讯? 给出参考文章、或说出思路的都行, ...…

查看全部问答∨

急求 win ce 高手

急求:基于 win ce 的北京地区的软件开发高手 个人想做个基于 win ce 的PDA 应用软件,主要是数据统计和分析,类似excel表格的那种,请北京地区做过这种软件开发的高手联系:QQ:451719657…

查看全部问答∨

离散频谱内插后?

请教下大家,离散频谱进行内插后会发生什么变化,比如我有28.8MHz,速率为61.44MSPS的信号,2倍内插到速率为122.88MSPS,那么28.8MHz还存在的同时,会不会有其他镜像呢?急待答案,谢谢各位…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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