您的位置:首页 > 汽车 > 新车 > STM32(F103ZET6)第十四课:低功耗模式和RTC实时时钟

STM32(F103ZET6)第十四课:低功耗模式和RTC实时时钟

2024/9/22 5:33:05 来源:https://blog.csdn.net/2401_83971583/article/details/141604642  浏览:    关键词:STM32(F103ZET6)第十四课:低功耗模式和RTC实时时钟

目录

  • 应用需求
    • 一、低功耗模式
      • 模式1.睡眠模式
      • 模式2.停止模式
      • 模式3.待机模式
    • 二、RTC实时时钟
      • 1.标准库开发
      • 2.主函数调用

应用需求

1.实现睡眠模式、停止模式和待机模式。
2.实现RTC实时时间显示。

一、低功耗模式

低功耗描述概念:
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。 在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。 因此, STM32 有专门的电源管理外设监控电源并管理设备的运行模式, 确保系统正常运行,并尽量降低器件的功耗。
如何降低功耗:从主控芯片角度上来说:
1、降低CPU的主频 72m->48m
2、将不必要的片上外设,关闭,以及对应的时钟也关闭
3、设备可以设置低功耗模式
电源原理图:
在这里插入图片描述
ADC 电源及参考电压(VDDA供电区域)。为了提高转换精度, STM32 的 ADC 配有独立的电源接口,方便进行单独的滤波。ADC 的工作电源使用 VDDA引脚输入,使用 VSSA作为独立的地连接, VREF引脚则为 ADC 提供测量使用的参考电压。
调压器供电电路(VDD/1.8V 供电区域)。在 STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及 RAM,调压器的输出电压约为 1.8V,因而使用调压器供电的这些电路区域被称为 1.8V 域。调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下, 1.8V 域全功率运行;在停止模式下 1.8V 域运行在低功耗状态, 1.8V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及SRAM 的内容;在待机模式下,整个 1.8V 域都断电,该区域的内核寄存器及SRAM 内容都会丢失(备份区域的寄存器不受影响)。
备份域电路(后备供电区域)。STM32 的 LSE 振荡器、 RTC 及备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过 STM32 的 VBAT 引脚获取供电电源,在实际应用中一般会使用 3V 的钮扣电池对该引脚供电。
按功耗由高到低排列, STM32 具有运行、睡眠、停止和待机四种工作模式。上电复位后 STM32 处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。
在这里插入图片描述
在这里插入图片描述

模式1.睡眠模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设(NVIC、Systick)全都还照常运行。有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是 WFI(wait for interrupt)和 WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。
本列就是用了中断去打断睡眠的。
在这里插入图片描述
在这里插入图片描述

