第二十章 RTC实时时钟实验-STM32F4开发指南-正点原子探索者STM32开发板
STM32-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 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实时时钟实验-STM32F4开发指南-正点原子探索者STM32开发板
STM32F4 的实时时钟(RTC)相对于 STM32F1 来说,改进了不少,带了日历功能了, STM32F4 的 RTC,是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日 时分秒信息)、两个可编程闹钟(ALARM A 和 ALARM B)中断,以及一个具有中断功能的周 期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。
291
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
图 20.1.3 RTC_DR 寄存器各位描述 同样,该寄存器的的数据始化模式下,对该寄存器进行写操作,可以设置日期。 接下来,看 RTC 亚秒寄存器:RTC_SSR,该寄存器各位描述如图:20.1.4 所示:
1, 一个通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器。 2, 一个通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器。 图 20.1.1 中,ck_spre 的时钟可由如下计算公式计算:
Fck_spre=Frtcclk/[(PREDIV_S+1)*( PREDIV_A+1)] 其中,Fck_spre 即可用于更新日历时间等信息。PREDIV_A 和 PREDIV_S 为 RTC 的异步 和同步分频器。且推荐设置 7 位异步预分频器(PREDIV_A)的值较大,以最大程度降低功耗。 要设置为 32768 分频,我们只需要设置:PREDIV_A=0X7F,即 128 分频;PREDIV_S=0XFF, 即 256 分频,即可得到 1Hz 的 Fck_spre。 另外,图 20.1.1 中,ck_apre 可作为 RTC 亚秒递减计数器(RTC_SSR)的时钟,Fck_apre 的计算公式如下:
第二章 实验平台硬件资源详解-正点原子探索者STM32F4开发板STM32F4开发指南
第二章实验平台硬件资源详解本章,我们将节将向大家详细介绍ALIENTEK探索者STM32F4开发板各部分的硬件原理图,让大家对该开发板的各部分硬件原理有个深入理解,并向大家介绍开发板的使用注意事项,为后面的学习做好准备。
本章将分为如下两节:1.1,开发板原理图详解;1.2,开发板使用注意事项;2.1 开发板原理图详解2.1.1 MCUALIENTEK探索者STM32F4开发板选择的是STM32F407ZGT6作为MCU,该芯片是STM32F407里面配置非常强大的了,它拥有的资源包括:集成FPU和DSP指令,并具有192KB SRAM、1024KB FLASH、12个16位定时器、2个32位定时器、2个DMA控制器(共16个通道)、3个SPI、2个全双工I2S、3个IIC、6个串口、2个USB(支持HOST /SLAVE)、2个CAN、3个12位ADC、2个12位DAC、1个RTC(带日历功能)、1个SDIO接口、1个FSMC 接口、1个10/100M以太网MAC控制器、1个摄像头接口、1个硬件随机数生成器、以及112个通用IO口等。
该芯片的配置十分强悍,很多功能相对STM32F1来说进行了重大改进,比如FSMC的速度,F4刷屏速度可达3300W像素/秒,而F1的速度则只有500W左右。
MCU部分的原理图如图2.1.1.1(因为原理图比较大,缩小下来可能有点看不清,请大家打开开发板光盘的原理图进行查看)所示:图2.1.1.1 MCU部分原理图上图中U4为我们的主芯片:STM32F407ZGT6。
这里主要讲解以下3个地方:1,后备区域供电脚VBA T脚的供电采用CR1220纽扣电池和VCC3.3混合供电的方式,在有外部电源(VCC3.3)的时候,CR1220不给VBAT供电,而在外部电源断开的时候,则由CR1220给其供电。
这样,VBA T总是有电的,以保证RTC的走时以及后备寄存器的内容不丢失。
STM32单片机RTC时钟的使用方法及步骤
STM32单片机RTC时钟的使用方法及步骤以下是使用STM32单片机的RTC时钟的步骤:1.初始化RTC模块:首先,需要在RCC寄存器中使能RTC和LSE(Low-Speed External)晶振模块。
然后,配置RTC的时钟源和预分频器,选择合适的时钟频率。
2.配置RTC时间和日期:通过设置RTC的寄存器来配置当前时间和日期。
需要设置秒、分钟、小时、星期、日期、月份和年份,确保其具有正确的值。
3.启动RTC时钟:设置RTC的控制寄存器,使其开始工作。
可以选择启用或禁用闹钟功能,设置闹钟的时间和日期。
4.读取RTC数据:可以随时读取RTC的时间和日期数据。
读取数据后,可以进行各种计算和处理,如计算两个时间之间的差异、比较时间等。
5.处理RTC中断:可以设置RTC中断来触发一些操作,如闹钟触发时执行一些任务。
需要配置NVIC(Nested Vector Interrupt Controller)中断向量表,使能相应的中断。
6.备份和恢复RTC数据:RTC模块提供了备份寄存器,可以用来存储额外的信息。
可以使用一些特殊的寄存器,如BKP (Backup)寄存器或CPU的系统寄存器来备份和恢复数据。
7.断电维持能力:RTC模块的一个关键特性是其断电维持能力。
即使在断电情况下,RTC模块中的数据仍然能够保持。
可以通过电池供电电路来提供必要的电力。
8.节能模式:可以利用RTC模块的节能模式来降低功耗。
可以选择性地关闭RTC模块的不需要的功能,以减少功耗。
需要注意的是,具体的步骤可能会因芯片型号和开发工具的不同而有所差异。
因此,在使用STM32单片机的RTC时钟之前,需查阅相关的技术文档和参考手册,以了解具体操作步骤和寄存器配置。
以上是使用STM32单片机的RTC时钟的基本步骤。
在实际应用中,可以根据具体需求对RTC进行更多的配置和使用。
STM32学习笔记之—RTC
STM32学习笔记之—RTC写这篇学习笔记的时候距上一篇笔记间隔的时间不短了,期间有网友关心询问为什么不更新文章,主要是这一段时间工作太忙了没有闲暇时间做下来学习,工作是重要的事情,不能把饭碗丢了啊o(∩_∩)o…,好了废话少说切入正题。
既然我们要使用RTC就要先对它有个大致的了解,知己知彼才能百战不殆嘛!STM32内部RTC功能非常实用,它的供电和时钟是独立于内核的,可以说是STM32内部独立的外设模块,有加上RTC内部寄存器不受系统复位掉电的影响,我们可以才用外部电池供电和32768表振晶体来实现真正RTC(实时时钟)功能。
的这里引用手册里一段概述“RTC由两个主要部分组成。
第一部分(APB1接口)用来和APB1总线相连。
此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。
APB1接口以APB1总线时钟为时钟,用来与APB1总线接口。
另一部分(RTC核)由一系列可编程计数器组成,分成两个主要模块。
第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。
RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。
在每个TR_CLK周期中,如果在RTC_CR 寄存器中设置了相应允许位,则RTC产生一个中断(秒中断)。
第2个模块是一个32位的可编程的计数器,它可被初始化为当前的系统时间。
系统时间以TR_CLK速度增长并与存储在RTC_ALR寄存器中的可编程的时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,则比较匹配时将产生一个闹钟中断。
”对于第一次实用RTC的时候我们要对它进行配置一番,现在大致说一下(代码是通过调用RTC_Config函数来实现的):1. 打开电源管理和备份寄存器时钟,提到备份寄存器这里要说一下,引用手册--“备份寄存器是10个16位的寄存器,可用来存储20个字节的用户应用程序数据。
他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。
基于STM32的RTC实时时钟说明书
RTC实时时钟说明书
一:工作原理
STM32芯片中内置RTC时钟,当对RTC进行初始化后,便可以像电子钟一样运行,通过读取RTC对应的寄存器,可以获知年月日、时分秒信息。
有关RTC的说明可参考《STM32中文参考资料》。
二:实验现象及操作
程序下载后,有以下两种情况。
●如果芯片第一次初始化RTC,则程序将写入HEX生成的时间信息到芯片RTC时钟中,
然后读出时钟信息。
通过数码管显示。
●如果不是第一次初始化RTC,则程序将读取RTC对应寄存器的值,以时间信息显示
在数码管上。
如果开发板上有放入3V的小电池,则即使掉电,RTC时钟依然在走。
程序刚下载,数码管显示的数据为时-分-秒。
K1键,则显示年月日,左边四位为年份,最右边两位为日期。
其它两位为月份。
K2键,数码管继续显示时-分-秒。
stm32 rtc用法
stm32 rtc用法STM32是一款功能强大的微控制器系列,RTC(Real Time Clock)是其中一个重要的功能模块。
RTC模块为嵌入式设备提供了高精度的实时时钟功能,能够在断电后依然保持时间的准确性。
本篇文章将详细介绍STM32 RTC的使用方法,一步一步回答相关问题。
第一步:使用前的准备在开始使用STM32 RTC之前,需要对RTC模块进行一些准备工作。
首先,在Keil或者其他集成开发环境(IDE)中,需要将RTC作为外设来进行配置。
其次,需要对RTC外设的时钟进行配置,通常可以选择外部晶体振荡或者内部LSI振荡作为时钟源。
最后,还需要配置RTC的预分频器和计数器,以满足实际应用的需求。
第二步:初始化RTC模块在进行RTC模块的初始化之前,需要先对RTC外设进行使能。
通过启用RCC_AHB1ENR或RCC_APB1ENR寄存器中的RTCEN位,可以使能RTC外设。
接着,可以通过RCC_CSR寄存器中的备份域访问位(BDCR寄存器)来对RTC 模块进行初始化。
在初始化RTC模块时,可以设置时钟源、预分频器和计数器的初值,以及其他一些参数,如是否使能闹钟功能等。
第三步:设置RTC时间在RTC模块初始化完成后,可以通过写入RTC_TR和RTC_DR寄存器来设置RTC的时间。
其中,RTC_TR寄存器用于设置小时、分钟和秒钟的值,RTC_DR寄存器用于设置年、月和日期的值。
需要注意的是,写入RTC_TR和RTC_DR寄存器的时候,应该先禁用RTC写保护,然后再进行写操作。
完成时间设置后,可以重新启用RTC写保护。
第四步:读取RTC时间除了设置RTC时间外,还可以通过读取RTC_TR和RTC_DR寄存器来获取当前的RTC时间。
读取RTC时间的时候,同样需要先禁用RTC写保护,然后再进行读取操作。
完成读取后,需要重新启用RTC写保护。
第五步:使用闹钟功能RTC模块还支持闹钟功能,可以通过设置RTC_ALRMxR(x为1、2或3)寄存器来设置闹钟的时间和触发方式。
STM32单片机RTC时钟的使用方法及步骤
STM32单片机RTC时钟的使用方法及步骤
STM32RTC使用步骤:
打开PWR时钟和Backup区数据访问
若使用外部低速时钟(LSE),打开LSE并等待起振
选择和打开RTC时钟,等待时钟同步
配置时间格式,分频系数等
根据需要配置时钟,日期,闹钟,唤醒,输出,时间戳,备份寄存器等模块
根据需要配置和打开中断,其中
RTC Alarm ——EXTI line 17
RTC tamper and TImestamps——EXTI line 19
RTC wakeup——EXTI line 20
下面的代码配置日期,时间,当前时间设置为15年05月31日,星期日(7),15:50:40,打开闹钟A和唤醒中断,每一秒钟来一次中断,15:50:45秒产生闹钟中断,用串口打印相应的信息。
代码:
void RTC_Config(void)
{
RTC_TImeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;
RTC_InitTypeDef RTC_InitStructure;
RTC_AlarmTypeDef RTC_AlarmStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_BackupResetCmd(ENABLE);
RCC_BackupResetCmd(DISABLE);
RCC_LSEConfig(RCC_LSE_ON);。
STM32单片机RTC时钟的使用方法及步骤
STM32单片机RTC时钟的使用方法及步骤一、配置RTC模块时钟源RTC模块的时钟源可以选择外部低速晶振(LSE)或者低速内部时钟(LSI)。
通过以下步骤配置RTC时钟源:1.使能外部低速晶振(LSE)或者低速内部时钟(LSI)。
例如,如果使用外部低速晶振,则需要使能相应的GPIO端口,并配置为晶振模式。
2.配置RCC时钟控制寄存器(RCC_CR)和时钟配置寄存器(RCC_CSR)。
二、使能RTC模块时钟1.使能PWR模块时钟和备份寄存器访问。
RCC_APB1ENR,=(1<<28);RCC_APB1ENR,=(1<<27);2.校验并关闭RTC模块。
RCC->BDCR,=RCC_BDCR_RTCEN;PWR->CR,=PWR_CR_DBP;if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0)RCC->BDCR,=RCC_BDCR_RTCEN;3.配置RTC时钟预分频器和提供给RTC的时钟源。
RTC->PRER ,= rtc_prescaler_value << RTC_PRER_PREDIV_S_Pos;RTC->PRER ,= 127 << RTC_PRER_PREDIV_A_Pos;RTC->CR&=~RTC_CR_FMT;三、配置RTC模块时间和日期1.关闭RTC时钟写保护功能。
RTC->WPR=0xCA;RTC->WPR=0x53;RTC->ISR,=RTC_ISR_INIT;while((RTC->ISR & RTC_ISR_INITF) == 0);2.配置RTC的时间和日期寄存器。
RTC->TR ,= (uint32_t)((hours / 10) << RTC_TR_Hours10_Pos);RTC->TR ,= (uint32_t)((hours % 10) << RTC_TR_Hours1_Pos);RTC->TR ,= (uint32_t)((minutes / 10) <<RTC_TR_Minutes10_Pos);RTC->TR ,= (uint32_t)((minutes % 10) <<RTC_TR_Minutes1_Pos);RTC->TR ,= (uint32_t)((seconds / 10) <<RTC_TR_Seconds10_Pos);RTC->TR ,= (uint32_t)((seconds % 10) <<RTC_TR_Seconds1_Pos);RTC->DR ,= (uint32_t)((year / 10) << RTC_DR_YT_Pos);RTC->DR ,= (uint32_t)((year % 10) << RTC_DR_YU_Pos);RTC->DR ,= (uint32_t)((month / 10) << RTC_DR_MT_Pos);RTC->DR ,= (uint32_t)((month % 10) << RTC_DR_MU_Pos);RTC->DR ,= (uint32_t)((day / 10) << RTC_DR_DT_Pos);RTC->DR ,= (uint32_t)((day % 10) << RTC_DR_DU_Pos);3.开启RTC时钟写保护功能。
stm32几种时钟控制介绍,含原理图
stm32几种时钟控制介绍,含原理图本文提到的有以下内容:• 时钟系统与总线矩阵• SysTick系统定时器• RTC实时时钟• 看门狗定时器• 通用定时器一、时钟系统与总线矩阵stm32F4的时钟树如下图所示:在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
HSI是高速内部时钟,RC振荡器,频率为8MHz。
HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。
LSI是低速内部时钟,RC振荡器,频率为40kHz。
LSE是低速外部时钟,接频率为32.768kHz的石英晶体。
PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。
倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。
我们在学习51单片机的时候,其内部是没有晶振的,而stm32是有的。
stm32可以通过RCC(时钟控制寄存器)对时钟进行参数配置以及使能。
我们还可以通过修改system_stm32f4xx.c文件,来配置上述时钟树上的一些分频、倍频参数,得到理想的频率。
在单片机系统中,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序,组合电路需要好好理解清楚。
我们先来看一下总线矩阵。
片上总线标准种类繁多,而由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。
AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。
二者分别适用于高速与相对低速设备的连接。
一般性的时钟设置需要先考虑系统时钟的来源,是内部RC还是外部晶振还是外部的振荡器,是否需要PLL。
然后考虑内部总线和外部总线,最后考虑外设的时钟信号。
遵从先倍频作为CPU时钟,然后在由内向外分频,下级迁就上级的原则。
rtc实时时钟
// jj = 0;
// }
//得到时间并显示 RTC_GetCounter():获得RTC计数器的值 返回值是u32类型的RTC计数器的值
Time_Display(RTC_GetCounter());
//从指定的后备寄存器中读取数据,参数用来选择后备寄存器,可以是BKP_DR1~BKP_DR10 10个后备寄存器
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) //???为什么要检测0xA5A5
{
//配置RTC
RTC_Configuration();
// {
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成,也即等待RTC寄存器同步
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能或失能指定的RTC中断 第一个参数指定待配置的RTC中断源,可以是RTC_IT_SEC:秒中断
unsigned int LedOut[10]; //变量定义
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void RTC_Configuration(void);
GPIOB->BSRR = LedOut[i]<<8 & 0xFF00;
GPIOB->BRR = (~(LedOut[i]<<8)) & 0xFF00; //BRR:端口位复位寄存器
STM32-实时时钟-RTC
STM32-实时时钟(RTC)STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex®-M0,M0+,M3, M4和M7内核(ST's product portfolio contains a comprehensive range of microcontrollers, from robust, low-cost 8-bit MCUs up to 32-bit ARM-based Cortex®-M0 and M0+, Cortex®-M3, Cortex®-M4 Flash microcontrollers with a great choice of peripherals. ST has also extended this range to include an ultra-low-power MCU platform) 。
实时时钟(RTC)是一个专用于保持时间的计时元素。
在许多的应用中,特别是在需要执行精确定时操作的应用,RTC是非常有用的工具。
除了钟表这类应用的例子外还包括洗衣机、医药柜、数据记录仪等。
RTC基本上是一个定时计数器,但和MCU的其他定时器不同的是,它更精确一些。
在此之前文章中,我们探讨了STM32定时器,但他们对PWM生成、时基和其它波形相关任务的应用程序是有用的。
那些都不适合于精确的计时功能。
在大多数的8位MCU中,像普通的PIC和AVR,并有没有内置RTC模块,所以当我们需要一个板载的精确计时器件时,只能使用类似常见的DS1302或PCF8563的专用RTC 芯片。
这些芯片还需要一些额外的电路、布线以及电路板空间。
但是,目前大多数先进的微控制器都集成了设计人员可以想到的每一个可能的硬件。
这仅取决于设计者决定使用现代微控制器的哪个资源,来满足特定的设计目标。
制造用于满足应用特定需求的MCU的时代已经过去了,在设计中使用并涉及多个元件的时代也已经过去了。
关于STM32中RTC的校准方法
关于STM32中RTC的校准方法STM32微控制器系列中的RTC(Real-Time Clock,实时时钟)模块是一个用于提供实时时间和日期的硬件模块。
RTC的主要目的是在系统掉电后仍能持续运行并保持时间的准确性。
RTC的校准对于确保时间的准确性非常重要,特别是在长时间运行的应用中。
下面将介绍STM32中RTC的校准方法。
1.温度测量校准法(TM)RTC的精度受温度的影响,因此STM32的RTC模块提供了温度测量校准法来校准RTC的误差。
该方法需要在特定温度下测量RTC与基准时钟的误差,并将结果作为温度补偿参数存储在RTC寄存器中。
然后,STM32会使用这些参数来自动调整RTC的误差,并提供更准确的时间。
2.外部时钟校准法(EC)RTC模块可以通过外部时钟源进行校准。
在这种方法中,外部时钟源将与RTC的基准时钟进行比较,并通过调整RTC的预分频器和分频器参数来校准RTC的误差。
外部时钟源可以是一个精确的频率信号源,例如陶瓷谐振器或外部晶振。
3.自动校准调整法(ACA)STM32的RTC模块还提供了自动校准调整法。
该方法利用自带的时钟源对RTC进行周期性校准。
STM32会利用周期性的准确时间源与RTC进行比较,并通过调整RTC的预分频器和分频器参数来校准RTC的误差。
这种方法非常适用于长时间运行的应用,可以保持RTC的准确性。
除了上述方法外,还可以通过以下附加步骤来提高RTC的校准精度:1.外部参考时钟源:使用精确的外部参考时钟源,如GPS或网络时间协议(NTP),可以提供更准确的时间校准。
2.温度补偿:根据测量到的温度与RTC的准确度之间的关系,可以为RTC实现温度补偿。
这样,在温度变化时,RTC的准确度会得到调整。
3.周期性校准:定期进行RTC的校准,以确保其准确性。
可以根据应用的要求选择适当的校准时间间隔。
总结起来,STM32中RTC的校准方法包括温度测量校准法、外部时钟校准法和自动校准调整法。
实时时钟实验总结
实时时钟实验总结一、引言实时时钟(Real Time Clock,RTC)是一种能够提供准确时间和日期信息的设备。
在各种应用中,实时时钟都扮演着重要的角色,例如计算机系统中的时间同步、电子设备中的时间戳记录等。
本文将对实时时钟实验进行总结,包括实验目的、实验原理、实验步骤以及实验结果分析等内容。
二、实验目的本实验旨在通过搭建实时时钟电路,并使用相应的程序进行控制,实现对时间和日期的准确显示。
具体目的如下: 1. 理解实时时钟的基本原理和工作方式; 2. 掌握实时时钟电路的搭建方法; 3. 学会使用程序控制实时时钟的功能。
三、实验原理实时时钟电路由晶振、RTC芯片、电池及其他辅助电路组成。
其工作原理如下: 1. 晶振产生基准时钟信号,供RTC芯片使用; 2. RTC芯片通过与晶振的配合,实时计时,并将时间和日期信息存储在相关寄存器中; 3. 电池供电保证RTC芯片在断电情况下仍能持续工作,避免时间和日期信息的丢失。
四、实验步骤1. 准备实验材料和工具•Arduino开发板•DS1302实时时钟模块•面包板•连接线•电池2. 搭建电路按照以下步骤搭建实时时钟电路: 1. 将DS1302模块插入面包板中,确保引脚与面包板上的连接良好; 2. 将Arduino开发板与DS1302模块通过连接线连接起来,注意连接的引脚要与程序中定义的引脚对应; 3. 连接电池到DS1302模块的电池接口上,确保电池正负极正确连接。
3. 编写程序使用Arduino开发环境,编写相应的程序代码,实现对DS1302模块的控制和时间显示功能。
程序主要包括如下功能: - 初始化DS1302模块; - 读取DS1302模块中的时间和日期信息; - 在串口监视器上显示时间和日期信息; - 实现时间和日期的设置功能。
4. 上传程序并测试将编写好的程序上传到Arduino开发板上,并打开串口监视器,观察时间和日期信息的显示情况。
同时,通过修改程序中的设置功能,验证实时时钟的准确性和可靠性。
STM32_RTC简介及程序
stm32——RTC实时时钟一、关于时间2038年问题在计算机应用上,2038年问题可能会导致某些软件在2038年无法正常工作。
所有使用UNIX时间表示时间的程序都将将受其影响,因为它们以自1970年1月1日经过的秒数(忽略闰秒)来表示时间。
这种时间表示法在类Unix(Unix-like)操作系统上是一个标准,并会影响以其C编程语言开发给其他大部份操作系统使用的软件。
在大部份的32位操作系统上,此“time_t”数据模式使用一个有正负号的32位元整数(signedint32)存储计算的秒数。
也就是说最大可以计数的秒数为 2^31次方可以算得:2^31/3600/24/365 ≈ 68年所以依照此“time_t”标准,在此格式能被表示的最后时间是2038年1月19日03:14:07,星期二(UTC)。
超过此一瞬间,时间将会被掩盖(wrap around)且在内部被表示为一个负数,并造成程序无法工作,因为它们无法将此时间识别为2038年,而可能会依个别实作而跳回1970年或1901年。
对于PC机来说,时间开始于1980年1月1日,并以无正负符号的32位整数的形式按秒递增,这与UNIX时间非常类似。
可以算得:2^32/3600/24/365 ≈ 136年到2116年,这个整数将溢出。
Windows NT使用64位整数来计时。
但是,它使用100纳秒作为增量单位,且时间开始于1601年1月1日,所以NT将遇到2184年问题。
苹果公司声明,Mac在29,940年之前不会出现时间问题!二、RTC使用说明"RTC"是Real Time Clock 的简称,意为实时时钟。
stm32提供了一个秒中断源和一个闹钟中断源,修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。
但实际上,RTC就只是一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。
正点原子rtc例程
正点原子rtc例程你可以在正点原子的官方网站上查找RTC例程相关信息,以下为你提供一个基于STM32的RTC实时时钟例程:```c#include "timer.h"#include "usmart.h"// 共阴数字数组// 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, ., 全灭u8 smg_num() = {0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e, 0x01, 0x00};int main(void){HAL_Init(); // 初始化 HAL 库Stm32_Clock_Init(RCC_PLL_MUL9); // 设置时钟,72Mdelay_init(72); // 初始化延时函数LED_SMG_Init(); // 初始化数码管uart_init(115200); // 串口初始化为115200LED_Init(); // 初始化与 LED 连接的硬件接口usmart_dev.init(72); // 初始化 USMARTTIM3_Init(19,7199); // 数码管2ms定时显示LED0 = !LED0;LED2=!LED2;LED4=!LED4;LED6=!LED6;while (RTC_Init()) // RTC 初始化,一定要初始化成功{printf("RTC ERROR!\r\n");delay_ms(800);printf("RTC Trying...\r\n");}while(1){u8 smg_wei = 0;// 数码管位选u8 num = 0;// 数码管数值u8 time = 0;// 时间值// 回调函数,定时器中断服务函数调用void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {if (htim == (&TIM3_Handler)){switch (smg_wei){case 0:num = smg_num(calendar.hour /10);break;// 时case 1:num = smg_num(calendar.hour %10);break;case 2:case 5:num = 0x02;break;case 3:num = smg_num(calendar.min /10);break; // 分case 4:num = smg_num(calendar.min %10);break;case 6:num = smg_num(calendar.sec /10);break; // 秒case 7:num = smg_num(calendar.sec %10);break;}if (time != calendar.sec) // LED 灯每秒翻转{LED0 = !LED0;LED2=!LED2;LED4=!LED4;LED6=!LED6;}}}}}```上述代码实现了一个基于STM32的RTC实时时钟,其主要功能为通过RTC实时更新时间,并在LED数码管上显示。
35. RTC实时时钟实验[11页]
普中STM32开发板带您进入ARM世界
4.编写RTC控制程序
本章所要实现的功能是:设置RTC时间日期初值,在RTC秒中断内使用 串口打印出RTC日期和时间,D1指示灯闪烁提示系统运行。程序框架如下 : (1)初始化RTC,设置RTC时间日期初值 (2)开启RTC的秒中断,编写RTC中断函数, (3)在RTC中断内更新时间并打印输出 (4)编写主函数
STM32F1的RTC,就需要了解它内部的结构。如图32.1.1所示:(大家也 可以查看《STM32F10x中文参考手册》-16实时时钟(M世界
系统复位后, 默认禁止访问后备寄存器和 RTC,防止对后备区域 (BKP)的意外写操作。执行以下操作使能对后备寄存器和 RTC 的访问: (1) 设置 RCC_APB1ENR 寄存器的 PWREN 和 BKPEN 位来使能电源和后备
3.硬件电路
本实验使用到硬件资源如下: (1)D1指示灯 (2)串口1 (3)RTC
D1指示灯、串口1电路在前面章节都介绍过,这里就不多说,至于RTC 它属于STM32F1芯片内部的资源,只要通过软件配置好即可使用。D1指示 灯用来提示系统运行状态。串口1将读取的RTC时间日期信息打印出来。
这里需要注意RTC 不能断电,否则时间数据将会丢失,如果想让时间 在断电后还可以继续走,那么必须确保开发板上的纽扣电池有电。
接口时钟。 (2) 设置电源控制寄存器(PWR_CR)的 DBP 位使能对后备寄存器和 RTC
的访问。 设置后备寄存器为可访问后,在第一次通过 APB1 接口访问 RTC 时 , 因为时钟频率的差异,所以必须等待 APB1 与 RTC 外设同步,确保 被读取出来的 RTC 寄存器值是正确的。若在同步之后,一直没有关闭 APB1 的 RTC 外设接口,就不需要再次同步了。 如果内核要对 RTC寄存器进行任何的写操作,在内核发出写指令后, RTC模块在 3个RTCCLK 时钟之后,才开始正式的写 RTC 寄存器操作。 由于 RTCCLK 的频率比内核主频低得多,所以每次操作后必须要检查 RTC关闭操作标志位 RTOFF,当这个标志被置 1 时,写操作才正式完成 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
图 20.1.3 RTC_DR 寄存器各位描述 同样,该寄存器的的数据始化模式下,对该寄存器进行写操作,可以设置日期。 接下来,看 RTC 亚秒寄存器:RTC_SSR,该寄存器各位描述如图:20.1.4 所示:
RTC 的简化框图,如图 20.1.1 所示:
图 20.1.1 RTC 框图 此图可以从 STM32F4 中文参考手册 RTC 章节中找到(图 222:RTC 框图)。本章我们用到
289
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
RTC 时钟和日历,并且用到闹钟功能。接下来简单介绍下 STM32F4 RTC 时钟的使用。 1,时钟和分频 首先,我们看 STM32F4 的 RTC 时钟分频。STM32F4 的 RTC 时钟源(RTCCLK)通过时
RTC 模块和时钟配置是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时 间维持不变,只要后备区域供电正常,那么 RTC 将可以一直运行。但是在系统复位后,会自动 禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。
WUCKSEL [1]代替)。 初始化完成后,定时器开始递减计数。在低功耗模式下使能唤醒功能时,递减计数保持有
效。此外,当计数器计数到 0 时,RTC_ISR 寄存器的 WUTF 标志会置 1,并且唤醒寄存器会使 用其重载值(RTC_WUTR 寄存器值)动重载,之后必须用软件清零 WUTF 标志。
通过将 RTC_CR 寄存器中的 WUTIE 位置 1 来使能周期性唤醒中断时,可以使 STM32F4 退出低功耗模式。系统复位以及低功耗模式(睡眠、停机和待机)对唤醒定时器没有任何影响, 它仍然可以正常工作,故唤醒定时器,可以用于周期性唤醒 STM32F4。
290
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
秒。并且这个 1s~36h 的可编程时间范围分为两部分: 当 WUCKSEL[2:1]=10 时为:1s 到 18h。 当 WUCKSEL[2:1]=11 时约为:18h 到 36h。 在后一种情况下,会将 2^16 添加到 16 位计数器当前值(即扩展到 17 位,相当于最高位用
钟控制器,可以从 LSE 时钟、LSI 时钟以及 HSE 时钟三者中选择(通过 RCC_BDCR 寄存器选 择)。一般我们选择 LSE,即外部 32.768Khz 晶振作为时钟源(RTCCLK),而 RTC 时钟核心,要 求提供 1Hz 的时钟,所以,我们要设置 RTC 的可编程预分配器。STM32F4 的可编程预分配器 (RTC_PRER)分为 2 个部分:
294
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
图 20.1.9 RTC_ALRMAR 寄存器各位描述 该寄存器用于设置闹铃 A,当 WDSEL 选择 1 时,使用星期制闹铃,本章我们选择星期制 闹铃。该寄存器的配置,必须等待 RTC_ISR 的 ALRAWF 为 1 才可以进行。另外,还有 RTC_ALRMASSR 寄存器,该寄存器我们这里就不再介绍了,大家参考《STM32F4xx 中文数据 手册》第 23.6.19 节。 接下来看 RTC 写保护寄存器:RTC_WPR,该寄存器比较简单,低八位有效。上电后,所 有 RTC 寄存器都受到写保护(RTC_ISR[13:8]、RTC_TAFCR 和 RTC_BKPxR 除外),必须依次 写入:0XCA、0X53 两关键字到 RTC_WPR 寄存器,才可以解锁。写一个错误的关键字将再次 激活 RTC 的寄存器写保护。
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
第二十章 RTC 实时时钟实验
前面我们介绍了两款液晶模块,这一章我们将介绍 STM32F4 的内部实时时钟(RTC)。在 本章中,我们将使用 TFTLCD 模块来显示日期和时间,实现一个简单的实时时钟,并可以设置 闹铃。另外,本章将顺带向大家介绍 BKP 的使用。本章分为如下几个部分:
接下来,我们看看本章我们要用到的 RTC 部分寄存器,首先是 RTC 时间寄存器:RTC_TR, 该寄存器各位描述如图 20.1.2 所示:
图 20.1.2 RTC_TR 寄存器各位描述 这个寄存器比较简单,注意数据保存是 BCD 格式的,读取之后需要稍加转换,才是十进 制的时分秒等数据,在初始化模式下,对该寄存器进行写操作,可以设置时间。 然后看 RTC 日期寄存器:RTC_DR,该寄存器各位描述如图 20.1.3 所示:
20.1 STM32F4 RTC 时钟简介 20.2 硬件设计 20.3 软件设计 20.4 下载验证
20.1 STM32F4 RTC 时钟简介
STM32F4 的实时时钟(RTC)相对于 STM32F1 来说,改进了不少,带了日历功能了, STM32F4 的 RTC,是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟(包含年月日 时分秒信息)、两个可编程闹钟(ALARM A 和 ALARM B)中断,以及一个具有中断功能的周 期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。
1, 一个通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器。 2, 一个通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器。 图 20.1.1 中,ck_spre 的时钟可由如下计算公式计算:
Fck_spre=Frtcclk/[(PREDIV_S+1)*( PREDIV_A+1)] 其中,Fck_spre 即可用于更新日历时间等信息。PREDIV_A 和 PREDIV_S 为 RTC 的异步 和同步分频器。且推荐设置 7 位异步预分频器(PREDIV_A)的值较大,以最大程度降低功耗。 要设置为 32768 分频,我们只需要设置:PREDIV_A=0X7F,即 128 分频;PREDIV_S=0XFF, 即 256 分频,即可得到 1Hz 的 Fck_spre。 另外,图 20.1.1 中,ck_apre 可作为 RTC 亚秒递减计数器(RTC_SSR)的时钟,Fck_apre 的计算公式如下:
图 20.1.4 RTC_SSR 寄存器各位描述 该寄存器可用于获取更加精确的 RTC 时间。不过,在本章没有用到,如果需要精确时间的 地方,大家可以使用该寄存器。 接下来看 RTC 控制寄存器:RTC_CR,该寄存器各位描述如图 20.1.5 所示:
292
STM32F4 开发指南(库函数版)
ALIENTEK 探索者 STM32F407 开发板教程
图 20.1.6 RTC_ISR 寄存器各位描述 该寄存器中,WUTF、ALRBF 和 ALRAF,分别是唤醒定时器闹钟 B 和闹钟 A 的中断标志 位,当对应事件产生时,这些标志位被置 1,如果设置了中断,则会进入中断服务函数,这些 位通过软件写 0 清除;INIT 为初始化模式控制位,要初始化 RTC 时,必须先设置 INIT=1;INITF 为初始化标志位,当设置 INIT 为 1 以后,要等待 INITF 为 1,才可以更新时间、日期和预分频 寄存器等;RSF 位为寄存器同步标志,仅在该位为 1 时,表示日历影子寄存器已同步,可以正 确读取 RTC_TR/RTC_TR 寄存器的值了;WUTWF、ALRBWF 和 ALRAWF 分别是唤醒定时器、 闹钟 B 和闹钟 A 的写标志,只有在这些位为 1 的时候,才可以更新对应的内容,比如:要设置 闹钟 A 的 ALRMAR 和 ALRMASSR,则必须先等待 ALRAWF 为 1,才可以设置。 接下来看 RTC 预分频寄存器:RTC_PRER,该寄存器各位描述如图 20.1.7 所示:
Fck_apre=Frtcclk/( PREDIV_A+1) 当 RTC_SSR 寄存器递减到 0 的时候,会使用 PREDIV_S 的值重新装载 PREDIV_S。而 PREDIV_S 一般为 255,这样,我们得到亚秒时间的精度是:1/256 秒,即 3.9ms 左右,有了这 个亚秒寄存器 RTC_SSR,就可以得到更加精确的时间数据。 2,日历时间(RTC_TR)和日期(RTC_DR)寄存器 STM32F4 的 R存器,用于存储时间和日期 (也可以用于设置时间和日期),可以通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问, 这些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间。 每隔 2 个 RTCCLK 周期,当前日历值便会复制到影子寄存器,并置位 RTC_ISR 寄存器的 RSF 位。我们可以读取 RTC_TR 和 RTC_DR 来得到当前时间和日期信息,不过需要注意的是: 时间和日期都是以 BCD 码的格式存储的,读出来要转换一下,才可以得到十进制的数据。 3,可编程闹钟 STM32F4 提供两个可编程闹钟:闹钟 A(ALARM_A)和闹钟 B(ALARM_B)。通过 RTC_CR 寄存器的 ALRAE 和 ALRBE 位置 1 来使能可编程闹钟功能。当日历的亚秒、秒、分、小时、 日期分别与闹钟寄存器 RTC_ALRMASSR/RTC_ALRMAR 和 RTC_ALRMBSSR/RTC_ALRMBR 中的值匹配时,则可以产生闹钟(需要适当配置)。本章我们将利用闹钟 A 产生闹铃,即设置 RTC_ALRMASSR 和 RTC_ALRMAR 即可。 4,周期性自动唤醒 STM32F4 的 RTC 不带秒钟中断了,但是多了一个周期性自动唤醒功能。周期性唤醒功能, 由一个 16 位可编程自动重载递减计数器(RTC_WUTR)生成,可用于周期性中断/唤醒。 我们可以通过 RTC_CR 寄存器中的 WUTE 位设置使能此唤醒功能。 唤醒定时器的时钟输入可以是:2、4、8 或 16 分频的 RTC 时钟(RTCCLK),也可以是 ck_spre 时钟(一般为 1Hz)。 当选择 RTCCLK(假定 LSE 是:32.768 kHz)作为输入时钟时,可配置的唤醒中断周期介于 122us(因为 RTCCLK/2 时,RTC_WUTR 不能设置为 0)和 32 s 之间,分辨率最低为:61us。 当选择 ck_spre(1Hz)作为输入时钟时,可得到的唤醒时间为 1s 到 36h 左右,分辨率为 1