首先是了解再干什么,重点就是看懂这个原理图

1.功能

是个独立的定时器,提供日历功能,超级独立:配置的参数存到后备存储区BKP,由独立的电源供电,即使系统复位或者掉电,都不会影响RTC的配置参数,并且想要修改他的参数,需要层层关卡,就是为了当成一个合格准确又严谨的日历,他甚至还使用了更为精确的外部时钟作为自己的时钟源。

2.原理和特征

关于特征直接罗列显得人很头大,但是先搞懂原理图就能较快的掌握特征了
总的来说是两大部分:APB1接口部分和RTC核心部分,我们需要重点理解的就是核心部分,核心部分又分成两部分,时钟的产生和中断的产生。设置了APB1接口应该是为了访问方便与保护。首先是时钟的产生即预分频模块:RTCCLK是时钟源:这就涉及到了STM32的时钟系统的复习(同一个电路,时钟频率越高功耗越大,同时抗电磁干扰能力越弱),来看看吧:

时钟模块

1.时钟有内部时钟和外部时钟,即RC振荡器和晶振
2.由振荡器或者晶振产生锁相环PLL作为系统时钟,最高达72MHz
3.系统时钟分频得到AHB,AHB再预分频得到低速总线APB1(最高36MHz)和高速总线APB2(最高72MHz),上面挂载的模块有区别的
4.RTC时钟的选择和产生:LSE(32.768kHz)、LSI(40kHz)、HSE/128
5.还能对外输出个时钟:MCO引脚

STM32中有5个时钟源:
1.HSI:高速内部时钟,由RC振荡器产生,频率为8MHz
2.HSE:高速外部时钟,由外部晶振产生,范围为4~16MHz,开发板上是8
3.LSI:低速内部时钟,RC振荡器产生,40kHz独立看门口只能用LSI;LSI也可供给RTC用
4.LSE:低速外部时钟,由外部晶振产生,32.768kHz,是RTC的时钟源
5.PLL:锁相环倍频输出,其时钟输入源可选择为HSI/2,HSE或HSE/2,倍频选择2~16倍;最高为72MHz

A:对外输出时钟源,可选PLL/2,HSI,HSE,系统时钟
B: RTC时钟源,可选HSE/128,LSI,LSE
C:全速功能的USB模块,串口引擎需要一个48MHz时钟且只能从PLL输出端获取,可选择1.5分频或1分频。则使用USB模块是,PLL必须使能,并且时钟频率配置为48MHz或72MHz
D:系统时钟,可选PLL,HSI,HSE,最大为72MHz
E:指其他外设,最终来源系统时钟,经过AHB分频器分频后共其他模块使用

馋鬼步骤:

1.选择LSE作为时钟源,然后预分频,产生了TR_CLK,作为RTC的时钟。
2.接着配置了秒中断、溢出中断以及闹钟中断
在这两个过程我们能发现:
RTC时钟源有哪些呢?三种,HSE/128或者LSE或者LSI
预分频系数够大吗?影响着分频因子即最低时钟频率:这是20位的,因此分频系数最高达2的20次方
观察发现:APB1和RTC核心各自有复位系统,一个是连着系统的,一个是自带的存在BKP
三个可屏蔽中断:秒中断、溢出中断以及闹钟中断
2个分离时钟:
32位可编程计数器:计数器范围要足够大呢,能记录136年,够用了

3.又到了喜闻乐见的寄存器环节

1-时钟配置:RTCCLK / RTC_PRL = TR_CLK,配置PRL的值就能配置RTC的时钟频率,决定着最小指令周期时间;DIV是一个自减计数器,其最初的加载值是PRL,然后随着RTCCLK的指令周期一个一个减,减到0时,正好对外输出个TR_CLK,因为分频嘛就是有个PRL的倍数关系,输出TR_CLK后也刚好再把PRL加载到DIV中继续自减。DIV的每一步是根据RTCCLK的指令周期的,精度更高点,比如说,为40kHz,指令周期为1/40k = 25us,也就是DIV每减少1就是过了25us,若PRL取100,则TR_CLK的指令周期只有10025 = 2500us,显然分辨率第一点。当DIV的值为80,我们能知道过了(100-80) * 25us = 500us,提高了分辨率,如果此时还检测到TR_CLK已经过了2个指令周期,那么总走过的时间是:22500+25=5025us。

