Stm32之RTC时钟

1.时钟框图:

  • 先将之前没做笔记的时候的时间框架图补上:

    同样源自正点原子的PPT,图中红框的部分为RTC的时钟源,有三种:

    • HSE的128分频;

    • LSI(大概40kHz)

    • LSE(原子精英板上外接32.768kHz)

  • RTC内部的时钟图:

    内部共有三个中断:

    • RTC_Second秒中断,即每个TR_CLK脉冲 (通常设置为1hz,即脉冲时间周期1s) 均会中断一次;

      图中的预分频器主要目的也是为了将RTC_CLK分频产生TR_CLK为1s的脉冲

    • RTC_OverfloW溢出中断,即32位RTC_CNT计数器满值后溢出产生的中断;

    • RTC_Alarm闹钟中断,即我们先设定在ALR寄存器中的值,当CNT向上计数到于ALR的值相等时,产生的中断,该中断即是外部中断线17,EXTI17的中断,可由其来配置是中断/事件。

    • 一点补充:

      RTC_PRL(19位)是将RTC_CLK分频,即将RTC_CLK的时钟脉冲周期倍数增大 (见下面公式)

      fTR_CLK=fRTC_CLKRTC_PRL+1TTR_CLK=TRTC_CLK∗(RTC_PRL+1)f_{TR\_CLK}=\frac{f_{RTC\_CLK}}{RTC\_PRL+1}\\ T_{TR\_CLK}=T_{RTC\_CLK}*{(RTC\_PRL+1)} fTR_CLK​=RTC_PRL+1fRTC_CLK​​TTR_CLK​=TRTC_CLK​∗(RTC_PRL+1)
      而RTC_DIV是余数寄存器,记录的是原时钟源脉冲的时钟周期数,余数可以理解为倍数后的TR_CLK的小数部分的意思。其在RTC_CLK脉冲下由PRL的值递减到0,再重装载。

2.寄存器介绍

1)RTC内部寄存器:

  • RTC_CRH(Control Register High):只有低三位有效[2:0],分别是[2]OWIE*(溢出中断使能位)*;[1]ALRIE (闹钟中断使能位);[0]SECIE (秒中断使能位)【均是1开启使能】

  • RTC_CRL(Control Register Low):低六位有效:(以下按顺序位6到位0)

    • RTOFF (RTC operation OFF): 指示对其寄存器进行的最后一次操作的状态(1上次操作已完成,0上次操作未完成),只能读;常在程序中,等待其为1时来检测操作是否完成。
    • CNF (Configuration flag):由软件置1和清0;只有其置1后才可以操作(写)CNT,ALR, PRL.
    • RSF (Registers synchronized flag):寄存器同步标志位,其置1后即表示CNT,ALR,PRL的值已被同步到APB1接口上;只有等待其置1后才可以读CNT,ALR,PRL的值
    • OWF (溢出中断标志位),ALRF (闹钟中断标志位),SECF (秒中断标志位)
  • RTC_PRLL和RTC_PRLH:装载PRL*(Prescaler ReLoad Low/High )*的值,共19位

  • RTC_DIVH 和RTC_DIVL (RTC clock Divider )装载着余数的值,只能读,可以获得精确的时间测量,因为其时钟周期为RTC_CLK(即为分频前,时钟周期更短)。共19位,递减溢出后重装载为PRL的值。

  • RTC_CNTH和RTC_CNTL (32位的计数器) 用来存放递增的计数器;

  • RTC_ALRH和RTC_ALRL (32位闹钟值设置寄存器) ,用于设置闹钟值,即于CNT比较的值,注意其受RTOFF位保护,当且RTOFF为1时才可操作;

