历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-09-02 来源:eefocus

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

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

接下来继续总结。。


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

上篇文章只介绍了通过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模块/蓝牙进入休眠和其他功能电路供电切断 这些又该如何操作?


且听下回分解!!!

推荐阅读

史海拾趣

Bharat Electronics Ltd公司的发展小趣事

作为电子行业的领军企业,BEL始终注重技术创新和研发。公司不断投入大量资源用于新产品的研发和创新,努力引领行业趋势。近年来,BEL在无人机、太阳能电池组等领域取得了显著成果,推出了一系列具有创新性和市场竞争力的产品,为公司的持续发展注入了新的活力。

Goodwork Semiconductor ( GW )公司的发展小趣事
可控硅稳压器能够快速响应电压变化,及时调整输出电压,保持电压稳定。
DC Components公司的发展小趣事

DC Components公司在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的环境影响。此外,公司还积极参与公益活动,回馈社会,为社区的和谐发展做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

Belden Wire and Cable公司的发展小趣事

1902年,Joseph C. Belden在美国伊利诺伊州芝加哥创立了Belden公司。在创立初期,公司主要生产电线和电缆产品,并逐渐在行业内崭露头角。1905年,经过大量的实验和研究,Belden公司成功研发出“Beldenamel”绝缘材料,这种灵活的搪瓷绝缘材料极大地提升了线缆的性能和可靠性,为公司的早期发展奠定了坚实的基础。

乔光电子(FTR)公司的发展小趣事

随着全球化的深入发展,Belden公司开始积极拓展国际市场。通过在全球范围内设立分支机构和工厂,百通不仅提升了自身的产能和效率,也更好地满足了全球客户的需求。同时,公司还不断推出新产品和新技术,拓展在工控线缆、音视频线缆和计算机网络等领域的市场份额。如今,Belden已经成为全球最大的综合布线及专业线缆制造商之一,其产品和服务遍布全球各地。

这五个故事只是Belden Wire and Cable公司发展历程中的一部分,但它们都客观地反映了公司在电子行业里不断发展、创新和壮大的事实。通过这些故事,我们可以看到一个企业通过不断创新和拓展市场,逐渐成长为行业领导者的过程。

Global Specialties公司的发展小趣事

在电子技术的不断推动下,Global Specialties始终保持对新技术的高度敏感。公司不断投入研发资源,对现有产品进行升级换代,并推出了一系列具有创新性的新产品。例如,公司开发的智能测试仪器能够自动完成复杂的测试任务,大大提高了测试效率和准确性。这些技术创新不仅巩固了Global Specialties在业内的领先地位,还为公司带来了更多的商业机会。

问答坊 | AI 解惑

74LS**与74HC**的区别

74LS属于TTL类型的集成电路,而74HC属于CMOS集成电路。 LS、HC 二者高电平低电平定义不同,HC高电平规定为0.7倍电源电压,低电平规定为0.3倍电源电压。LS规定高电平为2.0V,低电平http://www.51dz.com/index.asp?i=kjf888为0.8V。 带负载特性不同 ...…

查看全部问答>

三菱伺服电压问题

我用的三菱J3驱动器,输入电压是三相200V(用电压表量过了),用驱动器自测母线电压Pn为280V左右,这自测的母线电压是不是交流电的峰值电压阿?还有在电机行走的时候,用万用表量驱动器输入电压,电压会在200v~400V之间跳动,这是为什么啊?是馈电 ...…

查看全部问答>

vxworks销售,绝对好用

4个软件包,绝对超值,包括tornado,bsp,windview,wind ml 3.0,价格1000,可协商,需要者致电havebettertime@163.com…

查看全部问答>

有想写嵌入式图书的作者请进

我是出版社编辑,哪位作者想写嵌入式方面的图书请与我联系. 请先发邮件到book1402@163.com …

查看全部问答>

新手,ARM汇编宏定义问题。。

        GBLS String         GBLL Logic         GBLA Var String SETS \"test\" Logic SETL {TRUE} Var SETA 0xff ;-----------------------------------------------   &n ...…

查看全部问答>

嵌入式linux下通信的方案咨询、感谢大拿指点

嵌入式linux下通信的方案咨询、感谢大拿指点 ------------------------------------------------------------------------------- /目标/: 实现 \" ARM(s3c2410)-Linux2.4.18 \" 与 \" DSP LF2812 模块 \" 两个系统之间大约 18KB/s 的三维实 ...…

查看全部问答>

关于int13中断和硬盘底层驱动的关系

大家好,我刚学习驱动,对于一些基本的概念还不甚理解,请大家帮忙,谢谢 我的问题就是bios的int13和硬盘的驱动到底是什么关系,驱动在硬盘读写过程中究竟扮演什么角色? 是api函数调用bios的中断函数,然后再由bios的中断函数调用硬盘驱动完成读 ...…

查看全部问答>

华为硬件工程师手册

废话不说了,一本不错的书…

查看全部问答>

关于信捷PLC输出点烧毁的问题

关于信捷PLC输出点烧毁的问题 信捷的输出点已经接上中间继电器,怎么内部的输出继电器被烧毁?…

查看全部问答>

最爱TI Stellaris发帖整理

发现很多朋友都在找一些我以前发过的资料,特意把以前自己发过的自觉对大家有一些帮助的帖子整理一下: 新年献礼:TI Stellaris系列原理图和封装https://bbs.eeworld.com.cn/viewthread.php?tid=232363 新年献礼:LM3S8962开发板接2.8寸TFT移植 ...…

查看全部问答>