2-定时器中断:首先是一个秒中断:RTC定时器每走过1秒的时间就会触发秒中断;然后是溢出中断:当计数器RTC_CNT溢出并变回0时触发中断,RTC_CNT每过1秒才会增加1,并且是个32位的寄存器,存储范围很大的,另外是把1970年对应RTC_CNT为0,然后根据CNT当前的值就可以基于1970年这个时间远点推测当前是什么日期和时间,举个随意的值,比如此时RTC_CNT 被设置为1004556,说明距离1970年已经过了1004556秒,假设计算和后刚好是2017年5月20号13点14分25秒(这只是随口说的,并没有仔细去算,大概理解过程就行),这不就起到了日历的作用了吗。并且RTC_CNT这个最大能记录到136年后,足够用了。最后是闹钟中断:把RTC_ALR设置成某个数,当CNT=ALR时就会触发闹钟中断。
下面是仔细介绍寄存器

控制寄存器显然功能比较多:决定三个中断的开启;带有三个中断的标志位;带有RTC操作开启的标志,带有允许配置的标志,带有寄存器同步标志 —— 只有这三步都允许了才能对RTC参数进行修改即至少三道关卡;


分频是常规寄存器
CNT寄存器:就是用来计数,每过秒就增加1
闹钟寄存器:写入个值,当CNT等于这个值就触发闹钟中断而已

4.库函数


5.必会步骤呢:读取参数和写入参数的一般过程:需要打开很多开关哦


这是读取参数:RSF这一关

这是配置写入:RSF、CNF、RTOFF这三个标志位即三关

6.一般步骤


说白了RTC不过就是个定时器,不同之处在于对其参数配置时需要经过层层关卡(至少三关吧),至于日历功能,其实很简单,计数器CNT记录了多少秒,然后基于1970年对应CNT=0这个规定,进行推算,就能得到当前时间。

程序