模式2.停止模式

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,才可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。
在这里插入图片描述
 进入停止模式后, STM32 的所有 I/O 都保持在停止前的状态,而当它被唤醒时, STM32 使用 HSI 作为系统时钟(8MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启 HSE,把系统时钟设置回原来的状态。

在这里插入图片描述
从停机模式开始就需要用到PWR的库函数,首先要使能PWR外设时钟;
接着调用PWR_EnterSTOPMode进入停止模式,里面有两个参数选择,第一个选择电压调节器是打开还是处于低功耗模式,低功耗模式下唤醒会有一定的延时;第二个参数选择外部中断唤醒还是事件唤醒。停机模式只能由外部中断唤醒。
刚退出停止模式后,默认时钟变成HSI:8MHz
SystemInit();//调用这个函数,系统时钟恢复72MHz

模式3.待机模式

待机模式,它除了关闭所有的时钟,还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot 条件,从头开始执行程序。它有四种唤醒方式,分别是 1、WKUP(PA0)引脚的上升沿,2、 RTC 闹钟事件,3、 NRST 引脚的复位4、IWDG(独立看门狗)复位。
使用待机模式说明。
在这里插入图片描述

void EnterStanbdy(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//选择WKUP唤醒PWR_WakeUpPinCmd(ENABLE);//进入待机模式PWR_EnterSTANDBYMode();//退出待机模式之后,由于SRAM电压关了,所以清空了,退出之后代码需要重新运行
}
while(1){	KQMDealData();Su03tDealData();
//		//按键任务
//		//按键任务  每10ms执行if(keycnt[0]>=keycnt[1]){//过去10mskeycnt[0]=0;//按键非阻塞检测key3flag = key_value();if(key3flag == 2){			printf("进入待机模式\r\n");EnterStanbdy();}}

使能PWR时钟;
使用无参函数PWR_EnterSTANDBYMode();进入待机模式。
进入待机模式后,只能由特定的方式唤醒STM32:如设定RTC闹钟,使用RTC_SetAlarm();函数,当RTC的秒计数器等于设定的闹钟值时,会唤醒STM32;还有WKUP引脚的上升沿,使用函数PWR_WakeUpPinCmd(ENABLE);在对应的PA0引脚产生上升沿也能唤醒主机。
机模式唤醒后,相当于复位 STM32 芯片,程序重新从头开始执行。

二、RTC实时时钟

实时时钟是一个独立的定时器。 RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后, RTC的设置和时间维持不变。系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟。
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
RTC内部电路:
在这里插入图片描述
RTC由两个主要部分组成(参见下图)。第一部分(APB1接口)用来和APB1总线相连。此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作(参见16.4节)。 APB1接口由APB1总线时钟驱动,用来与APB1总线接口。
另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。 RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每个TR_CLK周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
在这里插入图片描述
RTC 从配置上分两大部分:时钟的配置和定时器的配置。
时钟的配置:可以直接访问,直接由RCC的BDCR来配置时钟:时钟源的选择。
定时器的配置:不可以直接访问,因为定时器相关的寄存器在备份区域。
1、 使能备份区域访问— PWREN、BKPEN
a) 开电源控制器以及备份区的时钟
b) 电源PWR_CR的DBP置1
2、 配置分频。
3、 设置计数器计数值。
4、 需要开中断,就开不需要就不开。
5、 需要设置闹钟,就设置闹钟。

1.标准库开发

标准库开发可以直接使用库函数

 /* Enable PWR and BKP clocks *///使能PWR和BKP时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);/* Allow access to BKP Domain */PWR_BackupAccessCmd(ENABLE);//使能后备区域访问/* Reset Backup Domain */BKP_DeInit();//强制给后备区域复位/* Enable LSE */RCC_LSEConfig(RCC_LSE_ON);//使能外部低速时钟/* Wait till LSE is ready *///等待低速时钟就绪while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){}/* Select LSE as RTC Clock Source *///选择RTC的时钟源RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);/* Enable RTC Clock */RCC_RTCCLKCmd(ENABLE);//使能RTC时钟/* Wait for RTC registers synchronization */RTC_WaitForSynchro();//等待APB1和RTC时钟同步/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();//等待上次写操作完成RTC_EnterConfigMode();//进入配置模式   //	RTC->CRL |= 0x1<<4;/* Enable the RTC Second */
//  RTC_ITConfig(RTC_IT_SEC, ENABLE);/* Wait until last write operation on RTC registers has finished *//* Set RTC prescaler: set RTC period to 1sec */RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) *//* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();/* Change the current time */RTC_SetCounter(ret);//修改计数器的值RTC_ExitConfigMode();//退出配置模式/* Wait until last write operation on RTC registers has finished */RTC_WaitForLastTask();}

2.主函数调用

在使用时,将转化的秒数传进RTC计时器中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
*之后在需要使用的地方得到开始计数的函数,
uint32_t sec=0;
sec = RTC_GetCounter();
再然后将其转化成time_t的形式
最后使用localtime()的结构体去调用它。
time_t seconds=sec;
struct tm info = localtime(&seconds);
然后用printf打印出来即可。
printf(“本地时间:%d-%02d-%02d %02d:%02d:%02d\r\n”,
info->tm_year + 1900, info->tm_mon + 1, info->tm_mday,
info->tm_hour, info->tm_min, info->tm_sec);

int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); SysTick_Config(72000);Led_Init();key_Init();while(1){	sec = RTC_GetCounter();time_t seconds=sec;struct tm *info = localtime(&seconds);if(ledcnt[0]>=ledcnt[1]){//过去500msledcnt[0]=0;/***LED1闪烁任务***/Led_Toggle(1);printf(" LED闪烁 \r\n");printf("本地时间:%d-%02d-%02d %02d:%02d:%02d\r\n",info->tm_year + 1900, info->tm_mon + 1, info->tm_mday,info->tm_hour, info->tm_min, info->tm_sec);cntt++;cntt%=100;}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com