RTC,是RealTimeCounter的缩写。在MCU中,其实是一组连续计数的计数器,各个产品及系列各不相同。因此,在相应的软件配置下,可提供时钟日历的功能。当然,修改这个计数器的值也就重新设置了系统当前的时间和日期。
本文引用地址:http://www.eepw.com.cn/article/182407.htm
RTC只是一个时钟,但与RTC相连的有两个系统时钟,一个是APB1接口的PCLK1另一个是RTC时钟[注意1]。这样,RTC功能也就分为两个部分:第一部分,APB1接口部分,与APB1总线相连,MCU也就是通过这条总线对其进行读写操作。另一部,RTC核,由一系列可编程计数器组成,这部分又再细分为两个组件:预分频模块与32位可编程计数器。预分频模块用来产生最长为1秒的RTC时间基准,而32位的可编程的计数器可被初始化为当前的系统时间。
下图为RTC简化框图:
读RTC寄存器
从上面的工作原理可知,RTC核完全独立于RTCAPB1接口,软件通过APB1接口来访问RTC的各项参数,包括预分频值、计数器值等等,但是这些参数值只在RTC时钟的上升沿被更新,之后,RTC时钟会与RTCAPB1时钟进行重新同步。这里会有一些问题出现,就是在APB1接口刚刚被开启时,第一次的内部寄存器更新之前,那么此时从RTC寄存器中读出的第一个值可能被破坏了,例如下面所述的三种情况:
发生系统复位或电源复位
系统刚从待机模式唤醒
系统刚从停机模式唤醒
可以简单得出,在APB1接口被禁止时(复位,无时钟或断电)RTC核仍保持运行状态。因此,在禁止了RTC的APB1接口后,软件首先须等等RSF位被硬件置1.
RTC功能配置
1.查询RTOFF位,直到RTOFF的值变为“1”
2.置CNF值为1,进入配置模式
3.对一个或多个RTC寄存器进行写操作
4.清除CNF标志位,退出配置模式
5.查询RTOFF,直至RTOFF位变为“1”以确认写操作已经完成。
仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期。
注意1:RTC时钟必须小于PCLK1时钟的四分之一以上。
关键字:STM32 实时时钟 RTC
引用地址:
STM32再学习——实时时钟(RTC)
推荐阅读最新更新时间:2024-11-11 11:19
stm32数据存储
大端模式:数据高字节保存在内存低地址,数据低字节保存在内存高地址; 小端模式:数据高字节保存在内存高地址,数据低字节保存在内存低地址; stm32默认小端存储,如下图: volatile float f = -0.1; volatile float *p = volatile uint32_t i = 0xaabbccdd; volatile uint32_t *p2 = volatile int32_t i2 = -5; volatile int32_t *p3 = &i2; 变量名 地址 值 f 0x20000000 0xBDCCCCCD p 0x20000004 0x20000000 i
[单片机]
STM32笔记之九:打断它来为我办事,EXIT (外部I/O中断)应用
a) 目的:跟串口输入类似,不使用中断进行的IO输入效率也很低,而且可以通过EXTI插入按钮事件,本节联系EXTI中断。 b) 初始化函数定义: void EXTI_Configuration(void); //定义IO中断初始化函数 c) 初始化函数调用: EXTI_Configuration();//IO中断初始化函数调用简单应用: d) 初始化函数: void EXTI_Configuration(void) { EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义 EXTI_ClearITP
[单片机]
修改STM32库函数中的晶振值
STM32F407的库文件中默认晶振值为25MHz,若外接晶振8MHz,则需修改以下几个地方: 1)修改HSE_VALUE的值 将#define HSE_VALUE ((uint32_t)25) /*! Value of the External oscillator in Hz */ 修改为 #define HSE_VALUE ((uint32_t)8) /*! Value of the External oscillator in Hz */ 2)修改PLL_M的值 将#define PLL_M 25修改为 #define PLL_M 8 3)修改STM32F407工程的Options设置 在Option for t
[单片机]
STM32中断挂起和RTOS任务挂起的区别
中断挂起 可以理解为:将中断设置为就绪状态,一旦符合条件,立即执行中断并进入中断函数;比如A和B的抢占优先级相同,A的响应优先级高于B,那么当产生A和B中断的事件发生时,先执行A,并同时将B挂起,一旦A执行完毕,立即执行B。 RTOS的任务挂起 以FreeROTS为例,因为某些原因不能立即执行的任务,可以将其挂起,这个挂起使得任务暂时无法参与任务调度。只有将任务唤醒之后才能继续参与;
[单片机]
STM32 flash被锁定不能烧写解决方法
在误操作后会锁死芯片导致不能烧录,如下图: 解决办法是用STM32 ST-LINK Utility 工具去解锁芯片: 先连接设备然后在target选项下做如下操作解锁,选择unselecet all 然后应用即可:
[单片机]
STM32低功耗模式之待机模式
上周完成了一个小项目,项目涉及到stm32的低功耗的待机模式,特在此记录下32的待机模式。 芯片:STM32f030F4 库:HAL库 唤醒方式:用RTC和PA0的上升沿唤醒 先来看下低功耗模式下的情况(只看停止跟待机): 停止模式 停止模式在保留SRAM和寄存器内容的同时实现了非常低的功耗。 1.8V域中的所有时钟停止,PLL、HSI RC和禁用HSE晶体振荡器。电压调节器也可以安装在正常或低功率模式。 该设备可以被任何一条exti线路从停止模式唤醒。 exti行源可以是16个外部行和rtc之一。 待机模式 待机模式用于实现最低功耗。内部关闭电压调节器,使整个1.8V域断电。 这个
[单片机]
STM32_总中断关闭
STM32在使用时有时需要禁用全局中断,比如MCU在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。 ARM MDK中提供了如下两个接口来禁用和开启总中断: __disable_irq(); // 关闭总中断 __enable_irq(); // 开启总中断 但 测试 发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断
[单片机]
STM32之PVD电压检测
如果VDD或者VDDA电压高于或低于PVD设定阈值都产生中断,表现为每中断一次,LED1就亮变灭或者灭变亮。 /******************************************************************************** * @file PWR/PVD/main.c * @author MCD Application Team * @version V3.4.0 * @date 10/15/2010 * @brief Main program body. *********************************************
[单片机]