static void RTC_NVIC_Config(void)
{   NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;     //RTC全局中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //中断优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     //使能中断NVIC_Init(&NVIC_InitStructure);       //使能NVIC
}u8 RTC_Init(void)
{//检查是不是第一次配置RTCu8 temp=0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能时钟   PWR_BackupAccessCmd(ENABLE);   //使能后备寄存器的访问即允许访问  if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)      //读个值,0x5050是随便取得,一旦修改了0x5050就会进入RTC的配置过程呢{                BKP_DeInit();  //复位备份区域,因为要重新设置了RCC_LSEConfig(RCC_LSE_ON);  //使用外部低速晶振LSEwhile (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250) //等待LSE就绪{temp++;delay_ms(10);}if(temp>=250)return 1;//初始化失败,LSE有问题   RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);      //选择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(2015,1,14,17,42,55);  //设置CNT即当前时间RTC_ExitConfigMode(); //退出配置模式 BKP_WriteBackupRegister(BKP_DR1, 0X5050);    //向某个指定的后备寄存器中写入数据}else//系统继续计时即没有进入RTC配置,配置一次后即使系统复位也不会进入RTC配置,系统复位不会导致RTC复位的{RTC_WaitForSynchro();  //等待RTC寄存器同步RTC_ITConfig(RTC_IT_SEC, ENABLE);   //使能秒中断RTC_WaitForLastTask();   //等待最近一次对RTC的写操作结束,每写一次数据都要等待完成同步}RTC_NVIC_Config();//中断分组                            RTC_Get();//更新时间return 0; //ok}                            //RTC中断:三个中断公用这一个中断服务函数?
void RTC_IRQHandler(void)
{        if (RTC_GetITStatus(RTC_IT_SEC) != RESET)//秒中断{                           RTC_Get();//更新时间 :根据CNT的值推算出当前是什么时间}if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//闹钟中断{RTC_ClearITPendingBit(RTC_IT_ALR);        //清楚闹钟中断标志      RTC_Get();              //更新时间printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//把闹钟时间打印出来}                                               RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);       //清除秒中断和闹钟中断RTC_WaitForLastTask();
}

RTC时钟:一个日历相关推荐

  1. (22)STM32——RTC时钟笔记(基于正点原子探索者)

    目录 学习目标 运行结果 内容 介绍 配置 寄存器 配置过程 日历 闹钟 自动唤醒 代码 总结 学习目标 今天我们要介绍的有关PTC时钟的相关知识,其中包括了RTC日历.RTC时钟和RTC周期性自动唤 ...

  2. RTC时钟实现实时日历

    文章目录 1.RTC时钟简介 1.2.初识RTC 1.2.相关寄存器 2.创建项目2 3.完善代码 4.总结 1.RTC时钟简介 1.2.初识RTC 1.简介: RTC-real time clock ...

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

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

  4. 瑞萨e2studio(19)----RTC时钟日历闹钟周期性中断

    瑞萨e2studio.19--RTC时钟日历&闹钟&周期性中断 概述 视频教学 csdn课程 样品申请 完整代码下载 硬件准备 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 ...

  5. EPSON RX8010SJ RTC 调试笔记之五, 时钟及日历解析

    硬件: EPSON RX8010 SJ 时钟及日历解板示例 RX8010SJ RTC 时钟芯片,除周寄存器(WEEK Register) 外,其它涉及时间的寄存器,均采用 8421 BCD 来表示. ...

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

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

  7. STM32F103C8T6基于HAL库制作RTC时钟

    目录 一.RTC时钟原理 二.新建工程 三.修改代码 四.烧录运行 参考文献 了解实时时钟RTC的原理.STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块.请编程实现STM32的日历读取. ...

  8. STM32之RTC时钟

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

  9. STM32RTC时钟和日历

    文章目录 实验目标 实验环境 一. RCT基础 什么是RTC? 为什么我们需要一个单独的RTC? RTC(Real Time Clock)的原理和机制 RTC具体流程: RTC时钟选择 RTC复位过程 ...

最新文章

  1. i-jetty环境搭配与编译
  2. 使用 TiKV 构建分布式类 Redis 服务
  3. 【转】Linux操作系统下/etc/hosts文件配置方法
  4. Android开发之播放量点赞量打赏量收藏量单位格式化工具类
  5. 4-pycharm找不到模块问题
  6. mysql delette_关于字符串:首字母大写MySQL
  7. 操作系统(王道笔记第二章)
  8. easyUI的combobox的实现
  9. 《设计模式详解》行为型模式 - 命令模式
  10. Windows TensorFlow环境搭建
  11. zabbix agent启动不了
  12. mysql 导出dmp文件_PLSQL Developer导入导出表数据结构
  13. linux环境中,检查是否安装某个软件包的几种查看方式
  14. 图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
  15. 95后大厂程序员删库被判刑,只因项目被接手对领导心生不满
  16. Android中通过USB连接来控制硬件设备
  17. OpenGL课程设计 三维图形交互程序 bunny兔+飞机模型
  18. android APP 跳转到应用商店评分
  19. [BZOJ2069][POI2004]ZAW
  20. 安徽大学计算机专业参考书目,安徽大学计算机科学与技术(专业学位)研究生考试科目和考研参考书目...

热门文章

  1. 多线程抢票_java多线程下模拟抢票
  2. 爬虫实战3:模拟登陆知乎并爬取任意帖子数据
  3. js获取url参数的方法
  4. Cheeses and bread
  5. Office 中Word十大技巧
  6. Unable to access the X Display
  7. linux下qt打印功能如何实现,QT实现操控打印机打印图片
  8. 调程序的小女孩(感谢安徒生)(转)
  9. 不可抗力/(ㄒoㄒ)/~~ 开始学习node全栈<四>express Web框架
  10. 服务引用定义配置(服务的注册与发现)