STM32复习笔记(十二)RTC实时时钟(低功耗待机唤醒)

版权声明: https://blog.csdn.net/qq_38351824/article/details/82655317

声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照正点原子的视频和文档的实际顺序梳理,转载请注明出处。

作者:sumjess

适用:这个视频我已经看过3遍了,总会有忘记的,所以来写这本书的随手笔记,记录重点、易忘点。该博客可以当做字典,也可以当做笔记。

目前内容:RTC实时时钟(低功耗待机唤醒)

一、RTC实时时钟特征与原理:

★  RTC (Real Time Clock):实时时钟

★  RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。

★  RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。

(1)RTC特征:

(2)RTC工作原理框图:

(3)RTC由两部分组成:

APB1接口:用来和APB1总线相连。通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC核心:由一组可编程计数器组成。分两个主要模块。

第一个是RTC预分频模块,它可以编程产生最长1秒的RTC时间基TR_CLK。如果设置了秒中断允许位,可以产生秒中断。

第二个是32位的可编程计数器,可被初始化为当前时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比,当匹配时候如果设置了闹钟中断允许位,可以产生闹钟中断。

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRLRSF位)被硬件置1才读。

二、RTC时钟源:

三、BKP备份寄存器:

备份寄存器是4216位的寄存器。可用来存储84个字节数据。

它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。

当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。

扫描二维码关注公众号,回复: 3461596 查看本文章

执行以下操作将使能对后备寄存器和RTC访问:

设置寄存器RCC_APB1ENRPWRENBKPEN位,使能电源和后备时钟。

设置寄存器PWR_CRDBP位,使能对RTC和后备寄存器的访问。

提醒:一共有4216位备份寄存器。常用来保存一些系统配置信息和相关标志位。

四、RTC相关寄存器:

RTC控制寄存器             (RTC_CRH,   RTC_CRL)

RTC预分频装载寄存器  (RTC_PRLHRTC_PRLL)

RTC预分频余数寄存器  (RTC_DIVH,  RTC_DIVL)

RTC计数器寄存器         (RTC_CNTHRTC_CNTL)

RTC闹钟寄存器             (RTC_ALRH RTC_ALRL)

五、RTC控制寄存器高位(RTC_CRH):

                                

①修改CRH/CRL寄存器,必须先判断RSF位,确定已经同步。

②修改CNT,ALR,PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式

③同时在对RTC相关寄存器写操作之前,必须判断上一次写操作已经结束,也就是判断RTOFF位是否置位。

       

      

      

      

     

六、RTC相关库函数讲解:

库函数所在文件: stm32f10x_rtc.c / stm32f10x_rtc.h

void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);

void RTC_EnterConfigMode(void);

void RTC_ExitConfigMode(void);

uint32_t  RTC_GetCounter(void);

void RTC_SetCounter(uint32_t CounterValue);

void RTC_SetPrescaler(uint32_t PrescalerValue);

void RTC_SetAlarm(uint32_t AlarmValue);

uint32_t  RTC_GetDivider(void);

void RTC_WaitForLastTask(void);

void RTC_WaitForSynchro(void);

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);

void RTC_ClearFlag(uint16_t RTC_FLAG);

ITStatus RTC_GetITStatus(uint16_t RTC_IT);

void RTC_ClearITPendingBit(uint16_t RTC_IT);

RTC时钟源和时钟操作函数:

 void RCC_RTCCLKConfig(uint32_t  CLKSource)//时钟源选择

 void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能

RTC配置函数(预分频,计数值:

void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL

void RTC_SetCounter(uint32_t CounterValue)//设置计数器值:CNTH/CNTL

void RTC_SetAlarm(uint32_t AlarmValue)//闹钟设置:ALRH/ALRL

RTC中断设置函数:

 void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH

RTC允许配置和退出配置函数:

void RTC_EnterConfigMode(void);//允许RTC配置 :CRL CNF

void RTC_ExitConfigMode(void);//退出配置模式:CRL CNF

同步函数:

void RTC_WaitForLastTask(void)//等待上次操作完成:CRLRTOFF

 void RTC_WaitForSynchro(void)//等待时钟同步:CRLRSF

相关状态位获取清除函数:

FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);

void RTC_ClearFlag(uint16_t RTC_FLAG);

ITStatus RTC_GetITStatus(uint16_t RTC_IT);

void RTC_ClearITPendingBit(uint16_t RTC_IT);

其他相关函数(BKP等)

 PWR_BackupAccessCmd();//BKP后备区域访问使能

RCC_APB1PeriphClockCmd();//使能PWRBKP时钟

RCC_LSEConfig();//开启LSERTC选择LSE作为时钟源

其他相关函数(BKP等)

 PWR_BackupAccessCmd();//BKP后备区域访问使能

uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//BKP寄存器

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//BKP

七、RTC配置一般步骤:

使能PWRBKP时钟:RCC_APB1PeriphClockCmd();

②  使能后备寄存器访问:   PWR_BackupAccessCmd();

③  配置RTC时钟源,使能RTC时钟:

      RCC_RTCCLKConfig();

      RCC_RTCCLKCmd();

      如果使用LSE,要打开LSERCC_LSEConfig(RCC_LSE_ON);

设置RTC预分频系数:RTC_SetPrescaler();

⑤ 设置时间:RTC_SetCounter();

⑥开启相关中断(如果需要):RTC_ITConfig()

⑦编写中断服务函数:RTC_IRQHandler();

⑧部分操作要等待写操作完成和同步。

   RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

   RTC_WaitForSynchro();  //等待RTC寄存器同步

待机唤醒

很多单片机有低功耗模式,STM32也不例外。在系统或者电源复位后,微控制器出于运行状态之下,HCLKCPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发。

九、STM323种低功耗模式:

睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。

停止模式:所有时钟都已停止。1.8V内核电源工作。

                         PLL,HISHSE RC振荡器功能禁止。

                         寄存器和SRAM内容保留。

待机模式:1.8V内核电源关闭。

                         只有备份寄存器和待机电路维持供电。

                         寄存器和SRAM内容全部丢失。实现最低功耗。

在运行模式下,可以通过下面方式降低功耗:

① 降低系统时钟。

② 关闭APBAHB总线上未被使用的外设时钟

用户根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式

待机模式理想状态下,只需要2uA电流。停机模式下典型电流为20uA

(1)PWR_CR电源控制寄存器:

设置PDDS位进入深度睡眠时进入待机模式。

设置CWUF位,清除之前的WUF唤醒位。

(2)PWR_CSR电源控制/状态寄存器:

① 设置EWUP,使能WKUP引脚用于待机模式唤醒。

WUF唤醒标志,用来判断是否发生唤醒事件。

十、固件库中低功耗操作函数:

文件:stm32f10x_pwr.c  / stm32f10x_pwr.h

 void PWR_EnterSTOPMode();//进入停机模式

void PWR_EnterSTANDBYMode(void);//进入待机模式

void PWR_WakeUpPinCmd(FunctionalState NewState);//使能Wakeup引脚唤醒

FlagStatus PWR_GetFlagStatus(uint32_t PWR_FLAG);

void PWR_ClearFlag(uint32_t PWR_FLAG); 

文件: core_cm3.h

__WFI() ;

__WFE() ;

十一、PWR_EnterSTANDBYMode函数:

void PWR_EnterSTANDBYMode(void)
{
  PWR->CR |= PWR_CR_CWUF; /* Clear Wake-up flag */
  PWR->CR |= PWR_CR_PDDS; /* Select STANDBY mode */
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB->SCR |= SCB_SCR_SLEEPDEEP;
/* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM   )
  __force_stores();
#endif
  /* Request Wait For Interrupt */
  __WFI();//
} 

十二、PWR_EnterSTOPMode函数:

void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
{
  uint32_t tmpreg = 0;
  
tmpreg = PWR->CR;
tmpreg &= CR_DS_MASK;
tmpreg |= PWR_Regulator;  
PWR->CR = tmpreg;
SCB->SCR |= SCB_SCR_SLEEPDEEP;
  
if(PWR_STOPEntry == PWR_STOPEntry_WFI){   
     __WFI();   
  }else{    
    __WFE();   
   }
  
SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);  
}

十三、待机唤醒配置步骤:

使能电源时钟。

    因为要配置电源控制寄存器,所以必须先使能电源时钟。

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

设置WK_UP引脚作为唤醒源。

   设置PWR_CSREWUP位,使能WK_UP用于将CPU从待机模式唤醒。

   PWR_WakeUpPinCmd(ENABLE);  //使能唤醒管脚功能

设置SLEEPDEEP位,设置PDDS位,执行WFI指令,进入待机模式。

   void PWR_EnterSTANDBYMode(void)

猜你喜欢

转载自blog.csdn.net/qq_38351824/article/details/82655317