STM32F10x芯片RTC实时时钟

发布者:shengju最新更新时间:2020-10-19 来源: eefocus关键字:STM32F10x芯片  RTC  实时时钟 手机看文章 扫描二维码
随时随地手机看文章

1、介绍

       系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:


设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟(调用:RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE));


设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问(调用:PWR_BackupAccessCmd(ENABLE))。


2、RTC注意事项

RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位;系统复位或电源复位不会影响他们的值;


RTC提供APB1接口通ABP1读取RTC寄存器的值,但必须等待RTC_CRL寄存器中的RSF(同步标志位)位被硬件置“1”之后进行;


RTC的配置必需在前一次写操作结束(判断RTC_CR寄存器中的RTOFF是否为1,为1表示更新完成),并设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器,清除CNF标志位时,写操作才实际有效(说明RTC是动态配置的,即是在RTC运行起来之后再进行配置);


RTC中的任何标志位都将保持挂起状态(因为OWF、ALRF、SECF和RSF只能由硬件置位由软件清零),直到适当的RTC_CR请求位被软件复位,表示所有请求的中断已经被接受;


若ALRF=1且ALRIE=1,则允许产生RTC全局中断,如果EXTI控制器中允许产生EXTI线17中断,则允许产生RTC全局中断和RTC闹钟中断,在这种情况下,一般设置闹铃中断优先级高于全局中断,如果全局中断优先级高于闹铃中断,则在全局中断中必须清除闹钟中断标志之后,才能进入闹钟中断处理函数进一步处理(因为不清除标志,则会一直引发中断,而全局中断优先级高,就会一直在全局中断中无法跳出来);


若ALRF=1,如果在EXTI控制器中设置了EXTI线17的中断模式,则允许产生RTC闹钟中断;如果在EXTI控制器中设置了EXTI线17的事件模式,则这条线上会产生一个脉冲(不会产生RTC闹钟中断);


当APB1时钟不运行时,OWF、ALRF、SECF和RSF位不被更新;


系统复位时禁止所有中断,无挂起中断请求,可以对RTC寄存器进行写操作;


对RTC的写操作必须使用如下过程之一与RTC秒标志同步:


使用RTC闹钟中断,并在中断处理程序中修改RTC闹钟和/或RTC计数器;


等待RTC控制寄存器中秒标志SECF置位,再更改RTC闹钟和/或RTC计数器。


3、RTC寄存器描述

RTC控制寄存器高位RTC_CRH/低位RTC_CRL


RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL)


RTC预分频器余数寄存器(RTC_DIVH/RTC_DIVL)


RTC计数器寄存器(RTC_CNTH/RTC_CNTL)


RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)


与RTC相关的寄存器有:


APB1外设时钟使能寄存器RCC_APB1ENR的PWREN和BKPEN,使能电源和后备时钟


电源控制寄存器PWR_CR的后备区域保护位:DBP


4、RTC配置流程

配置RCC:选择系统时钟、配置总线时钟、使能外围设备时钟等;


调用RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE)函数,使能电源和备份域时钟;


调用PWR_BackupAccessCmd(ENABLE)获取后备区域访问权限;


调用BKP_DeInit()函数将外设BKP的全部寄存器重设为缺省值;


配置并选择RTC时钟:调用RCC_RTCCLKConfig(RCC_RTCCLKSource_XXX)选择是LSE、HSE的128分频或者LSI;


RTC配置:


调用RCC_RTCCLKCmd(ENABLE)使能RTC时钟;


调用RTC_WaitForSynchro()等待RTC寄存器(RTC_CNT、RTC_ALR和RTC_PRL)与RTC的APB时钟同步(等待RTOFF位置1);


调用RTC_WaitForLastTask()函数等待最近一次对RTC寄存器的写操作完成;


调用RTC配置函数(如RTC_SetPrescaler(40000))配置RTC(说明:对RTC的控制寄存器是可以直接读写的;对RTC_PRL、RTC_CNT、RTC_ALR的写操作需要进入配置模式,而读他们则只需要等待同步完成(RSF置1)通过APB1接口读取);


每次调用RTC配置函数之后需要调用RTC_WaitForLastTask()等待本次配置成功。


EXTI配置:若需要将RTC于EXTI线17相连,则配置EXTI线17为中断/事件模式;


NVIC配置:若要产生中断,则配置中断向量控制器,使能EXTI15_10_IRQHandler中断,或者使能RTC_IRQHandler中断;


