STM32F10x芯片RTC实时时钟

发布者:跳跃龙珠最新更新时间:2016-08-03 来源: eefocus关键字:STM32F10x芯片  RTC  实时时钟 手机看文章 扫描二维码
随时随地手机看文章

1、介绍

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

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

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

2、RTC注意事项

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

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

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

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

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

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

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

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

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

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

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

 

图1 简化的RTC框图(详见手册)

 

3、RTC寄存器描述

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

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

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

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

l         RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)

与RTC相关的寄存器有:

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

l         电源控制寄存器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配置:

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

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

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

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

n         每次调用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实时时钟

上一篇:ARM映像文件及其地址映射
下一篇:浅谈STM32F10X芯片SysTick系统时钟定时器

推荐阅读最新更新时间:2024-03-16 15:03

STM32之RTC原理
一、RTC时钟框图分析(重要) 先熟悉一下几个知识点: 1、STM32的实时时钟(RTC)是一个独立的定时器! 2、RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位火从待机模式唤醒后RTC的设置和时间维持不变。 RTC这章中,对RTC相关的寄存器的操作特别重要,我在这里不解释了,请查阅手册。。 先上图! RTC时钟框图 RTC时钟框图分为完全独立的两个部分:1、APB1接口部分(用来RTC相关的寄存器);2、RTC核心; 第一部分:APB1接口。注意:这里涉及到寄存器RTC_CRL中的RSF位,这位是寄存器的同步标志,具体内容去看STM32参考手册RTC
[单片机]
STM32之<font color='red'>RTC</font>原理
51单片机汇编DS1302实时时钟课程设计
实时时钟课题要求: 实时时钟系统设计 1、用 1 个拨动开关设定“工作状态”和“设置状态”; 2、“设置状态”下,用 4 个独立按键实现时间设置:“+”“-”、“移位”、“确认”, 对年(2 位)、月、日、时、分、秒进行每 1 位的数值设置; 3、采用 DS1302 时钟芯片,采用 LCD 进行时钟显示 Proteus7.8仿真效果如下: 汇编代码如下: /*******************************实时时钟实验(Zidone)*************************************************/ /***********LCD12864相关定义***************
[单片机]
51单片机汇编DS1302<font color='red'>实时时钟</font>课程设计
【蓝桥杯单片机组】实时时钟RTC(DS1302)
1、寄存器表 注意: (1)ds1302.h中提供的寄存器地址是写地址,读寄存器时需要将地址加一 (2) #define ds1302_control_addr 0x8Ee //写保护命令字单元地址 对应上图倒数第二行:BIT7 = 0(取消写保护)、BIT7 = 1(上写保护) (3)读一次寄存器后需要增加一条写指令(不知道为什么): curtime = Ds1302_Single_Byte_Read(read_addr ); Ds1302_Single_Byte_Write(0x00, 0x00); (4)在提供的ds1302.c中使用到的函数为: /*****************************
[单片机]
【蓝桥杯单片机组】<font color='red'>实时时钟</font><font color='red'>RTC</font>(DS1302)
ARM学习《十》—关于STM32的RTC调试
这两天一直在调试STM32的RTC部分,本来打算弄一个万年历的,但是现在看来是暂时实现不了了。为什么这样说,因为RTC对晶振的要求非常高,必须是6p负载电容的32768晶振,这种晶振很难买,而且还很贵。下面是摘自一位网友的话: 今天到电子市场找了一下,几乎都是12.5p负载电容的32768晶振,只有一家有少量,负载电容是6p,20ppm的晶振要价是12.5p晶振的5倍,而且从外观上也看不出来,也没有测试方法能测出负载电容是6p还是12.5p。卖晶振的老板在这行干了10几年,一说到6p的32768晶振就笑了。这个要求以前就有多个公司中过招,特别是DALLAS的片子,让一家公司吃尽了苦头,焊上的许多高精度12.5p晶振被迫全部换掉,订
[单片机]
【C51自学笔记】实时时钟芯片DS1302
简介: 芯片内部具有可编程日历时钟和31个字节的静态RAM,日历时钟可自动进行闰年补偿,计时准确,接口简单,使用方便,工作电压范围宽,功耗低,芯片自身还具有对备份电池进行涓流充电功能,可以有效地延长备份电池的使用寿命。 连接图:8051单片机与DS1302的一种接口电路 单片机与DS1302之间采用3线串行通信方式 RST为通信允许信号,RST=1允许通信,RST=0禁止通信。 IO为双向串行数据传送信号,SCLK为串行数据的位同步脉冲信号。 8051作为主机通过控制RST、SCLK和IO信号实现两芯片之间的数据传送。 DS1302芯片的X1和X2端外接32.768KHz的石英晶振 Vcc1和Vcc2是电源引脚,单电源
[单片机]
【C51自学笔记】<font color='red'>实时时钟</font><font color='red'>芯片</font>DS1302
mini2440裸机试炼之—RTC闹钟中断,节拍中断
环境搭建 硬件环境:J-link v8、mini2440、J-link转接板、串口转USB线 软件环境:windows7(32位)、开发板uboot(NandFlash)、J-link驱动(J-Link ARM V4.10i)、SecureCRT、ADS1.2 其中ADS里的AXD设置:加载JlinkRDI.dll+Options- Configure Interface...,在Session File一页中选择“Run Configuration Script”,将该name.txt文本文件作为一个脚本加进来,确定。 name.txt内容 Setmem 0x53000000 0x00000000 3
[单片机]
mini2440裸机试炼之—<font color='red'>RTC</font>闹钟中断,节拍中断
STM32 RTC(实时时钟) 32.768kHz晶振起振指南
STM32的RTC晶振经常出现不起振的问题,这已经是 业界共识 了。。。很多人在各种电子论坛上求助类似于 求高手指点!RTC晶振不起振怎么办 的问题,而其答案基本可以概括为 这次高手帮不了你了 更有阴谋论者提出让人啼笑皆非的解释 STM32的RTC晶振不起振是ST与晶振厂商串通后故意搞出来的,目的是提高某晶振厂商高端晶振的销量。。。 最近做的几块板子也用到了STM32的RTC,前后两版一共做了大概6片,幸运的是并未遇到晶振不起振的现象。而我采用的是3毛钱一个的普通晶振,并未选用传说中低负载高精度晶振。。。后来在另外一片实验性质的板子上首次遇到了晶振不起振的问题,而且做了2片都不起振,这才让我意识到这个问题的严重性。 从上述现
[单片机]
stm32f103 RTC周期性待机唤醒(一)
做一个低功耗的东西,搞了好几天,程序一直卡在一个地方(见下图),今天终于发现问题出在哪里了,对待机唤醒的问题做一个总结(只针对我遇到的问题,其他部分网上都有,基于stm32f103) 1、解决我遇到的问题 我的RTC初始化部分有个“保存在备份寄存器的RTC标志是否已经被配置过的判断”,如果已经配置过,则进入else部分,但是这个else部分没有“要使能电源时钟,使能备份时钟,取消后备区的写保护”这些配置语句,而待机唤醒后程序从主函数执行,会执行到else部分,因为没有那些配置语句,所以再次对闹钟赋值就会不成功,就会卡在那里。(那些配置语句在clock_ini函数里,有注释) 2、待机用不用加extiline17事件 如果把
[单片机]
stm32f103 <font color='red'>RTC</font>周期性待机唤醒(一)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved