STM32F4 RTC

发布者:genius6最新更新时间:2016-12-19 来源: eefocus关键字:STM32F4  RTC 手机看文章 扫描二维码
随时随地手机看文章

F4的RTC与F1的RTC有很大的差别。F1系列的RTC就是一个简单的计数器,要想获得时间,得自己计算。F4的就不需要这么麻烦了,读出来的直接就是时间。

【主要特点】

STM32F4的RTC是一个独立的BCD/时钟计数器。RTC提供时间日历和两路闹钟中断,一个具有中断能力的周期可编程的环形标志。他哦南方是RTC还具有管理低功耗模式的唤醒单元。

RTC的秒、分、小时、日期、月、年以BCD码的形式存储在一个32位寄存器中。

每月的天数自动处理,同时还具有日间省电功能。可编程的闹钟信息存储在另一个寄存器中。

数字标定(校准)功能,可用于处理晶振的偏差

上电时,RTC寄存器被保护以防止误写入数据。

不论MCU处于那种工作模式,只要供电电压在可操作范围,RTC就不会停止。

【RTC时钟】

RTC时钟可以使用LSE、LSI和不大于1M的HSE作为时钟,对时钟分频可得到1HZ的时钟供RTC使用。

本实验DISCOVERY板子上没有LSE,外接晶振8M,也不能用。做RTC实验只能使用LSI时钟。

这个实验首先应使能LSI时钟。并将LSI时钟设置成RTC时钟。被操作是通过RCC设置的,在RTC部分没有配置这个的寄存器:

RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();

【RTC初始化】

上电时,RTC寄存器写保护。要打开写操作,需要向RTC_WPR寄存器中写一个序列。先写入0xCA,再写入0x53即可关闭写保护。写别的数据将关闭写保护,比如写入0x00等。

日历初始化和配置

按照以下步骤设置RTC的时间日期以及对时钟输入的预分频:

1、设置初始化和状态寄存器RTC_ISR中的INIT为为1进入初始化模式。在这个模式下,RTC时间寄存器计数停止,可被更新

2、判断RTC_ISR中的INITF位,判断RTC是否已经被初始化过。当读出数据为1时,即可进入初始化模式。这个过程将持续大约两个RTC时钟周期

3、为了得到1Hz的计数器时钟,先对RTC_PRER寄存器中的同步分频值PREDIV_S[14:0]进行设置再对该寄存器中的一部分频值PREDIV_A[6:0]进行设置。即使只有一个分频值需要写入,另一个分频值也需要再写入一遍。

4、将要设置的时间和日期写入RTC_CR和RTC_DR的影子寄存器,在RTC_CR中设置时间格式。

5、向INTI位写入0,退出初始化模式。这是,RTC_DR和RTC_CR就会将日期信息从影子寄存器中加载到寄存器中,并在4个RTC时钟周期后自动开始运行。

实现代码如下:

void RTC_Config(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  PWR_BackupAccessCmd(ENABLE);//使能备份寄存器操作
  
  RCC_LSICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForSynchro();
  
  if(RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x9527)   //一个变量,看看RTC初始化没
  {
    
    RTC_WriteProtectionCmd(DISABLE);
  
    RTC_EnterInitMode();
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
    RTC_InitStructure.RTC_AsynchPrediv = 0x7D-1;
    RTC_InitStructure.RTC_SynchPrediv = 0xFF-1;
    RTC_Init(&RTC_InitStructure);
  
    RTC_TimeStructure.RTC_Seconds = 0x00;
    RTC_TimeStructure.RTC_Minutes = 0x01;
    RTC_TimeStructure.RTC_Hours = 0x01;
    RTC_TimeStructure.RTC_H12 = RTC_H12_AM;
    RTC_SetTime(RTC_Format_BCD,&RTC_TimeStructure);
  
    RTC_DateStructure.RTC_Date = 30;
    RTC_DateStructure.RTC_Month = 5;
    RTC_DateStructure.RTC_WeekDay= RTC_Weekday_Thursday;
    RTC_DateStructure.RTC_Year = 12;
    RTC_SetDate(RTC_Format_BCD,&RTC_DateStructure);
  
    RTC_ExitInitMode();
    RTC_WriteBackupRegister(RTC_BKP_DR0,0X9527);
    RTC_WriteProtectionCmd(ENABLE);
    RTC_WriteBackupRegister(RTC_BKP_DR0,0x9527);  //初始化完成,设置标志
  }
  PWR_BackupAccessCmd(DISABLE);
}

编译运行,在主函数中使用RTC_GetTime读取时间。跟踪到这里可以看到时间在变化

以后只要每次用RTC_GetTime就可以读取时间了。

要设置时间,只需要用RTC_SetTime就行了,RTC_GetTime函数自己会打开写保护。


关键字:STM32F4  RTC 引用地址:STM32F4 RTC

上一篇:STM32F4 定时器TIM(1)定时器控制输出
下一篇:STM32F4 ADC1 模拟看门狗

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

