STM32 RTC时钟配置

发布者:悠闲之旅最新更新时间:2018-12-01 来源: eefocus关键字:STM32  RTC  时钟配置 手机看文章 扫描二维码
随时随地手机看文章

一、RTC使用说明

  

“RTC”是Real Time Clock 的简称,意为实时时钟。stm32提供了一个秒中断源和一个闹钟中断源,修改计数器的值可以重新设置系统当前的时间和日期。 

  RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。但实际上,RTC就只是一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。其在掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。 

  配置RTC前须知: 

  BKP:后备区域,通过BKP后备区域来存储RTC配置的数据可以让其在系统复位或待机模式下唤醒后,RTC里面配置的数据维持不变。 

  PWR:电源的寄存器,我们需要用到的是电源控制寄存器(PWR_CR),通过使能PWR_CR的DBP位来取消后备区域BKP的写保护。 

  RTC:由一组可编程计数器组成,分成两个模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC)TR_CLK 周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时,将产生一个闹钟中断。


下面讲解下配置整体过程: 

  第一步: 通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口的时钟 
  调用库函数: 
  RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE ); 

  第二步:电源控制寄存器(PWR_CR) 的 DBP 位来使能对后备寄存器和 RTC 的访问 
  调用库函数: 
  PWR_BackupAccessCmd(ENABLE ); 

  第三步:初始化复位 BKP 寄存器 
  调用库函数: 
  BKP_DeInit (); 

  第四步:设置 RTCCLK 
  我们需要将 RTCCLK 设置为 LSE OSC 这个 32.768KHZ 的晶振。 
  调用的库函数:   
  RCC_LSEConfig (RCC_LSE_ON); 
  While(!RCC_GetFlagStatus (RCC_FLAG_HSERDY));//设置后需要等待启动 

  第五步:将 RTC 输入时钟 选择为 LSE 时钟输入并使能 RTC,等待 RTC 和 APB 时钟同步 
  调用库函数: 
  RCC_RTCCLKConfig (RCC_RTCCLKSource_LSE);//选择 LSE 为 RTC 设备的时钟 
  RCC_RTCCLKCmd (ENABLE );//使能 
  RTC RTC_WaitForSynchro();//等待同步 

  第六步:配置 RTC 时钟参数。 
  1、查询 RTOFF 位,直到 RTOFF 的值变为’1’ 
  2、置 CNF 值为 1 ,进入配置模式 
  3、对一个或多个 RTC 寄存器进行写操作 
  4、清除 CNF 标志位,退出配置模式/ 
  5、查询 RTOFF,直至 RTOFF 位变为’1’ 以确认写操作已经完成。仅当 CNF 标志位被清除时,写操作才能进行,这个过程至少需要 3 个 RTCCLK 周期。 
   
按照上述步骤用库函数来配置: 
/* 1. 查询 RTOFF 位,直到 RTOFF 的值变为’1’ */ 
RTC_WaitForLastTask();//大家可以打开函数库看看这个函数内部的代码,就是查询 RTOFF的值 
/* 
2.置 CNF 值为 1 ,进入配置模式 
3.对一个或多个 RTC 寄存器进行写操作 
4.清除 CNF 标志位,退出配置模式 
*/ 
RTC_SetPrescaler(32767); // 这里配置了预分频值,大家可以打开函数库看看这个函数的内部的代码,里面就有包含了 2、3、4 讲述的操作。 
/* 
每完成一个操作一般都要查询 RTOFF 来判断是否 RTC 正在更新数据,如果是则等待它完成!!! 
*/ 
RTC_WaitForLastTask();//等待更新结束 
RTC_ITConfig(RTC_IT_SEC, ENABLE);//配置秒中断 
RTC_WaitForLastTask();//等待更新结束


二、RTC时钟配置代码


void RTC_Configuration(void){

    /* 使能PWR和BKP时钟 */

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);

    /* 使能对后备寄存器的访问 */ 

    PWR_BackupAccessCmd(ENABLE);

    /* 复位BKP寄存器 */ 

    BKP_DeInit();

    /* 使能LSE */ 

    RCC_LSEConfig(RCC_LSE_ON);

    /*等待启动完成 */

    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {}

    /* 将 RTC时钟设置为LSE这个32.768KHZ的晶振*/ 

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    /* 使能RTC Clock */ 

    RCC_RTCCLKCmd(ENABLE);

    /* 等待同步 */ 

    RTC_WaitForSynchro();

    /* 等待对RTC寄存器最后的写操作完成*/             

    RTC_WaitForLastTask();

    /* 配置了预分频值: 设置RTC时钟周期为1s */

    RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)*/

    /* 等待对RTC寄存器最后的写操作完成 */

    RTC_WaitForLastTask();

    /* 使能RTC秒中断 */ 

    RTC_ITConfig(RTC_IT_SEC, ENABLE);

    /* 等待对RTC寄存器最后的写操作完成 */         

    RTC_WaitForLastTask();

}


