stm32专题三十三:RTC实时时钟

发布者:EnchantedMagic最新更新时间:2021-11-01 来源: eefocus关键字:stm32  RTC  实时时钟 手机看文章 扫描二维码
随时随地手机看文章

RTC功能描述


实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。


RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。


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


设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟;

设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问;

为什么时间不能超过1秒?


其实是对RTCCLK进行分频,比如RTCCLK为32768Hz,那最大可用的分频也就是(32767 + 1),此时计数频率 TR_CLK = 32768 / (32767 + 1)= 1Hz,计数时间为1秒。如果分频系数再增大,如设置为(49999 + 1),那么计数频率 TR_CLK = 32768 / ((49999 + 1)= 0.65536 Hz,这肯定出错。所以,TR_CLK最小为 1Hz,再小就成小数了。


RTC时钟源:

RTC结构框图

访问后备区域:

RTC寄存器的配置过程

RTC寄存器说明


中断配置:

控制寄存器:

RTC预分频寄存器 RTC_PRL

预分频余数寄存器 RTC_DIV

RTC 计数器寄存器 


RTC核有一个32位可编程的计数器,可通过两个16位的寄存器访问。计数器以预分频器产生的TR_CLK时间基准为参考进行计数。RTC_CNT寄存器用来存放计数器的计数值。他们受RTC_CR的位RTOFF写保护,仅当RTOFF值为’1’时,允许写操作。在高或低寄存器(RTC_CNTH或RTC_CNTL)上的写操作,能够直接装载到相应的可编程计数器,并且重新装载RTC预分频器。当进行读操作时,直接返回计数器内的计数值(系统时间)。

闹钟寄存器


Unix时间戳


Unix时间戳网站服务:

RTC库函数


RTC使用的标准库函数也很简单,直接看源代码:


1 等待时钟同步和操作完成:


/**

  * @brief  Waits until the RTC registers (RTC_CNT, RTC_ALR and RTC_PRL)

  *   are synchronized with RTC APB clock.

  * @note   This function must be called before any read operation after an APB reset

  *   or an APB clock stop.

  * @param  None

  * @retval None

  */

void RTC_WaitForSynchro(void)

{

  /* Clear RSF flag */

  RTC->CRL &= (uint16_t)~RTC_FLAG_RSF;

  /* Loop until RSF flag is set */

  while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)

  {

  }

}


2 等待上一次对RTC的操作完成:


/**

  * @brief  Waits until last write operation on RTC registers has finished.

  * @note   This function must be called before any write to RTC registers.

  * @param  None

  * @retval None

  */

void RTC_WaitForLastTask(void)

{

  /* Loop until RTOFF flag is set */

  while ((RTC->CRL & RTC_FLAG_RTOFF) == (uint16_t)RESET)

  {

  }

}

3 使能备份区域寄存器和RTC配置(在 PWR 里面)

/**

  * @brief  Enables or disables access to the RTC and backup registers.

  * @param  NewState: new state of the access to the RTC and backup registers.

  *   This parameter can be: ENABLE or DISABLE.

  * @retval None

  */

void PWR_BackupAccessCmd(FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  *(__IO uint32_t *) CR_DBP_BB = (uint32_t)NewState;

}

4 进入和退出RTC模式(主要被其他函数调用)


/**

  * @brief  Enters the RTC configuration mode.

  * @param  None

  * @retval None

  */

void RTC_EnterConfigMode(void)

{

  /* Set the CNF flag to enter in the Configuration Mode */

  RTC->CRL |= RTC_CRL_CNF;

}

 

/**

  * @brief  Exits from the RTC configuration mode.

  * @param  None

  * @retval None

  */

void RTC_ExitConfigMode(void)

{

  /* Reset the CNF flag to exit from the Configuration Mode */

  RTC->CRL &= (uint16_t)~((uint16_t)RTC_CRL_CNF); 

}

5 设置 RTC 时钟分频(直接把分频系数写入高16位和低16位)


/**

  * @brief  Sets the RTC prescaler value.

  * @param  PrescalerValue: RTC prescaler new value.

  * @retval None

  */

void RTC_SetPrescaler(uint32_t PrescalerValue)

{

  /* Check the parameters */

  assert_param(IS_RTC_PRESCALER(PrescalerValue));

  

  RTC_EnterConfigMode();

  /* Set RTC PRESCALER MSB word */

  RTC->PRLH = (PrescalerValue & PRLH_MSB_MASK) >> 16;

  /* Set RTC PRESCALER LSB word */

  RTC->PRLL = (PrescalerValue & RTC_LSB_MASK);

  RTC_ExitConfigMode();

}

6 设置、获取计数值和闹钟


/**

  * @brief  Sets the RTC counter value.

  * @param  CounterValue: RTC counter new value.

  * @retval None

  */

void RTC_SetCounter(uint32_t CounterValue)

  RTC_EnterConfigMode();

  /* Set RTC COUNTER MSB word */

  RTC->CNTH = CounterValue >> 16;

  /* Set RTC COUNTER LSB word */

  RTC->CNTL = (CounterValue & RTC_LSB_MASK);

  RTC_ExitConfigMode();

}

 

/**

  * @brief  Gets the RTC counter value.

  * @param  None

  * @retval RTC counter value.

  */

uint32_t RTC_GetCounter(void)

{

  uint16_t tmp = 0;

  tmp = RTC->CNTL;

  return (((uint32_t)RTC->CNTH << 16 ) | tmp) ;

}

 

/**

  * @brief  Sets the RTC alarm value.

  * @param  AlarmValue: RTC alarm new value.

  * @retval None

  */

void RTC_SetAlarm(uint32_t AlarmValue)