2)RTC相关寄存器:

  • BKP*(BacK Prepare Rrgister)*备份寄存器,42 * 16位寄存器组成(可存84Bytes数据);断电时可由Vbat供电保证数据数据不丢失,待机唤醒,不随系统复位;

  • RCC_APB1ENR的PWREN和BKPEN相关时钟使能位,来打开电源和后备接口的时钟

    电源控制寄存器(PWR_CR)的 DBP 位来使能对后备寄存器和 RTC 的访问。

3.库函数使用:

这里原子的PPT给的非常详细了:

对于RTC的配置步骤:

4.原子代码的使用

只需要将原子内的rtc.c和让rtc.h加入文件即可;

  • 在初始化前建议将RTC_Init()中的标志位即当前时间更改;如下:

    (因为代码内无法高亮,用四个!!!!标出)

    u8 RTC_Init(void)
    {//检查是不是第一次配置时钟u8 temp=0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);  //使能PWR和BKP外设时钟   PWR_BackupAccessCmd(ENABLE);  //使能后备寄存器访问  if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)        //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎//!!!!此处的标志与下面的标志位对应更改才可以初始化,第一次时有效0x5051改成0x任意16位数(与下文对应即可){                BKP_DeInit();  //复位备份区域    RCC_LSEConfig(RCC_LSE_ON);  //设置外部低速晶振(LSE),使用外设低速晶振while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)  //检查指定的RCC标志位设置与否,等待低速晶振就绪{temp++;delay_ms(10);}if(temp>=250)return 1;//初始化时钟失败,晶振有问题     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);     //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    RCC_RTCCLKCmd(ENABLE);    //使能RTC时钟  RTC_WaitForLastTask();   //等待最近一次对RTC寄存器的写操作完成RTC_WaitForSynchro();      //等待RTC寄存器同步  RTC_ITConfig(RTC_IT_SEC, ENABLE);     //使能RTC秒中断RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成RTC_EnterConfigMode();/// 允许配置 RTC_SetPrescaler(32767); //设置RTC预分频的值RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成RTC_Set(2021,7,25,15,30,30);  //设置时间//!!!!将时间设置为所需的当前时间RTC_ExitConfigMode(); //退出配置模式  BKP_WriteBackupRegister(BKP_DR1, 0X5051);   //向指定的后备寄存器中写入用户程序数据//!!!!此处标志位做同样的修改}else//系统继续计时{RTC_WaitForSynchro();    //等待最近一次对RTC寄存器的写操作完成RTC_ITConfig(RTC_IT_SEC, ENABLE);  //使能RTC秒中断RTC_WaitForLastTask();    //等待最近一次对RTC寄存器的写操作完成}RTC_NVIC_Config();//RCT中断分组设置                              RTC_Get();//更新时间   return 0; //ok}
    
  • 只需要在主函数中包含对应的头文件让rtc.h,即可使用结构体 calendar.w_year*(w_month/w_date/hour/min/sec)*查询时间;

    因为原子在秒中断函数中实时更新这个结构体。

最后,用RTC和3.5寸的lcd屏做了个能走时的时钟 (难度不大,就是在时钟的时分秒针的走动处理上会比较烦些) ,代码已经开源在gitee上,连接如下:

有兴趣的同学可以下载来看看:[码云仓库连接](ZET6小项目: 是学习stm32zet6时做的一些小项目练习。 (gitee.com))

Stm32之RTC时钟(2021-07-26)相关推荐

  1. STM32读取RTC时钟

    STM32读取RTC时钟 一.RTC 1. 简介 2. 特征 3. 组成 二.项目创建 三.代码修改 四.总结 参考 一.RTC 1. 简介 RTC-real time clock,实时时钟,主要包含 ...

  2. STM32的RTC时钟,星期(week)不是万年历

    STM32的RTC时钟,星期不是万年历 说明 先看一下官方寄存器说明吧 实际都到的RTC寄存器 解析一下 结论 说明 由于以前项目上使用的RTC时钟没有用到星期的概念,一直也没有发现整个问题.这次项目 ...

  3. STM32之RTC时钟

    前言 了解实时时钟RTC的原理.STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块.请编程实现STM32的日历读取.设置和输出.要求: 1)读取RTC初始时间,验证是否为 1970年1月1 ...

  4. 什么是RCT实时时钟?(STM32中RTC时钟源)

    什么是RCT(Real Time Clock,实时时钟)? 一.RTC时钟简介 RTC(Real Time Clock,实时时钟)是指安装在电子设备或实现其功能的IC(集成电路)上的时钟,一般会是集成 ...

  5. STM32如何计算RTC时钟异步预分频和同步预分频

    实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器,提供具有可编程闹钟中断功能的日历时钟/日历,可用于管理所有低功耗模式的自动唤醒单元.在配置RTC时钟时预分频器是关键指标,通过配置预分频器可 ...

  6. STM32之RTC时钟,闹钟,日历

    RTC时钟的一些功能介绍 RTC时钟即实时时钟,它提供了用于管理所有低功耗模式的自动唤醒单元,还提供了具有可编程闹钟中断功能的日历时钟/日历. 并且可以自动将月份的天数补偿为 28.29(闰年).30 ...

  7. 江涛带你玩0.96-OLED之实战stm32的RTC时钟(上)

    目录 1.前言 2.准备工作 3.关于OLED驱动,模拟SPI和硬件SPI 4.关于SPI和IIC的驱动的异同点 5.开始驱动OLED,使用STM32-CubeMX生成代码 6.显示函数 7.改造显示 ...

  8. STM32之RTC实时时钟

    RTC实时时钟简介: STM32的RTC外设,实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断).但是从掉电还能继续运 ...

  9. stm32 RTC时钟配置

    stm32--RTC实时时钟 一.关于时间 2038年问题 在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作.所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自19 ...

