STM32单片机RTC时钟的使用方法及步骤
STM32系列MCU硬件实时时钟(RTC)应用笔记说明书

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 微控制器。
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. 日期中断:每当计数器的日期字段更新时触发中断。
STM32 RTC实时时钟实验

我们在进入闹钟中断的时候,通过判断这位来决定是不是发生了秒钟 中断。然后必须通过软件将该位清零(写0)。第3位为寄存器同步标 志位,我们在修改控制寄存器RTC_CRH/CRL之前,必须先判断该位 ,是否已经同步了,如果没有则等待同步,在没同步的情况下修改 RTC_CRH/CRL的值是不行的。第4位为配置标位,在软件修改 RTC_CNT/RTC_ALR/RTC_PRL的值的时候,必须先软件置位该位,以 允许进入配置模式。第5位为RTC操作位,该位由硬件操作,软件只读 。通过该位可以判断上次对RTC寄存器的操作是否完成,如果没有, 我们必须等待上一次操作结束才能开始下一次操作。
4)选择RTC时钟,并使能。
这里我们将通过RCC_BDCR的RTCSEL来选择选择外部LSI作为RTC的时钟。 然后通过RTCEN位使能RTC时钟。
5)设置RTC的分频,以及配置RTC时钟。
在开启了RTC时钟之后,我们要做的就是设置RTC时钟的分频数,通过 RTC_PRLH和RTC_PRLL来设置,然后等待RTC寄存器操作完成,并同步之后 ,设置秒钟中断。然后设置RTC的允许配置位(RTC_CRH的CNF位),设置 时间(其实就是设置RTC_CNTH和RTC_CNTL两个寄存器)。
2013-5-23
广州市星翼电子科技有限公司
3
《例说STM32》
RTC的简化框图,如下图所示:
2013-5-23
广州市星翼电子科技有限公司
4
《例说STM32》
RTC由两个主要部分组成(参见图16.1),第一部分(APB1接口)用来 和APB1总线相连。此单元还包含一组16位寄存器,可通过APB1总线 对其进行读写操作。APB1接口由APB1总线时钟驱动,用来与APB1总 线接口。 另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。第 一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基 准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC 预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每个 TR_CLK周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的 可编程计数器,可被初始化为当前的系统时间,一个32位的时钟计数器 ,按秒钟计算,可以记录4294967296秒,约合136年左右,作为一般 应用,这已经是足够了的。
stm32的RTC时钟程序

rtcfirstconfigure程序是第一次配置rtc如果配置后以后上电不需要重新
stm32的RTC时钟程序
sபைடு நூலகம்m32 的RTC 时钟程序
前些日子做了stm32 RTC 时钟的程序,现在把它记录下来。首先配置RTC,,使用外部时钟32.768KHz。其中配置了秒中断。
RTCFirstConfigure()程序是第一次配置RTC,如果配置后以后上电不需要重新
配置,如果RTC 时钟快了,可内部校准。
void RTCFirstConfigure() //first ini { RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); RCC_LSEConfig(RCC_LSE_ON); //enable LSE clock 32.768K while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {} // Select LSE as RTC Clock Source RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //Enable RTC Clock / RCC_RTCCLKCmd(ENABLE); // Wait for RTC registers synchronization / RTC_WaitForSynchro(); // Wait until last write operation on RTC registers has finished / RTC_WaitForLastTask(); // Enable the RTC Second Interrupt/ RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RTC_SetPrescaler(32767); // RTC period = RTCCLK/RTC_PR = (32.768KHz)/(32767+1)/ RTC_WaitForLastTask(); // BKP_SetRTCCalibrationValue(120); //RTC Calibration RCC_ClearFlag(); } RTCNorConfigure()程序配置完后每次上电都运行的程序
重返STM32之---RTC使用