STM32F4_RCC系统时钟配置及描述
Ⅰ、概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳。 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的晶振基本上都是官方标准的时钟频率,使用官方的标准库,这样系统时钟就是默认的配置,也就是默认的频率。但对于自己设计开发板,或者想要改变系统时钟频率(如:降低功耗就需要降频)的朋友来说,配置系统时钟就有必要了。 关于时钟这一块对定时器(TIM、RTC、WDG等)相关的外设也比较重要,因为要求精准,就需要时钟频率精准。 该文将描述关于系统时钟配置及注意的相关事项,更多详情内容,请往下看。 本着免费分享的原则,方便大家手机学习知识,定期在
[单片机]
<font color='red'>STM32F4</font>_RCC系统时钟配置及描述
stm32F4编码器测速并通过串口打印--- 程序源码
一、使用cubeMX软件对程序需要使用的端口和资源进行初始化。 为了保持程序的简洁性,这里仅使用一个串口和一路通用定时器。 (1)引脚的初始化 注:在引脚配置这里,是没有编码器模式的,不知道为什么。高级寄存器是由combined channels选项的。 这里先暂时选择为Input Capture direct mode,后面在针对具体的代码进行修改即可。 (2)时钟的配置 (3)串口资源的配置 (4)定时器的配置 (5)中断的配置 这里不适用串口来接收数据,所以串口的中断也不用打开。这里需要打开定时器的中断,在定时器发生上下计数溢出时,需要对进行记录,保证记录的准确性。 (6)最后生成的定时器初始化代码如下:
[单片机]
HAL库-STM32F4 HAL_GPIO_Init()
以下使用ST的HAL_GPIO_Init()函数举例。 在ST官方库中,我们可以找到对于某个GPIO初始化的函数 HAL_GPIO_Init() void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) { uint32_t position; uint32_t ioposition = 0x00; uint32_t iocurrent = 0x00; uint32_t temp = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)
[单片机]
STM32F411 Discovery学习笔记(二)点亮你的第一个LED
对于开发板来说,点亮第一个LED可能就像程序里的HELLO WORLD!一样重要吧。 由于缺少资源,点亮这个LED浪费了我两天的宝贵时光,也没能成功,后来想到了老师一直强调的要看芯片手册和原理图,想想LED应该也不难,那么从零应该也是可以的。 对于STM32来说最难的是配置底层文件了,然而STM32CUBEMX可以帮助我们完成这一项操作,关于STM32CUBEMX的使用方法网上有好多,然而我竟然在B站搜索到了视频教程!而且讲的也很好! 接下来要说的内容是对B站UP主的现学现卖和自己的一些补充。 首先你需要找到原理图和芯片手册 不说废话直接放连接 https://www.st.com/content/st_com/en/prod
[单片机]
<font color='red'>STM32F4</font>11 Discovery学习笔记(二)点亮你的第一个LED
STM32F429 >> 16. WWDG_窗口看门狗
窗口看门狗和独立看门狗最大的不同就是,独立看门狗的喂狗限制是在计数器递减为零前,而窗口看门狗的喂狗限制则是在一个窗口期内,即喂狗时间必须在一个时间段内,在狗饱腹时和饥饿时喂狗都会触发复位 这个窗口期的下限为0x40,上限小于或等于0x7F RLR 是重装载寄存器,用来设置独立看门狗的计数器的值。TR 是窗口看门狗的计数器的值,由用户独立设置,WR 是窗口看门狗的上窗口值,由用户独立设置。 WWDG 功能框图 ①. 窗口看门狗时钟 窗口看门狗时钟来自 PCLK1,PCLK1 最大是 45M,由 RCC 时钟控制器开启。 ②. 计数器时钟 计数器时钟由 CK 计时器时钟经过预分频器分频得到,分频系数由配置寄存器
[单片机]
<font color='red'>STM32F4</font>29 >> 16. WWDG_窗口看门狗
stm32f4的IWDG和WWDG(HAL库版本)
看门狗原理: 单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。 看门狗的作用:就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位信号) 。 独立看门狗和窗口看门狗的区别(F4版本): 1、相同点 都是为了防止CPU跑飞 2、独立看门狗 根据内部看门狗时钟频率,装载寄存器定一个时间值,比如是1000,那么独立看门狗就会按照时钟频率,从1000开始向下每隔一个时钟周期减1,如果在减到0之前,你用程序代码重新向向下计数器里面写1000(喂狗),那么定时器会重新从1000开始向下递减。如果在减到
[单片机]
<font color='red'>stm32f4</font>的IWDG和WWDG(HAL库版本)
STM32 RTC设置日期失败(重启后生效)的解决方法
调试STM32F429的RTC时钟时遇到了如下问题: RTC设置日期时会延迟一段时间(几秒)或重启后才生效。 分析过程: 1、分析发现原程序在RTC的WAKEUP中断里读取时间和日期,后关闭此中断,在while循环中轮询读取,再设置日期,发现可以立即生效。所以猜测在WAKEUP中断里读取日期会对日期设置产生影响。 2、重新打开WAKEUP中断,并删除其中的日期读取函数,发现可以正常设置日期。 解决方法: 1、使用WAKEUP中断读取时间,轮询读取日期。 2、不使用WAKEUP中断,轮询读取时间和日期。
[单片机]
测试STM32F4中断向量表移到内部RAM对中断响应速度的影响
测试环境:STM32F407 168MHz,IAR 7.4,优化级别low 测试方法:第一个信号是TIM比较器的输出,同时产生比较器中断。中断服务程序里第一句就立即拉高一个GPIO,示波器查两个信号的延迟大致了解中断响应速度。 中断向量表在Flash,中断服务程序在Flash,延迟约155ns: 中断向量表在内部RAM,中断服务程序在Flash,少了约20ns 中断向量表在内部RAM,中断服务程序在内部RAM,看起来没多大区别: 说明:这个测试方法中断响应延时并不准确,因为GPIO拉高至少要两条指令,还加上总线访问延迟和GPIO输出延时。不过也还是能得到自己想要的结果:中断发生到执行结果要多长时间。
[单片机]
测试<font color='red'>STM32F4</font>中断向量表移到内部RAM对中断响应速度的影响
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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