最新文章

  1. 生成服务器密码的shell脚本
  2. Asp.net 序列化应用实例(转载)
  3. 17个你必须牢记的Win7快捷键[转]
  4. 【Python】扫盲帖:关于在Windows、Linux和Mac上安装设置Python的问题
  5. 键盘录入学生信息,保存到集合中
  6. SAP UI5 datajs.js response handling
  7. java 异常 抛 效率_一文带你理清Java异常体系,提高开发效率
  8. 蓝桥杯(java)基础练习 龟兔赛跑
  9. 【华为推荐论文】如何学习未知样本?基于反事实学习的推荐系统技术研究(附论文下载链接)...
  10. 什么是联表查询?(深度刨析,建议收藏)
  11. 路由器启用SNMP服务
  12. 【推荐系统】电影推荐系统(二)
  13. Pico Neo3 VR Pro 开发新手入门有感(避坑与心得,新手学习必备,瞬移射线传送,移动,射线传送光圈效果,传送指定区域)
  14. Android Studio 开发APP流程
  15. 【渝粤题库】陕西师范大学202131组织行为学作业(高起本、专升本)
  16. Ffplay源码read_thread解读(一)
  17. 087 定积分求面积应用习题
  18. 计算机进入安全模式,电脑无法进入安全模式怎么办
  19. 计算机音乐专业考研,2020考研考场安排:武汉音乐学院《计算机音乐作曲》科目考生须知...
  20. 根据观测时间,经纬度,求太阳高度角

热门文章

  1. 企业如何做好绩效管理?
  2. sip re-invite 详解
  3. css实现空心文字效果
  4. easyexcel使用和遇到的问题点
  5. 「谷歌插件」这是一款我认为最好的标签页扩展插件
  6. 工作流系统理解(1)
  7. 鲅鱼圈什么地方有计算机培训学校,2017年营口市鲅鱼圈区中等职业技术专业学校计算机应用(160人)...
  8. 小米路由器R3开启SSH登陆权限
  9. Day10——提权学习之第三方软件FlashFXP及pcAnywhere提权
  10. Android入门项目(一):BMI体质指数计算器