RTC实时时钟
- 格式:wps
- 大小:38.00 KB
- 文档页数:6
2017年6月Doc ID 018624 Rev 1 [English Rev 5]1/45AN3371应用笔记在 STM32 F0、F2、F3、F4 和 L1 系列MCU 中使用硬件实时时钟(RTC )前言实时时钟 (RTC) 是记录当前时间的计算机时钟。
RTC 不仅应用于个人计算机、服务器和嵌入式系统,几乎所有需要准确计时的电子设备也都会使用。
支持 RTC 的微控制器可用于精密计时器、闹钟、手表、小型电子记事薄以及其它多种设备。
本应用笔记介绍超低功耗中等容量、超低功耗大容量、F0、F2和 F4 系列器件微控制器中嵌入式实时时钟 (RTC) 控制器的特性,以及将 RTC 用于日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用时所需的配置步骤。
本应用笔记提供了含有配置信息的示例,有助于您快速准确地针对日历、闹钟、定时唤醒单元、入侵检测、时间戳和校准应用配置 RTC 。
注:所有示例和说明均基于 STM32L1xx 、STM32F0xx 、STM32F2xx 、STM32F4xx 和STM32F3xx 固件库,以及 STM32L1xx (RM0038)、STM32F0xx (RM0091)、STM32F2xx (RM0033)、STM32F4xx (RM0090)、STM32F37x (RM0313) 和 STM32F30x(RM0316) 的参考手册。
本文提到的STM32 指超低功耗中等容量、超低功耗大容量、F0、F2 和 F4 系列器件。
超低功耗中等 (ULPM) 容量器件包括 STM32L151xx 和 STM32L152xx 微控制器,Flash 容量在 64 KB 到 128 KB 之间。
超低功耗大 (ULPH) 容量器件包括 STM32L151xx 、STM32L152xx 和 STM32L162xx 微控制器,Flash 容量为 384 KB 。
F2 系列器件包括 STM32F205xx 、STM32F207xx 、STM32F215xx 和 STM32F217xx 微控制器。
rtc是什么意思标题:RTC是什么意思摘要:RTC,即实时时钟,是一种能够提供准确时间和日期信息的计算机硬件设备。
它在各个领域都得到广泛应用,包括计算机系统、嵌入式系统、通信设备等。
本文将介绍RTC的基本原理、功能及应用领域,以及其在现代科技发展中的重要性和未来的发展趋势。
一、引言实时时钟(RTC)是计算机系统和嵌入式系统中一个不可或缺的组成部分。
它能够提供准确可靠的时间和日期信息,对于许多应用场景都至关重要。
本文将对RTC进行详细的解析,包括其基本原理、功能及应用领域。
二、RTC的基本原理和功能1. RTC的基本原理RTC是一种通过晶振来生成稳定的时钟信号的硬件设备。
它通常包括一个晶振、计数器以及相关的电路和接口组件。
晶振作为RTC的“心脏”,振荡产生稳定频率的脉冲信号,该信号经过计数器进行计数,从而实现对时间的精确测量。
2. RTC的主要功能RTC的主要功能是提供准确的时间和日期信息。
它能够跟踪时间的变化,并在需要时提供精确的时间戳。
此外,RTC还可以用于实现定时和闹铃功能,用于定时操作或提醒用户特定的事件发生。
三、RTC的应用领域1. 计算机系统在计算机系统中,RTC被广泛应用于操作系统、文件系统和日志记录等方面。
它可以确保计算机系统拥有准确的系统时间,从而保证各种任务和事件的顺利执行。
2. 嵌入式系统在嵌入式系统中,RTC通常用于记录系统启动和停止时间,以及记录系统故障或异常情况。
它对于嵌入式设备的运行和状态监测具有重要意义。
3. 通信设备在通信设备中,RTC被广泛用于数据传输的时间同步和时间戳记录。
它确保各个设备之间的数据传输具有一致的时间参考,从而提高通信的稳定性和可靠性。
4. 其他领域除了计算机系统、嵌入式系统和通信设备,RTC还应用于航空航天、智能家居、工业自动化等众多领域。
它为这些领域提供了精确的时间基准,对于系统的正常运行和各种功能的实现都起着至关重要的作用。
四、RTC的重要性和未来发展趋势RTC在现代科技发展中具有重要的地位和作用。
STM32-RTC实时时钟-毫秒计时实现OS:Windows 64Development kit:MDK5.14IDE:UV4MCU:STM32F103C8T61、RTC时钟简介 STM32 的实时时钟(RTC)是⼀个独⽴的定时器,在相应软件配置下,可提供时钟⽇历的功能。
详细资料请参考ALIENTEK的官⽅⽂档——《STM32F1开发指南(精英版-库函数版)》,以下为博主摘录要点:RTC 模块和时钟配置系统(RCC_BDCR 寄存器)在后备区域,系统复位后,会⾃动禁⽌访问后备寄存器和 RTC ,所以在要设置时间之前,先要取消备份区域(BKP)的写保护RTC 内核完全独⽴于 RTC APB1 接⼝,⽽软件是通过 APB1 接⼝访问 RTC 的预分频值、计数器值和闹钟值,因此需要等待时钟同步,寄存器同步标志位(RSF)会硬件置1RTC相关寄存器包括:控制寄存器(CRH、CRL)、预分频装载寄存器(PRLH、PRLL)、预分频器余数寄存器(DIVH、DIVL)、计数寄存器(CNTH、CNTL)、闹钟寄存器(ALRH、ALRL)STM32备份寄存器,存RTC校验值和⼀些重要参数,最⼤字节84,可由VBAT供电计数器时钟频率:RTCCLK频率/(预分频装载寄存器值+1)2、软硬件设计 由于RTC是STM32芯⽚⾃带的时钟资源,所以⾃主开发的时候只需要在设计时加上晶振电路和纽扣电池即可。
编程时在HARDWARE⽂件夹新建 rtc.c、rtc.h ⽂件。
3、时钟配置与函数编写 为了使⽤RTC时钟,需要进⾏配置和时间获取,基本上按照例程来写就可以了。
为避免零散,我将附上完整代码。
函数说明如下:rtc.c中需要编写的函数列表RTC_Init(void)配置时钟RTC_NVIC_Config(void)中断分组RTC_IRQHandler(void)秒中断处理RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)设置时间RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8sec)闹钟设置RTC_Get(void)获取时钟RTC_Get_Week(u16 year,u8 month,u8 day)星期计算Is_Leap_Year(u16 year)闰年判断 事实上,以上函数并不都要,闹钟没有⽤到的话就不要,秒中断也可以不作处理,看项⽬需求。
stm32 rtc实时时钟STM32 RTC实时时钟一、介绍STM32是意法半导体公司(STMicroelectronics)推出的一系列32位ARM Cortex-M微控制器。
其中,RTC(Real-Time Clock)是STM32微控制器中的一个重要组件,用于实时时钟和日历功能。
本文将详细介绍STM32 RTC的实时时钟功能及其应用。
二、RTC概述RTC模块是一种独立的硬件模块,可以在微控制器断电时继续运行。
它提供了一个与时间和日期相关的计数器,通过时钟信号源来驱动计数器,从而实现实时时钟的功能。
RTC模块通常由一个独立的低功耗振荡器来提供时钟源。
STM32微控制器中的RTC模块支持多种工作模式,如年历模式、单位数字模式和二进制模式等。
三、RTC的主要功能1. 实时时钟:RTC模块可以提供精确的实时时钟,可以记录时间、日期和星期等信息。
2. 闹钟功能:RTC可以设置多个闹钟时间,并在闹钟时间到达时触发中断或其他操作。
3. 倒计时功能:RTC模块可以进行倒计时操作,并在倒计时结束时触发中断。
4. 调度功能:RTC可以设置预定的时间点,并在该时间点触发中断。
5. 报警功能:RTC可以设置报警功能,当发生特定事件时触发中断或其他操作。
四、配置RTC模块在使用STM32微控制器的RTC功能之前,需要进行一些配置。
首先,需要选择合适的时钟源。
通常,RTC模块使用低功耗振荡器作为时钟源。
其次,需要配置RTC的预分频器和计数器,以实现所需的时间精度。
还需配置中断和/或事件触发条件,以便在特定事件发生时触发中断或其他操作。
五、RTC的中断与事件RTC模块可以生成多个中断和事件,以满足应用的需求。
常见的中断和事件有:1. 秒中断:每当计数器的秒字段更新时触发中断。
2. 分钟中断:每当计数器的分钟字段更新时触发中断。
3. 小时中断:每当计数器的小时字段更新时触发中断。
4. 日期中断:每当计数器的日期字段更新时触发中断。
rtc有效校准频率RTC(Real-Time Clock,实时时钟)是一种能够提供准确时间的电子设备,被广泛应用于各种计时和时间同步的场景中。
有效的校准频率是保证RTC准确性的关键因素之一。
在RTC中,准确的时间是通过晶振来实现的。
晶振是一种能够稳定产生固定频率信号的器件,常见的晶振频率有32.768kHz和4.096MHz等。
RTC通过计数晶振的振荡脉冲来确定时间,并根据外部的校准信号来调整其计数准确性。
有效的校准频率是指校准信号的频率,它决定了RTC的时间准确性。
校准频率越高,RTC的时间准确性越高。
一般情况下,校准频率可以达到几十Hz甚至更高。
那么,如何选择有效的校准频率呢?首先,需要考虑到应用场景的需求。
对于一些对时间要求不是很高的场景,比如温度计、电子秤等,校准频率可以选择较低的值,比如1Hz或者更低。
但是,对于一些对时间要求非常高的场景,比如通信系统、航空航天等,校准频率需要选择较高的值,以确保时间的准确性。
还需要考虑到系统的稳定性和成本。
校准频率越高,对系统的稳定性要求就越高,对晶振的要求也就越高,相应地成本也就越高。
因此,在选择有效的校准频率时,需要综合考虑系统的稳定性和成本因素。
校准频率还会影响到RTC的功耗。
校准信号的频率越高,RTC的功耗也就越高。
在一些对功耗要求较高的场景中,比如移动设备、物联网等,需要选择较低的校准频率来降低功耗。
总的来说,有效的校准频率是根据应用场景的需求、系统的稳定性和成本以及功耗等因素来决定的。
在选择校准频率时,需要权衡各种因素,找到一个合适的平衡点。
除了校准频率,还有其他一些因素也会影响RTC的准确性。
比如温度对晶振的频率稳定性有一定影响,因此需要考虑温度补偿的方法;还有晶振的质量、电源稳定性等因素也需要注意。
总结起来,有效的校准频率是保证RTC准确性的重要因素之一。
在选择校准频率时,需要考虑到应用场景的需求、系统的稳定性和成本以及功耗等因素。
通过合理选择校准频率,可以提高RTC的时间准确性,满足各种应用场景的需求。
RTC—实时时钟1 RTC 简介RTC—real time clock,实时时钟,主要包含⽇历、闹钟和⾃动唤醒这三部分的功能,其中的⽇历功能我们使⽤的最多。
⽇历包含两个 32bit 的时间寄存器,可直接输出时分秒,星期、⽉、⽇、年。
⽐起 F103 系列的 RTC只能输出秒中断,剩下的其他时间需要软件来实现,429 的 RTC可谓是脱胎换⾻,让我们在软件编程时⼤⼤降低了难度。
2 RTC 功能框图解析1. 时钟源RTC 时钟源 —RTCCLK 可以从 LSE、LSI和 HSE_RTC 这三者中得到。
其中使⽤最多的是 LSE,LSE 由⼀个外部的32.768KHZ(6PF 负载)的晶振提供,精度⾼,稳定,RTC⾸选。
LSI是芯⽚内部的 30KHZ晶体,精度较低,会有温漂,⼀般不建议使⽤。
HSE_RTC由 HSE 分频得到,最⾼是 4M,使⽤的也较少。
2. 预分频器预分频器 PRER 由 7 位的异步预分频器 APRE 和 15位的同步预分频器 SPRE组成。
异步预分频器时钟 CK_APRE ⽤于为⼆进制 RTC_SSR 亚秒递减计数器提供时钟,同步预分频器时钟 CK_SPRE ⽤于更新⽇历。
异步预分频器时钟 f CK_APRE =f RTC_CLK /(PREDIV_A+1),同步预分频器时钟 f CK_SPRE =f RTC_CLK /(PREDIV_S+1),)。
使⽤两个预分频器时,推荐将异步预分频器配置为较⾼的值,以最⼤程度降低功耗。
⼀般我们会使⽤ LSE ⽣成 1HZ的同步预分频器时钟通常的情况下,我们会选择 LSE 作为 RTC 的时钟源,即 f RTCCLK =f LSE =32.768KHZ。
然后经过预分频器 PRER 分频⽣成 1HZ 的时钟⽤于更新⽇历。
使⽤两个预分频器分频的时候,为了最⼤程度的降低功耗,我们⼀般把同步预分频器设置成较⼤的值,为了⽣成1HZ 的同步预分频器时钟 CK_SPRE,最常⽤的配置是 PREDIV_A=127,PREDIV_S=255。
RTC实时时钟驱动RTC(Real-Time Clock)实时时钟为操作系统提供了⼀个可靠的时间,并且在断电的情况下,RTC实时时钟也可以通过电池供电,⼀直运⾏下去。
RTC通过STRB/LDRB这两个ARM指令向CPU传送8位数据(BCD码)。
数据包括秒,分,⼩时,⽇期,天,⽉和年。
RTC实时时钟依靠⼀个外部的32.768Khz的⽯英晶体,产⽣周期性的脉冲信号。
每⼀个信号到来时,计数器就加1,通过这种⽅式,完成计时功能。
RTC实时时钟有如下⼀些特性:1,BCD数据:这些数据包括秒、分、⼩时、⽇期、、星期⼏、⽉和年。
2,闰年产⽣器3,报警功能:报警中断或者从掉电模式唤醒5,独⽴电源引脚RTCVDD6,⽀持ms中断作为RTOS内核时钟7,循环复位(round reset)功能如图,RTC实时时钟的框架图,XTIrtc和XTOrtc产⽣脉冲信号,即外部晶振。
传给2^15的⼀个时钟分频器,得到⼀个128Hz的频率,这个频率⽤来产⽣滴答计数。
当时钟计数为0时,产⽣⼀个TIME TICK中断信号。
时钟控制器⽤来控制RTC实时时钟的功能。
复位寄存器⽤来重置SEC和MIN寄存器。
闰年发⽣器⽤来产⽣闰年逻辑。
报警发⽣器⽤来控制是否产⽣报警信号。
1,闰年产⽣器: 闰年产⽣器可以基于BCDDATE,BCDMON,BCDYEAR决定每⽉最后⼀天的⽇期是28、29、30、31.⼀个8位计数器只能表⽰两位BCD码,每⼀位BCD码由4位表⽰。
因此不能⽀持。
因此不能决定00年是否为闰年,例如不能区别1900和2000年。
RTC模块通过硬件逻辑⽀持2000年为闰年。
因此这两位00指的是2000,⽽不是19002,后备电池: 即使系统电源关闭,RTC模块可以由后备电池通过RTCVDD引脚供电。
当系统电源关闭时,CPU和RTC的接⼝应该被阻塞,后备电池应该只驱动晶振电路和BCD计数器,以消耗最少的电池。
3,报警功能: 在正常模式和掉电模式下,RTC在指定的时刻会产⽣⼀个报警信号。
掉电走时的rtc时钟工作原理
掉电走时的RTC时钟,即实时时钟(Real Time Clock),是一种能够在掉电的情况下仍然保持走时的计时设备。
RTC时钟的工作原理主要基于石英晶体振荡器,它以恒定的频率振动,为时钟提供基准时间源。
当电源正常工作时,RTC时钟会从石英晶体振荡器获取时间基准,并通过内部的计数器和寄存器来记录和更新时间。
它通常包括秒、分、时、日、月、年等时间单位,以及星期、闰年等更复杂的时间信息。
当电源掉电时,石英晶体振荡器仍然会保持振动,但由于没有电源供应,它无法为RTC时钟提供电能。
因此,RTC时钟需要通过备用电源来维持工作。
备用电源通常是一个小型的电池或超级电容,它们可以在电源掉电时为RTC时钟提供电能,以确保时钟的准确性和稳定性。
当电源重新上电时,RTC时钟会自动校准时间,以确保与标准时间同步。
有些RTC时钟还具有校准功能,可以通过软件或硬件来调整时间,以适应不同的时区或其他时间标准。
总的来说,掉电走时的RTC时钟的工作原理是通过石英晶体振荡器和备用电源来保持时间的准确性和稳定性,以确保在任何情况下都能提供准确的时间信息。
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <intrins.h>sbit SCK=P3^6; //时钟sbit SDA=P3^4; //数据sbit RST = P3^5;// DS1302复位sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;bit ReadRTC_Flag;//定义读DS1302标志unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00unsigned char l_tmpdisplay[8];code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管0-9 '-' '熄灭‘表/******************************************************************//* 函数声明*//******************************************************************/void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/******************************************************************//* 主函数*//******************************************************************/void main(void){InitTIMER0(); //初始化定时器0Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1){if(ReadRTC_Flag){ReadRTC_Flag=0;Read_RTC();l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开l_tmpdisplay[1]=l_tmpdate[2]&0x0f;l_tmpdisplay[2]=10; //加入"-"l_tmpdisplay[3]=l_tmpdate[1]/16;l_tmpdisplay[4]=l_tmpdate[1]&0x0f;l_tmpdisplay[5]=10;l_tmpdisplay[6]=l_tmpdate[0]/16;l_tmpdisplay[7]=l_tmpdate[0]&0x0f;}}}/******************************************************************//* 定时器0初始化*//******************************************************************/void InitTIMER0(void){TMOD|=0x01;//定时器设置16位TH0=0xef;//初始化值TL0=0xf0;ET0=1;TR0=1;EA=1;}/******************************************************************//* 写一个字节*//******************************************************************/void Write_Ds1302_Byte(unsigned char temp){unsigned char i;for (i=0;i<8;i++) //循环8次写入数据{SCK=0;SDA=temp&0x01; //每次传输低字节temp>>=1; //右移一位SCK=1;}}/******************************************************************/ /* 写入DS1302 */ /******************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ){RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_(); //启动Write_Ds1302_Byte(address); //发送地址Write_Ds1302_Byte(dat); //发送数据RST=0; //恢复}/******************************************************************/ /* 读出DS1302数据*/ /******************************************************************/ unsigned char Read_Ds1302 ( unsigned char address ){unsigned char i,temp=0x00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for (i=0;i<8;i++) //循环8次读取数据{if(SDA)temp|=0x80; //每次传输低字节SCK=0;temp>>=1; //右移一位_nop_();_nop_();_nop_();SCK=1;}RST=0;_nop_(); //以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp); //返回}/******************************************************************/ /* 读时钟数据*/ /******************************************************************/ void Read_RTC(void) //读取日历{unsigned char i,*p;p=read_rtc_address; //地址传递for(i=0;i<7;i++) //分7次读取秒分时日月周年{l_tmpdate[i]=Read_Ds1302(*p);p++;}}/******************************************************************/ /* 设定时钟数据*/ /******************************************************************/ void Set_RTC(void) //设定日历{unsigned char i,*p,tmp;for(i=0;i<7;i++){ //BCD处理tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}Write_Ds1302(0x8E,0X00);p=write_rtc_address; //传地址for(i=0;i<7;i++) //7次写入秒分时日月周年{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x8E,0x80);}/******************************************************************/ /* 定时器中断函数*/ /******************************************************************/ void tim(void) interrupt 1 using 1//中断,用于数码管扫描{static unsigned char i,num;TH0=0xf5;TL0=0xe0;P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}i++;if(i==8){i=0;num++;if(10==num) //隔段时间读取1302的数据。