编写中断处理函数:注意一定要在中断处理函数中调用RTC_ClearITPendingBit()函数清除对应的中断标志位;


5、RTC配置实例

void NVIC_Configuration(void)


{


       NVIC_InitTypeDef NVIC_InitStructure;


#ifdef VECT_TAB_RAM


       NVIC_SetVectorTable(NVIC_VectTab_RAM,0x00);


#else


       NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x00);


#endif


       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


       NVIC_InitStructure.NVIC_IRQChannel =  RTCAlarm_IRQn;


       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;


       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


       NVIC_Init(&NVIC_InitStructure);


/* 设置闹钟中断优先级高于全局中断 */


       NVIC_InitStructure.NVIC_IRQChannel =  RTC_IRQn;


       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;


       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;


       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


       NVIC_Init(&NVIC_InitStructure);


}


 


void RTC_Configuration(void)


{


       RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);


       PWR_BackupAccessCmd(ENABLE);


       BKP_DeInit();


       RCC_LSICmd(ENABLE);


       while(RESET == RCC_GetFlagStatus(RCC_FLAG_LSIRDY))


       {


       }


       RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);


       RCC_RTCCLKCmd(ENABLE);


       RTC_WaitForSynchro();


       RTC_WaitForLastTask();


       RTC_ITConfig(RTC_IT_ALR,ENABLE);


       RTC_ITConfig(RTC_IT_SEC,ENABLE);


       RTC_SetPrescaler(6000);


       RTC_WaitForLastTask();


       RTC_SetAlarm(29);


       RTC_WaitForLastTask();


       BKP_TamperPinCmd(DISABLE);


       BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);


}


void EXTI_Configuration(void)


{


       EXTI_InitTypeDef EXTI_InitStructure;


       EXTI_InitStructure.EXTI_Line = EXTI_Line17;


       EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;


       EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;


       EXTI_InitStructure.EXTI_LineCmd = ENABLE;


       EXTI_Init(&EXTI_InitStructure);


}


/* 中断处理函数 */


void RTC_IRQHandler(void)


{


       if(SET == RTC_GetITStatus(RTC_IT_SEC))


              {


                     RTC_ClearITPendingBit(RTC_IT_SEC);


       GPIO_WriteBit(GPIOB,GPIO_Pin_13,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_13)));


              }


}


 


void RTCAlarm_IRQHandler(void)


{


       if(SET == RTC_GetFlagStatus(RTC_IT_ALR))


       {


              RTC_ClearFlag(RTC_IT_ALR); /* 清除中断标志位,包括外部中断线标志 */


              if(EXTI_GetITStatus(EXTI_Line17));


              {


                     EXTI_ClearITPendingBit(EXTI_Line17);


                     GPIO_WriteBit(GPIOB,GPIO_Pin_8,(BitAction)(0));


              }


       }


}


关键字:STM32F10x芯片  RTC  实时时钟 引用地址:STM32F10x芯片RTC实时时钟

上一篇:STM32串口DMA超时接收方法,可大大节约CPU时间
下一篇:浅谈STM32F10X芯片SysTick系统时钟定时器

推荐阅读最新更新时间:2024-11-11 11:28