关键字:STM32  RTC  时钟配置 引用地址:STM32 RTC时钟配置

上一篇:STM32 SD卡通信整理
下一篇:STM32 中断优先级(Cortex-M3)

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

STM32_SPI多机通信的实现——整理自网络
用DMA的SPI双机通信中几个很容易出错的点: 1)分频值:SPI的频率最高为18M,SPI1是在频率为72M的APB2上,而SPI2是在频率为36M的APB1上。如果芯片时钟频率为72M,那么SPI1的分频值为4,SPI2的分频值为2. 2)开DMA顺序:我在网上看到有人说要先开从机发送、再开主机发送、再开从机接收、最后开主机接收。我不知道为什么要这么开,而且这种开DMA方式是很难实现的,你可能要再加两根握手线判断对方到底开好DMA没有。我的程序“从机接收-从机发送-主机接收-主机发送”的顺序一样可行。 3)DMA中断:当数据发送到最后一个字节的第一位时,如果你开了DMA发送中断,就会进入DMA发送中断函数,这时候不能马上清楚
[单片机]
STM32中中断优先级理解
很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig()——配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和从优先级”这样翻译其实是不对的,很容易让人误解。为了便于大家理解,有必要先解释两个概念: 抢占式优先级/响应优先级: STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在
[单片机]
STM32的IO口的8种配置详解
1 STM32 的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出) ① 浮空输入_IN_FLOATING ② 带上拉输入_IPU ③ 带下拉输入_IPD ④ 模拟输入_AIN ⑤ 开漏输出_OUT_OD ⑥ 推挽输出_OUT_PP ⑦ 复用功能的推挽输出_AF_PP ⑧ 复用功能的开漏输出_AF_OD 1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路
[单片机]
STM32技术文档里面的I / O Level FT具体含义
five volt tolerant 意思的兼容5V信号电压。按照技术手册上讲的话 容忍最高电压是VDD+4.0 = 3.3+4.0=7.3V
[单片机]
<font color='red'>STM32</font>技术文档里面的I / O Level FT具体含义
[初级知识]s3c2416x时钟配置详细步骤
简介 先列出几个要用到的寄存器: LOCKCON0 LOCKCON1 OSCSET MPLLCON EPLLCON EPLLCON_K 这6个寄存器控制着2个内部的PLL锁相环,一个外部的晶体振荡器。这两个独立的PLL锁相环的输出值分别由MPLLCON和EPLLCON的设置值来决定。锁相环的稳定输出时间由LOCKCON0和LOCKCON1决定。晶体振荡器的稳定时间由OSCSET决定。 通常情况下,锁相环再被打开后,回向系统各个模块提供输出,但在稳定输出前,会有一些小抖动输出,为了过滤这些抖动输出,就需要在PLL被打开后,延迟一段时间再对各模块输出时钟,这里用到的延时值设置寄存器就是LOCKCON0和LOCKCON1,这两个
[单片机]
[初级知识]s3c2416x<font color='red'>时钟</font><font color='red'>配置</font>详细步骤
stm32串口7位数据位
STM32系列单片机控制寄存器只支持8、9位数据位。如: 控制寄存器 1(USART_CR1) 位12 M: 字长 该位定义了数据字的长度,由软件对其置位和清零操作 0:1起始位,8数据位,n停止位 1:1起始位,9数据位,n停止位 然而STM32串口通信中也可使用7位数据位,如何设置? 设置7位数据位重点在于校验控制,也即是奇偶控制,发送时生成一个奇偶位,接收时进行奇偶校验,可通过设置USART_CR1寄存器上的PCE位而激活。根据M位定义的帧长度,可设置: 0:1起始位,7数据位,奇偶校验位,n停止位 以上是stm32单片机串口7位数据位的设置方法,希望对用户有所帮助。
[单片机]
STM32小白入门(第16天)-------红外
一、定义 远程遥控技术又称为遥控技术,是指实现对被控目标的遥远控制,在工业控制、航空航天、家电领域应用广泛。 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。 随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。其具有体积小、抗干扰能力强、功耗低、成本低等特点,在工业设备中也得到广泛应用。一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如下图所示: 二、基本原理 红外遥控的发射电路是采用红外发光
[单片机]
<font color='red'>STM32</font>小白入门(第16天)-------红外
STM32 高级定时器-PWM简单使用
高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有 死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(
[单片机]
<font color='red'>STM32</font> 高级定时器-PWM简单使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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