{  

  RTC_EnterConfigMode();

  /* Set the ALARM MSB word */

  RTC->ALRH = AlarmValue >> 16;

  /* Set the ALARM LSB word */

  RTC->ALRL = (AlarmValue & RTC_LSB_MASK);

  RTC_ExitConfigMode();

}

关键字:stm32  RTC  实时时钟 引用地址:stm32专题三十三:RTC实时时钟

上一篇:stm32专题三十二:stm32功耗模式
下一篇:stm32专题三十四:独立看门狗 IWDG

推荐阅读最新更新时间:2024-11-06 12:04

印刷机张力控制系统设计
简介:基于印刷行业张力控制原理,分析了张力控制系统组成,并介绍了以STM32为主控芯片及外围电路开发而成的闭环张力控制系统,该系统不仅控制精度高,响应速度快,而且操作简单,有合理的PID控制功能,适用于多种印刷材料。它还可以计算出材料筒的直径,使整个张力控制过程更为合理。 张力控制系统广泛应用于印刷等轻工业领域中,在收取和放卷材料时,为保证生产的质量及效率,保持恒定的张力是很重要的。在印刷过程中或者是印刷完成之后,最后的一道工序一般就是将加工物卷绕成筒状。在这一过程中,卷绕的好坏将是决定产品质量的关键,卷得太紧,容易使材料变形、拉断,卷得太松又容易使材料不紧凑,不利于搬运和运输,因而为了达到使卷绕紧凑,保证产品的质量,都要求在
[单片机]
印刷机张力控制系统设计
FreeRTOS-STM32操作系统
在单片机的Helloworld程序中(让LED实现闪烁)的过程中,常常用到了延时,在这个延时过程中CPU相当于什么事情都没干,当然这只是个实现电平翻转的简单任务。但是一旦任务增多后CPU的算力就大打折扣,因为在延迟的过程中,CPU这个“劳动者”在等待时间消息,几乎不再工作,这就需要一种方法去最大化“压榨”CPU的算力,使得CPU全时间满负荷运行。 嵌入式设备一般分为以下几种: 裸机系统、轮询系统、前后台系统、多任务系统 。轮询系统就是一个主程序中不断运行无限循环里边的程序内容;前后台系统就是在轮询系统中加入了中断,中断事件的处理是在中断函数进行处理的,中断是前台,主程序是后台;多任务系统是事件的中断处理在主函数,中断函数负责传
[单片机]
FreeRTOS-STM32操作系统
为什么学习STM32? 如何系统地入门学习stm32呢?
为什么学习STM32 在学习之前,不妨问一下自己这个问题,或许学起来能更加坚定,不至于轻易放弃。有目的性的去做事,更容易成功。 如何系统地入门学习stm32呢? 假如你用过51单片机,那么恭喜你,再学习STM32会容易很多。如果之前没接触过51,那也不用理会,直接学习STM32也行。 可以用STM32实现什么?为什么使用STM32而不是8051? 相对于STM32来说,51的频率太低、管脚太少、没有众多的外设IO、功耗太大、功能太弱、内存太小。 需要使用SPI、I2C、ADC、DMA,需要使用STM32某些功能,而51实现不了的时候, 那么就需要学习STM32在这些方面的使用方法。比如SPI协议、串口通信、RTOS等。 获
[单片机]
STM32的IO口配置
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 GPIO端口的每个位可以由软件分别配置成多种模式。 1、输入浮空 2、输入上拉 3、输入下拉 4、模拟输入 5、开漏输出 6、推挽式输出 7、推挽式复用功能 8、开漏复用功能 每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPI
[单片机]
基于stm32的数字示波器设计方案
0 引言 随着集成电路的发展和数字信号处理技术的采用,数字示波器已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。 本文通过采用高速高性能器件,设计了一实时采样率为60 msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏度、
[单片机]
基于<font color='red'>stm32</font>的数字示波器设计方案
STM32与上位机发送和接收数据
(1)首先要配置USART1相关的GPIO(PA9,PA10),和USART1的初始化参数配置 (2)然后在配置中断向量控制器 (3)写发送数据的函数 注释:main()函数在写入数据赋值时,单个的数据或字符的发送根据ASCII码表进行换算; http://www.96yx.com/tool/ASC2.htm(ASCII对照表)
[单片机]
<font color='red'>STM32</font>与上位机发送和接收数据
STM32的这些经典功能,你真的掌握了吗?
首先,在学习Cortex-M3时,我们必须要知道必要的缩略语。 创客学院整理如下: AMBA:先进单片机总线架构 ADK:AMBA设计c9200446619921FFCa4b252220c1fe2a AHB:先进高性能总线 AHB-AP:AHB访问端口 APB:先进外设总线ARMARM:ARM架构参考手册 ASIC:行业领域专用集成电路ATB :先进跟踪总线 BE8:字节不变式大端模式 CPI:每条指令的周期数 DAP:调试访问端口 DSP:数字信号处理(器) DWT:数据观察点及跟踪 ETM:嵌入式跟踪宏单元 FPB:闪存地址重载及断点 FSR:fault状态寄存器 HTM:Core Sight AHB跟踪宏单元 ICE:在线仿
[单片机]
<font color='red'>STM32</font>的这些经典功能,你真的掌握了吗?
STM32下uIP移植问题
就我个人认为在uIP的移植中除了驱动之处有以下几点需要注意: 1.uip_timer 时钟要加入到中断中去。 2.各种appcall实现。如在tcp_client_demo.c 有如下语句 if(uip_len 199) { ((u8*)uip_appdata) =0; } strcpy((char*)tcp_client_databuf,uip_appdata); 这样在处理数据长时都是以tcp_client_databuf 数组的长来处理,这样不灵活,client从网络中接收到的数据长本来就是用一个全局变量uip_len来存储的。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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