重返STM32之---RTC使用STM3f10x的RTC时能涉及到的寄存器有RCC,BKP和RTC这三个大类寄存器;其中RCC主要控制了实时时钟和备份区的电源使能和时钟使能;RTC模块和时钟配置系统的寄存器是在后备区域的(即BKP),通过BKP后备区域来存储RTC配置的数据可以让在系统复位或待机模式下唤醒后RTC里面配置的数据维持不变;为此备份区还得涉及一个寄存器PWR,电源管理寄存器,备份区的写保护位在PWR->CR的第八位。
由于整个RTC都是位于后备区,而且RTC的APB1总线和内核的APB1总线是独立的,所以在系统复位和唤醒时,RTC和BKP的那些时钟不用从新配置;他们只受Backup domain software reset这个位和系统完全掉电的影响。
所以呢;RTC只要有备用电池,它可以完全独立工作。
如图一和图二所示图一图二大家要清楚f10x系列的RTC算不上一个真正意义上的RTC,它只是一个计数器,精度上难免差强人意,所以设计要注意是否满足计时要求。
如果是要实现实时时间以上所有的寄存器都要有相应设置,如果只用秒中断,那么只需要设置RCC和RTC的寄存器就可以了。
以下以实现实时时钟为例讲解初始化过程。
检测后备区是否已有有效标记BKP->DR1 != 0x5050;//(DR1 TO DR42)库函数BKP_ReadBackupRegister(BKP_DR1) != 0x5050;开启电源管理和备份区时钟(RCC->APB1ENR |=1APB1ENR |=1取消备份去写保护(PWR->CR |=1复位后备区所有寄存器RCC->BDCR |=1BDCR &=~(1开启外部32k晶振RCC->BDCR |=132k晶振是否正常工作库函数while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);选择32k为RTC时钟并使能RTC库函数等待RTC操作和同步完成库函数使能秒中断库函数RTC_ITConfig(RTC_IT_SEC, ENABLE);;配置RTC允许配置//set time---库函数BKP_WriteBackupRegister(BKP_DR1, 0X5050); 如果时钟已被设置过(RTC。
STM32实时时钟RTC按键修改时间