2440裸机篇之4 RTC实时时钟
//*************************************************************** //manymany-2440裸机篇之4 RTC实时时钟 //*************************************************************** //目的:掌握RTC实时时钟功能,每秒显示实时时钟 // 实现实时闹钟功能,掌握控制RTC各个寄存器 //*************************************************************** //功能:每秒显示实时时钟,能读取年,月,日,星期,时,分,秒 //
[单片机]
罗德与施瓦茨公司发布R&S RTC1000系列紧凑经济型示波器
全新R&S RTC1000系列示波器集成多功能与紧凑型设计于一身。丰富的功能满足教育市场、普通测试应用和电子爱好者的不同需要。 慕尼黑,2018年1月16日——罗德与施瓦茨公司发布全新R&S RTC1000系列示波器。紧凑的设计下除示波器功能外,还集成了八通道逻辑分析仪、四通道码型信号发生器、函数发生器、I2C/SPI/UART/RS232/CAN/LIN协议分析、数字电压表、元器件测试仪、频谱分析仪和频率计功能。九合一的设计使用户可以在占用工作台最小空间的情况下实现丰富的测试功能。 罗德与施瓦茨公司全球细分应用市场副总裁Joerg Fries先生表示:“我们的工程师致力于设计一款经济型示波器,同时保持高品质和高功能
[测试测量]
罗德与施瓦茨公司发布R&S <font color='red'>RTC</font>1000系列紧凑经济型示波器
S3C2440-RTC中断
RTC(Real Time Clock)单元能在系统断电时通过系统备用电池供电,RTC能通过ARM的STRB/LDRB指令传输8位BCD数据到CPU,该数据包括时,分,秒,小时,天,月和年,RTC使用一个外部32.768KHZ的晶体也能执行报警功能。 报警功能。在掉电模式或正常工作模式下,RTC能够在指定的时间产生报警信号。在正常工作模式下,报警中断(ALMINT)被激活。在掉电模式下,电源管理苏醒信号PMWKUP也与ALMINT一样处于激活状态。RTC的报警寄存器(RTCALM)可以决定报警的使能或禁止和报警时间的设置条件。 节拍中断。RTC节拍时间用于中断请求。TICNT寄存器具有一个中断使能位,同时其中的计数值用于中
[单片机]
S3C2440-<font color='red'>RTC</font>中断
使用STM32的systick定时器中断实现RTC工作过程出错
开发环境:keil MDK V5.10 操作系统:windows 7(32位) 目标硬件:STM32F103C8 问题描述:使用STM32的systick定时器实现RTC功能。具体方法为systick滴答计时器配置为1ms时间间隔的滴答中断,定义一个RTC结构体,包含年、月、日、时、分、秒。在每进一次systick中断服务程序中更新一次RTC的值。主程序通过不停地获取RTC的时钟,每一秒钟使用printf函数输出当前的时间。测试过程发现绝大多数时间系统正常工作,但依然存在部分情况系统无法进行正常的输出。相关代码和测试结果如下: /** * @brief 系统滴答定时器中断服务程序,主要功能为更新实时时钟 *
[单片机]
STM32L151C8周期性从待机模式唤醒(RTC Wakeup Timer)
#include stm32l1xx.h #include system_stm32l1xx.h #include OLED.h #include delay.h void RtcWakeUpConfig(void); u8 RtcInit(void); u8 RtcConfig(void); int main() { DelayInit(); //延时初始化 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //使能PWR时钟 if(PWR_GetFlagStatus(PWR_FLAG_SB)) //从待机模式唤醒 { PWR_Cle
[单片机]
STM32万年历时钟调试经验(时间精度问题,断电RTC不持续运行)
最初调试STM32的万年历,使用的是内部的 LSI晶振作为RTC晶振来源,发现有两个问题: 第一:由于LSI晶振频率大约在40KHZ附近,实际上会在30~60KHZ之间波动,导致计时不准,基本上一个小时会有1分钟左右的偏差。 第二: 由于LSI内部晶振,在断电的时候,并不在后备供电区域范围内,而外接的3.3V电池连接到VBAT上,只给后备供电区域供电,导致系统断电后,电池只能维持后备RTC的计数,并没有给LSI晶振供电(见下图所示:),导致RTC总是保持在断电之前的时间。虽然重新上电后又可以继续运行。但是需要重新校准了 。 最后使用了外界的32.768KHZ的外部LSE晶振作为RTC晶振来源,调试过程中发现,反复修改,问题
[单片机]
STM32万年历时钟调试经验(时间精度问题,断电<font color='red'>RTC</font>不持续运行)
49. RTC实验讲解
一。RTC实时时钟知识复习 1. 工作原理框图 RTC_CNT寄存器会在TR_CLK的控制下每个时钟周期加1,比如1970年,我们把RTC_CNT设置一个值为N,那么它每一秒加1,不停的加1,我们可以读取这个值,就可以确定我们当前的时间。 2. 配置RTC的步骤 二。RTC实验程序讲解 rtc.h #ifndef __RTC_H #define __RTC_H //Mini STM32开发板 //RTC实时时钟 驱动代码 //正点原子@ALIENTEK //2010/6/6 #include sys.h //时间结构体 typedef struct { vu8 hour; vu8 min; vu8
[单片机]
49. <font color='red'>RTC</font>实验讲解
浅谈STM32F10X芯片SysTick系统时钟定时器
1、介绍 实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。 系统时钟及系统定时器时钟(详见手册) 2、寄存器描述 SysTick控制及状态寄存器STK_CTRL SysTick重装载数值寄存器STK_LOAD SysTick当前数值寄存器STK_VAL SysTick校准数值寄存器STK_CALIB 与SysTick相关的固件库函数有以下几个: 配置SysTick系统时钟:SysTick_CLKSourceConf
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved