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时钟的工作原理是通过石英晶体振荡器和备用电源来保持时间的准确性和稳定性,以确保在任何情况下都能提供准确的时间信息。
rtc原理
实时时钟(Real-Time Clock,RTC)是一种用于记录和追踪时
间的电子设备。
其原理是通过使用一个独立的振荡器来为系统提供一个稳定的时间基准,并利用计数器来追踪经过的时间。
RTC通常由一个振荡器、一个或多个计数器和相关的逻辑电
路组成。
振荡器提供一个稳定的时钟信号,可以是晶体振荡器或者外部时钟源。
计数器用于记录自从系统启动或者上一次校时以来经过的滴答数,一般以秒为单位。
逻辑电路用于控制计数器的运行以及与其他系统组件的通信。
RTC通过读取计数器的值来获取当前的时间,并将其转换为
日期和时间的形式。
这些日期和时间信息可以用来在计时器停止或者断电重启后恢复正常的时间。
RTC还可以提供一些其
他功能,如闹钟、定时器和日历功能,以满足不同应用的需求。
RTC的精度和稳定性对于时间记录的准确性至关重要。
晶体
振荡器一般具有较高的精度和稳定性,可以提供准确的时钟信号。
同时,RTC内部的校准电路可以根据外部时钟源或者通
过网络同步来自动校正计数器,以确保时间的准确性。
总之,RTC利用独立的振荡器提供稳定的时钟信号,并通过
计数器来追踪时间的流逝。
它是一种重要的电子设备,用于各种需要时间记录和追踪的应用中。
RTC实时时钟实验本章节我们讲解STM32的RTC原理并通过每秒显示当前实时时间的例程来将掌握RTC 实时时钟功能及用法。
z意义与作用RTC(Real-time clock)是实时时钟的意思。
神舟IV号开发板的处理器STM32F107集成了RTC(Real-time clock)实时时钟,在处理器复位或系统掉电但有实时时钟电池的情况下,能维持系统当前的时间和日期的准确性。
实时时钟是一个独立的定时器。
RTC实时时钟模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
修改计数器的值可以重新设置系统当前的时间和日期。
STM32的RTC主要特性为:●可编程的预分频系数:分频系数最高为220。
● 32位的可编程计数器,可用于较长时间段的测量。
●2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。
●可以选择以下三种RTC的时钟源:─ HSE时钟除以128;─ LSE振荡器时钟;─ LSI振荡器时钟。
●2个独立的复位类型:─ APB1接口由系统复位;─ RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位。
●3个专门的可屏蔽中断:─闹钟中断,用来产生一个软件可编程的闹钟中断。
─秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。
─溢出中断,指示内部可编程计数器溢出并回转为0的状态z实验原理RTC由两个主要部分组成(参见下图)。
第一部分(APB1接口)用来和APB1总线相连。
此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作(参见16.4节)。
APB1接口由APB1总线时钟驱动,用来与APB1总线接口。
另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。
第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC 时间基准TR_CLK。
RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。
RTC实时时钟什么是RTC实时时钟在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHZ晶体和电阻电容等。
S3C2410实时时钟的基本特性实时时钟(RTC)单元可以通过备用电池供电,因此,即使系统电源关闭,它也可以继续工作。
RTC可以通过STRB/LDRB 指令将8位BCD码数据送至CPU。
这些BCD数据包括秒,分,时,日期,星期,月和年。
RTC单元通过一个外部的32.768KHZ晶振提供时钟。
RTCM有定时报警的功能。
RTC控制器功能说明:时钟数据采用BCD编码能够对闰年的年月日进行自动处理具有告警功能,当系统处于关机状态时,能产生告警中断;具有独立的电源输入提供毫秒级时钟中断,该中断可用于作为嵌入式操作系统的内核时钟RTC实时时钟的结构框图RTC模块构成闰年产生器这个模块可以根据BCDDATA BCDMQN以及BCDYEAR数据决定每个月的最后日期是28, 29, 30还是31 o —个8位的计数器只能显示两个BC昭,因此它不能判断00年究竟是不是闰年。
例如它不能够判断1900年和2000的差别。
为了解决这个问题,S3C2410内的RTC模块中有一个固定的逻辑,用来支持2000年为闰年。
请注意虽然2000年是闰年,但1900年不是闰年。
因此,S3C2410中00代表2000年,而不是1900年。
读/写寄存器要求置高RTCQN寄存器的0位来表示读和写RTC模块中的寄存器。
为了显示秒,分,小时,日期,月和年,CPU 会从BCDSEC , BCDMIN , BCDHQUR , BCDDAY , BCDDATE , BCDMQN,和BCDYEAR 寄存器读取数据。
但是由于多个寄存器的读取,可能产生1秒钟的偏离。
例如,如果用户读取寄存器BCDYEAR 到BCDMIN,假设结果为1959年,12月,31日,23点,59分。
rtc是什么
RTC,英文全称:Real-time clock,中文名称:实时时钟。
RTC是指可以像时钟一样输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。
RTC芯片是日常生活中应用最为广泛的消费类电子产品之一。
它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。
RTC可以提供稳定的时钟信号给后续电路用。
一个没有实时时钟的系统也可以计算实际时间,不过使用实时时钟有以下的优点:
(1)消耗功率低(当使用辅助电源时格外重要);
(2)让主系统处理更需时效性的工作;
(3)有时会比其他方式的输出要更准确。
全球定位系统的接收器若配合实时时钟,可减少其开机时所需的时间,开机时可将其得到的时间和上次接收到有效讯号的时间相比较。
若二者时间相差在几个小时以内,则上次的星历表仍然可以有效,可以正常使用。
RTC最重要的功能是提供到2099年内的日历功能,对于时间来说,无论快慢都是误差,而匹配电容在RTC的外围器件上起到非常重要的作用,它可以适当修正晶体与RTC之间匹配问题。
特别是像H1208这样的RTC,把匹配电容内置,这样就可以保证RTC精度的一致性,不会出现有的RTC走得快,有些又走得慢。
rtc实时时钟和单片机时钟的区别来源:电子发烧友rtc实时时钟和单片机时钟的区别实时时钟是指给日期及时间计数器累加的时钟,通常是32768Hz,系统时钟是指单片机内部的主时钟,给各个模块提供工作时钟的基础,CPU时钟是指经过CPU的PLL后将系统时钟改变为CPU工作的时钟。
在一般的低速单片机系统中,系统时钟和CPU时钟基本相等,在高速单片机系统中,CPU时钟比系统时钟高得多。
而实时时钟只有在需要日期时间的系统中才有,并且是最低的,有的系统也将它作为低功耗时CPU时钟。
实钟(RTC)由晶体控制精度,向主系统提供BCD码表示间期器件。
主系统与RTC间通信通并行口通串行口。
并行器件速度快需较底板空间较昂贵。
串行器件体积较且价格相便宜主频CPU钟频率。
简单说CPU工作频率般说钟周期完指令数固定所主频越高,CPU速度越快由于各种CPU内部结构尽相同所并能完全用主频概括CPU性能,至于外频系统总线工作频率;倍频则指CPU外频与主频相差倍数用公式表示:主频=外频×倍频系统钟现电脑显示间通更新调整通BIOSS设置。
一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
rtc实时时钟如DS1302是一个单独的时钟芯片,和单片机连接后,可以设置时间和闹铃时间,并读取时间进行显示,普通单片机要做时钟需要占用其较多资源,并且断电后没法保持。
一些高档单片机如STM32F103(无日历功能,STM32F407有日历功能)内部也有实时时钟,可以和单片机分开供电,并且有单独的振荡电路,断电后仍能运行,就无需再外接时钟芯片了。
单片机中时钟的理解时钟是STM32单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。
这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。
#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的数据。