历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2020年10月19日 | STM32F10x芯片RTC实时时钟

2020-10-19 来源:eefocus

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));


              }


       }


}


推荐阅读

史海拾趣

CyOptics Inc公司的发展小趣事

2013年4月,Avago宣布以约4亿美元的价格收购CyOptics Inc。这一收购标志着CyOptics的技术实力和市场地位得到了业界的进一步认可。Avago看中了CyOptics在InP光学芯片及组件领域的领先地位,希望借此增强其在新兴40G和100G企业及数据中心应用市场中的竞争力。收购完成后,CyOptics成为了Avago旗下光器件品牌,继续为市场提供高质量的光学产品。

Degson Electronics Co Ltd公司的发展小趣事

为了进一步扩大市场份额,Degson开始实施国际化战略,并积极开拓全球市场。公司参加了多个国际电子展会,与全球客户建立了广泛的联系。同时,Degson还在海外设立了多个办事处和生产基地,以便更好地服务当地客户。这些举措使Degson的产品逐渐进入了美国、德国、英国、日本等90多个国家和地区的市场,实现了全球市场的布局。

ENOCEAN公司的发展小趣事

2010年,EnOcean公司成功成为国际标准组织ISO/IEC的成员。这一里程碑事件标志着EnOcean的技术和产品在全球范围内得到了广泛认可。通过参与制定无线传感网络的国际标准,EnOcean进一步巩固了其在行业内的领先地位,为推广其无线无源传输技术奠定了坚实基础。

南晶电子(DGNJDZ)公司的发展小趣事

在发展过程中,南晶电子始终秉持合作共赢的理念。公司与上下游企业建立了紧密的合作关系,共同推动产业链的发展。同时,南晶电子还积极参与社会公益事业,为社会进步和发展贡献自己的力量。通过与各方的共同努力,南晶电子在电子行业树立了良好的企业形象和口碑。

HTC Korea(TAEJIN Technology )公司的发展小趣事

在HTC的发展历程中,与微软的合作无疑是重要的一环。早在2002年,微软联合HTC推出了全球第一台搭载Windows mobile的Pocket PC,这一操作系统成为了日后WP 8的前身。得益于微软的信任和支持,HTC能够率先搭载最新的Windows mobile系统,从而成为Windows手机的顶级生产商。这种紧密的合作关系不仅提升了HTC的品牌影响力,还为其带来了大量的市场份额和利润。

Eureka Microelectronics Inc公司的发展小趣事

Eureka公司自1995年成立以来,一直致力于电子技术的研发和创新。在早期阶段,公司凭借一款具有创新性的液晶显示驱动IC产品,成功打入市场。随着技术的不断进步,Eureka逐步拓展了产品线,推出了包括类比-数位混合信号处理器、系统应用完整方案等一系列产品。这些产品的推出,不仅丰富了Eureka的产品线,也提升了公司在行业内的竞争力。

问答坊 | AI 解惑

精确控制DDS输出信号幅度的一种新方法

DDS技术作为一种先进的直接数字频率合成技术,用数字控制的方法从一个频率基准源产生多种频率,具有高可靠性、高集成度、高频率分辨率及频率变化快、控制灵活等特点,在通信与仪表领域得到了广泛的应用。采用DDS芯片制作的信号源,输出信号的频率和 ...…

查看全部问答>

PXA270 BVDMAIN的BSP问题!

这个BVDMAIN的BSP好像是4.2下面移植过来的吧,我在使用的时候遇到很多问题。 USB鼠标,部分能够支持,绝大部分不能使用。 SD卡,经常不能识别 请问有人遇到过这样的问题吗? 帮忙解决一下啊,谢谢…

查看全部问答>

单片机读写U盘,USBHOST代码

由于无法上传附件,所以请有需要此代码的朋友加我的 QQ1023003927 …

查看全部问答>

如何从makefile创建工程文件,比如wpj工程?

我们经常会从工程文件创建makefile文件,但也会遇到这样的需求,得到的第三方源代码(正版)只有makefile文件,而没有对应平台的工程文件。 这里有几种情况: 第一:单个工程的转换,可以找一个现成的wpj文件,对照着去修改,试试也就差不多了。 ...…

查看全部问答>

sdk:按钮自绘

自己createwindow一个按钮,指定了BS_OWNERDRAW属性,为什么wm_drawitem却不响应?…

查看全部问答>

求助. VS 2005 和 WINCE 怎么也连接不上..

我是一个新手, 按照这个文章配置 的 , 但是 只成功了一次,  以后就一直说 Active Sync 没有安装, 但是这个文章的说法是不使用  Active Sync 的., 不知道是不是有什么关键或者比较怪的地方,我没有注意到, 请各位大虾赐教. http ...…

查看全部问答>

大家看一看我这段VB代码,是在WINCC里用的。为什么在LISTVIEW里不显示结果呢。大家帮帮我!

Dim aa,bb,n,cc Dim s,oItem Dim i,j,ListView1 Set s=HMIRuntime.Tags(\"MyTag\") aa=Split(s.Read,\",\",-1) Set ListView1=ScreenItems(\"ListTable\") \'用记录集填充标准 listview 对象 listview1.listitems.clear ListView1.ColumnHe ...…

查看全部问答>

iPod (iPone)视频输出方案

iPod (iPone)视频输出方案 a: 支持的iPod    3G iPod, iPod mini, iPod phote, iPod video, iPod 2G nano, iPod 3G nano, iPod touch, iPod classic, iPhone b: iPod 接口方式:    iPod 30pin dock c: 支持的apple 证书   ...…

查看全部问答>

请教版主,STM8L152R6SWIM与BEEP共用

                                 请教版主,STM8L152R6 SWIM与BEEP共用,使用BEEP功能后调试会不会不方便?还有,LCD SEG脚位不连续使用可以不?因 ...…

查看全部问答>

Jorjin Technology的DM3730评估板的原理图

Jorjin Technology的DM3730评估板的原理图,中国台湾Jorjin公司的DM3730评估板的原理图,类似与beagleboard…

查看全部问答>