STM32----RTC实时时钟,随机数发生器和待机唤醒

  • RTC实时时钟

RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。

    两个32位寄存器包含二进码十进制格式(BCD)的秒,分钟,小时(12或24小时制),星期几,日期,月份和年份。此外,还可以        提供二进制的亚秒值。

    系统可以自动将月份的天数补偿为28,29(闰年),30,31天。并且还可以进行夏令时补偿。

    其他32位寄存器还包含可编程的闹钟亚秒,秒,分钟,小时,星期几和日期。

    此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。

    上电复位后,所有的RTC寄存器都会受到保护,以防止可能的非正常写访问。

     RTC模块和时钟配置是在后备区域,即在系统复位或者待机模式唤醒后RTC的设置和时间维持不变,只要后备区域供电正常,           RTC将一直工作下去。但是在系统复位之后会自动禁止访问后备区域和RTC,以防止意外操作,所以在设置时间之前,要先取消       后备区域写保护。

 

RTC特征:

 

RTC相关库函数:

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

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

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

RTC初始化函数

ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);

typedef struct

{ uint32_t RTC_HourFormat;   //小时格式:24/12  

uint32_t RTC_AsynchPrediv;  //异步分频 系数  

uint32_t RTC_SynchPrediv; //同步分频系数

}RTC_InitTypeDe  

RTC日历配置相关函数    

ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);  

void RTC_GetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct);  

ErrorStatus RTC_SetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);  

void RTC_GetDate(uint32_t RTC_Format, RTC_DateTypeDef* RTC_DateStruct);  

uint32_t RTC_GetSubSecond(void);

RTC闹钟相关函数

ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState)

void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm,RTC_AlarmTypeDef* RTC_AlarmStruct);

void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm,RTC_AlarmTypeDef* RTC_AlarmStruct);

void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t                                                                                                                                                                   RTC_AlarmSubSecondValue,uint32_t  RTC_AlarmSubSecondMask)                  

uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);

 RTC周期唤醒相关函数

void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock);

void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter);

uint32_t RTC_GetWakeUpCounter(void);

RTC_WakeUpCmd(DISABLE);//关闭WAKE UP

 RTC 中断配置以及状态相关函数

void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState);

FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG);

void RTC_ClearFlag(uint32_t RTC_FLAG);

ITStatus RTC_GetITStatus(uint32_t RTC_IT);

void RTC_ClearITPendingBit(uint32_t RTC_IT);

RTC相关约束函数  

void RTC_WriteProtectionCmd(FunctionalState NewState);//取消写保护  

ErrorStatus RTC_EnterInitMode(void);//进入配置模式,RTC_ISR_INITF位设置为1  

void RTC_ExitInitMode(void)//退出初始化模式。 其他相关函数

uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR);

void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)

void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState);  

 

RTC日历配置步骤:

 

RTC闹钟配置步骤:

 

RTC周期性自动唤醒配置步骤:

 

  • 随机数发生器

      STM32F4自带了硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个32位的随机数。 两个连续的随机数的间隔为40个PLL48CLK时钟信号周期。 通过监控RNG熵来标识异常行为。 可以禁止来降低功耗。

    STM32F4的随机数发生器(RNG)采用模拟电路实现。此电路产生馈入线性反馈移位寄存器 (RNG_LFSR) 的种子,用于生成 32 位随机数。

    该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。RNG_LFSR 由专用时钟 (PLL48CLK) 按恒定频率提供时钟信息,因此随机数质量与 HCLK 频率无关。当将大量种子引入RNG_LFSR后,RNG_LFSR 的内容会传入数据寄存器 (RNG_DR)。

    同时,系统会监视模拟种子和专用时钟 PLL48CLK,当种子上出现异常序列,或PLL48CLK时钟频率过低时,可以由RNG_SR寄存器的对应位读取到,如果设置了中断,则在检测到错误时,还可以产生中断。

 

RNG库函数:

void RNG_DeInit(void);//复位
void RNG_Cmd(FunctionalState NewState);//使能RNG
uint32_t RNG_GetRandomNumber(void);//获取随机数

void RNG_ITConfig(FunctionalState NewState);
FlagStatus RNG_GetFlagStatus(uint8_t RNG_FLAG);
void RNG_ClearFlag(uint8_t RNG_FLAG);
ITStatus RNG_GetITStatus(uint8_t RNG_IT);
void RNG_ClearITPendingBit(uint8_t RNG_IT);

 

  • 待机唤醒

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

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

停止模式:所有时钟都已停止。1.8V内核电源工作。PLL,HIS和HSE RC振荡器功能禁止。寄存器和SRAM内容保留。

待机模式:1.8V内核电源关闭。只有备份寄存器和待机电路维持供电。寄存器和SRAM内容全部丢失。实现最低功耗。

 

//PWR_EnterSTANDBYMode函数
void PWR_EnterSTANDBYMode(void)
{
  /* Select STANDBY mode */
  PWR->CR |= PWR_CR_PDDS;
  
  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
  
  /* 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);  
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值