uip_setnetmask(ipaddr);
uip_listen(HTONS(1200));//监听1200端口,用于TCP Server
uip_listen(HTONS(80));//监听80端口,用于Web Server
case 1:LCD_ShowString(1,7,"一");break;
case 2:LCD_ShowString(1,7,"二");break;
case 3:LCD_ShowString(1,7,"三");break;
case 4:LCD_ShowString(1,7,"四");break;
case 5:LCD_ShowString(1,7,"五");break;
{
uip_arp_arpin();
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
//需要发送的数据在uip_buf,长度是uip_len(这是2个全局变量)
if(uip_len>0)tapdev_send();//需要发送数据,则通过tapdev_send发送
}
}else if(timer_expired(&periodic_timer))//0.5秒定时器超时
tcp_client_reconnect();//尝试连接到TCP Server端,用于TCP Client
while (1)
{ Display_Time();
uip_polling();//处理uip事件,必须插入到用户程序的循环体中
//key=KEY_Scan();
STM32L4如何用闹钟唤醒待机模式

STM32L4如何用闹钟唤醒待机模式STM32L4微控制器是一款低功耗型的微控制器,具有多种低功耗模式,包括待机模式。
待机模式是一种非常低功耗的模式,减少了系统的功耗和电池的消耗。
在待机模式下,微控制器处于最低功耗状态,只有少数外设处于工作状态。
为了实现在待机模式下使用闹钟唤醒,需要使用RTC(实时时钟)和唤醒时钟。
以下是在STM32L4微控制器上使用闹钟唤醒待机模式的步骤:第一步:配置RTCRTC是一个计时器和日历,可以配置为以低功耗模式运行,以实现在待机模式下仍然运行。
需要配置RTC的时钟源和时钟预分频器,以及闹钟的时间和日期。
可以使用STM32CubeMX工具来生成初始化代码,并进行配置。
第二步:配置唤醒时钟唤醒时钟是唤醒待机模式的时钟源,可以选择RTC时钟或者外部时钟。
需要配置唤醒时钟源的时钟频率和预分频器。
第三步:配置RTC闹钟唤醒RTC闹钟唤醒是通过比较RTC计数器的值和闹钟的时间来实现的。
需要设置闹钟的时间和日期,并使能RTC的闹钟中断。
可以使用RTC中断处理函数来处理闹钟中断。
第四步:配置待机模式需要将微控制器设置为待机模式,并选择所需的待机模式。
可以选择从WFI或WFE指令进入待机模式,然后在唤醒时钟中断发生时唤醒。
第五步:进入待机模式通过设置待机模式位,可以将微控制器设置为待机模式。
可以在主循环中或者其他适当的位置调用待机模式函数,以便在满足一定条件时进入待机模式。
例如,在任何其他可能导致系统空闲的地方,可以插入检查唤醒条件的代码,并在满足条件时调用待机模式函数。
第六步:处理唤醒中断当RTC闹钟的时间和日期与RTC计数器的值匹配时,将会发生唤醒中断,并从待机模式中唤醒。
可以在RTC中断处理函数中处理唤醒中断,例如重新配置RTC闹钟或恢复其他外设。
通过以上步骤,就可以实现在待机模式下使用RTC闹钟唤醒STM32L4微控制器。
这样可以大大降低系统的功耗,并在指定的时间唤醒系统进行相应的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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时钟写保护功能。
RTC->ISR&=~RTC_ISR_INIT;
RTC->WPR=0xFF;
四、使用RTC时钟功能
1.配置RTC的中断使能。
RTC->CR,=RTC_CR_ALRIE;
RTC->CR,=RTC_CR_WUTIE;
RTC->CR,=RTC_CR_TSIE;
2.配置RTC的唤醒定时器。
RTC->ISR&=~RTC_ISR_WUTF;
RTC->CR&=~RTC_CR_WUTE;
RTC->CR,=RTC_CR_WUTE;
while((RTC->ISR & RTC_ISR_WUTF) == 0);
3.获取RTC模块的时间和日期。
uint32_t hours = ((RTC->TR & RTC_TR_HT_Msk) >>
RTC_TR_Hours10_Pos) * 10 + ((RTC->TR & RTC_TR_HU_Msk) >>
RTC_TR_Hours1_Pos);
uint32_t minutes = ((RTC->TR & RTC_TR_MNT_Msk) >>
RTC_TR_Minutes10_Pos) * 10 + ((RTC->TR & RTC_TR_MNU_Msk) >>
RTC_TR_Minutes1_Pos);
uint32_t seconds = ((RTC->TR & RTC_TR_ST_Msk) >>
RTC_TR_Seconds10_Pos) * 10 + ((RTC->TR & RTC_TR_SU_Msk) >>
RTC_TR_Seconds1_Pos);
uint32_t year = ((RTC->DR & RTC_DR_YT_Msk) >> RTC_DR_YT_Pos) * 10 + ((RTC->DR & RTC_DR_YU_Msk) >> RTC_DR_YU_Pos);
uint32_t month = ((RTC->DR & RTC_DR_MT_Msk) >> RTC_DR_MT_Pos) * 10 + ((RTC->DR & RTC_DR_MU_Msk) >> RTC_DR_MU_Pos);
uint32_t day = ((RTC->DR & RTC_DR_DT_Msk) >> RTC_DR_DT_Pos)
* 10 + ((RTC->DR & RTC_DR_DU_Msk) >> RTC_DR_DU_Pos);
以上就是STM32单片机RTC时钟的使用方法及步骤,通过这些步骤可
以实现RTC模块的初始化、配置和使用。
使用RTC模块可以方便地实现单
片机的实时定时和日期相关功能。