STM32 RTC实时时钟 F407 寄存器

news2024/11/24 10:11:50

RTC介绍

STM32F1:
            RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。
            即在F1系列,RTC的日历部分只有一个32位的寄存器
            该寄存器直接存放 时间戳 的值,即:秒数值 
            想要获取其他时间,想要软件来实现。

STM32F4:
            RTC日历部分包含两个32位的寄存器,分为日期寄存器和时间寄存器
            可直接输出时分秒,星期、月、日、年
             让我们在软件编程时大大降低了难度。

以下是基于F4的RTC内容

RTC说明

                年月日时分秒,自动计算闰年,能区分每个月的天数

理解要点:
       Unix时间戳  从1970年开始每1s计1个数
       BKP备份域 相当于存储器有20个u32的寄存器,断电复位
       BCD     二进制十进数

 BCD:

       4位二进制表示1位十进制中的0~9

           十进制        BCD码

            19 ---------- 0x19

 备份域:

       RTC有20个u32的备份域寄存器RTC_BKPxR  即有80个字节空间

      备份域的作用:防止程序重新设置RTC日历时间    

RTC运行:

       RTC控制器及其备份域,只要有供电就可以一直运行

       供电是指有电源,而CPU复位不算掉电源

    当有主供电电路,RTC电源由主电路提供,节省备用电源(纽扣电池)

    当主供电电路断电,RTC在有备用电源的情况下,能够继续运行

RTC框图

RTC时钟源   

       RTC有3个时钟源选择 HSE LSE LSI
       主要选择LSE低速外部时钟
       HSE:为总线提供时钟,而且频率太高
       LSI:时钟频率不稳定

       LSE:外接32.768KHz,专门设计为RTC提供时钟

RTC内部有两个分频器:
                        一个异步分频器 默认128分频
                        一个同步分频器 默认256分频
                       刚好将LSE的32.768KHz 分频 为 1Hz
                        即 1s 计 1个数

RTC实时时钟

1.使能RTC控制器

  • 将电源控制寄存器(PWR->CR)的DBP位写1   

             //解除RTC控制器和备份寄存器的保护

            //配置这个寄存器之前,要使能电源控制器时钟 RCC->APB1 28位

  • 时钟源配置选择LSE低速外部时钟

2.RTC时钟源选择:

RCC 备份域控制寄存器RCC->BDCR

使能LSE时钟,并等待时钟就绪

RTCSEL[1:0]直接赋值选择LSE

不能先清零再配置此位,最后使能RTC时钟

3.解除RTC寄存器写保护:           

  • 往RTC_WPR寄存器 中写 0xca  再写 0x53

            //取消RTC所有寄存器的写保护

           //往RTC_WPR寄存器中随便写一个数据就会再次激活写保护 0xff

4.配置RTC:

        要想改变日历寄存器的时间的值或者分频值

        需要让日历进入初始化模式(日历停止工作)

        更改完以后,要想日历继续工作,需要退出初始化模式(自由模式)

5.进入初始化模式:

        RTC->ISR 寄存器的INIT位写1

        等待是否允许更新(改变)日历值位  INITF

            设置日期和时间寄存器 TD&DR

            退出初始化模式  RTC->ISR 寄存器的INIT位写0

         读取日历:

             获取 DR和TR的值

             需要用 两次 同步影子寄存器 来读取

             因为通过实验测试,一次读两个数据寄存器 数值有误

             同步步骤:先将同步标志位清零,确保为最新鲜的数据

             等待同步标志置1,读取数据寄存器

十进制转BCD码  return  ((dec / 10) << 4) | (dec % 10);

BCD码转十进制   return  (bcd  >> 4) * 10 + (bcd & 0x0f);

RTC闹钟

因此需要配置EXTI控制器的17号中断线

                  使能SYSCFG时钟

                  打开EXTI 17号线中断请求使能

                  EXTI 17 选择上升沿检测

           同样,配置NVIC控制器管理

           中断源:RTC_Alarm_IRQn

           中断服务函数:RTC_Alarm_IRQHandler

       清除中断标志位是 EXTI->PR & (1<<17)

       同时也要清除RTC->ISR & (1<<8)闹钟匹配位

       因为EXTI就是监控 该闹钟匹配位边沿跳变

RTC实时时钟初始化代码

/***************************************
*函数名            :rtc_init
*函数功能        :RTC初始化配置函数
*函数参数        :RTC_t time
*函数返回值    :无
*函数描述        :
****************************************/
void rtc_init(RTC_t time)
{
    /*解除RTC控制器和相关寄存器保护*/
    //电源控制器时钟使能
    RCC->APB1ENR |= (1<<28);
    //PWR->CR 的DBP位写1解除RTC控制器控制 
    PWR->CR |= (1<<8);
    
    /*RTC时钟源设置*/
    //开启LSE时钟
    RCC->BDCR |= (1<<0);
    //等待LSE时钟就绪
    while(!(RCC->BDCR & (1<<1)));
    //选择LSE作为RTC时钟源
    RCC->BDCR |= (1<<8);
    //使能RTC时钟
    RCC->BDCR |= (1<<15);
    
    //解除RTC寄存器写保护
    RTC->WPR = 0xca;
    RTC->WPR = 0x53;
    
    /*RTC相关寄存器配置*/
    //选择24小时/天格式
    RTC->CR &= ~(1<<6);
    //日历值取自影子寄存器
    RTC->CR &= ~(1<<5);
    
    //激活RTC寄存器写保护
    RTC->WPR = 0xff;
    
    /*设置初始时间*/
    if(RTC->BKP0R != 0xff)
    {
        rtc_set_time(time);
        RTC->BKP0R = 0xff;
    }
}

RTC闹钟初始化函数  及 中断服务函数

/***************************************
*函数名            :clockA_init
*函数功能        :闹钟A初始化函数
*函数参数        :RTC_t time
*函数返回值    :无
*函数描述        :
****************************************/
void clock_init(RTC_t time)
{
    u32 a_temp;
    
    //解除RTC寄存器写保护
    RTC->WPR = 0xca;
    RTC->WPR = 0x53;
    
    //禁止闹钟
    RTC->CR &= ~(3<<8);
    //闹钟A中断使能
    RTC->CR |= (1<<12);
    //等待允许更新闹钟
    while(!(RTC->ISR & (1<<0)) && !(RTC->ISR & (1<<1)));
    
    //获取日期BCD码
    a_temp = (in_dec_out_bcd(time.day)<<24)     |
                     (in_dec_out_bcd(time.hour)<<16)  |
                     (in_dec_out_bcd(time.min)<<8)        |
                 (in_dec_out_bcd(time.sec));
    
    //设置闹钟A寄存器
    RTC->ALRMAR = a_temp;
    
    /*EXTI控制器配置*/
    //打开SYSCFG时钟
    RCC->APB2ENR |= 1<<14;
    //打开中断请求使能
    EXTI->IMR |= (1<<17);
    //上升沿检测
    EXTI->RTSR |= (1<<17);
    
    /*NVIC*控制器配置*/
    //优先级分组        ----在主函数
    //计算优先级编码值
    u32 pri= NVIC_EncodePriority (5,2,2);
    //设置具体中断源
    NVIC_SetPriority(RTC_Alarm_IRQn, pri);
    //使能NVIC响应通道
    NVIC_EnableIRQ(RTC_Alarm_IRQn);
    
    //使能闹钟A
    RTC->CR |= (1<<8);
    
    //激活RTC寄存器写保护
    RTC->WPR = 0xff;
}


/**********************************************
*函数名            :RTC_Alarm_IRQHandler
*函数功能        :RTC闹钟中断服务函数
*函数参数        :无
*函数返回值    :无
*函数描述        :
***********************************************/
void RTC_Alarm_IRQHandler(void)
{
    ///判断是闹钟A信号
    if(EXTI->PR & (1<<17))                         
    {                                                                
        //清除标志位                                            
        EXTI->PR |= (1<<17);
        RTC->ISR &=  ~(1<<8);    
        //执行紧急事件
        LED1_ON;
        printf("延时后\r\n");
        LED2_ON;
        LED1_OFF;      
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2211067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 279. 完全平方数(经典必会)

LeetCode 279. 完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#x…

java中连接Mysql以及PreparedStatement如何防止sql注入

目录 JDBC 使用JDBC连接到MySQL 使用 Statement 使用 PreparedStatement Statement 和 PreparedStatement 区别 在 java 中如何连接到 MySQL 数据库&#xff0c;执行 SQL 查询&#xff0c;并处理查询结果&#xff1f; JDBC java 程序连接到 mysql&#xff0c;首先需要下…

Dev-C++萌新福利2

朝鲜球作品原创 1 符号认识&#xff1a; 1.1简单例题1 1.2简单例题22奇奇怪怪的符号 2.1简单例题3 2.2符号表 2.2.1符号表中特殊符号 2.3符号使用代码样例&#xff08;部分&#xff09; 萌新福利 作品成本6999元&#xff0…

OSError: [Errno 22] Invalid argument:无效的参数完美解决方法

&#x1f6a8; OSError: [Errno 22] Invalid argument&#xff1a;无效的参数完美解决方法 &#x1f4a1; &#x1f6a8; OSError: [Errno 22] Invalid argument&#xff1a;无效的参数完美解决方法 &#x1f4a1;摘要引言正文1. 什么是 OSError: [Errno 22] Invalid argument&…

牛客.数字游戏​编辑牛客.体操队形(暴力搜索)​​​​​​​牛客.二叉树最大路径和​编辑牛客.排序子序列

目录 牛客.数字游戏​编辑 牛客.体操队形(暴力搜索) 牛客.二叉树最大路径和​编辑 牛客.排序子序列 牛客.数字游戏 难度不大&#xff0c;但是要注意&#xff0c;他这个快速输入与输出 import java.util.*; import java.io.*; import java.util.StringTokenizer; // 注意类名…

架构设计笔记-15-面向服务架构设计理论与实践

目录 知识要点 案例分析 1.微服务架构 2.微服务 3.微服务架构 4.SOA与微服务 5.基于微服务架构的系统/传统单体式系统 论文 1.论微服务架构及其应用 知识要点 服务组件体系结构&#xff08;Service Component Architecture&#xff0c;SCA&#xff09;是面向服务体系…

IT基础监控运维:监控易的深度解析与应用

在数字化转型加速的今天&#xff0c;IT系统的稳定性和高效运维成为了企业业务连续性的关键保障。IT基础监控作为运维工作的基石&#xff0c;其重要性不言而喻。本文将以监控易产品为核心&#xff0c;深入探讨IT基础监控的功能、特点及范围&#xff0c;为运维团队提供实用的参考…

销售管理之线索管理

一、线索获取&#xff1a;销售增长与市场洞察的双引擎 销售增长的基石 线索&#xff1a;销售旅程的起点&#xff1a;在销售的宏伟蓝图中&#xff0c;高质量的线索无疑是构筑成功的基石。缺乏持续、优质的线索供应&#xff0c;任何销售团队都难以跨越销售目标的重重山峦。以软…

Apktool:解包重打包工具

ApKtool是一个apk编译工具&#xff0c;能够反编译apk文件。 解包 使用命令apktool d test.apk 会在同目录下生成一个同名的文件夹 重打包 使用命令apktool b test 会在test文件夹里生成一个dist目录&#xff0c;在dist目录里有打包好的test.apk

Top6 最好的 Android 数据恢复软件免费获取

虽然在智能手机上随身携带您最喜爱的音乐收藏或珍贵的录音很方便&#xff0c;但如果您的设备出现技术问题或您不小心删除了文件&#xff0c;文件也有可能丢失。 不管文件是如何删除或丢失的&#xff0c;丢失那些珍贵的音频文件的痛苦对每个人来说都是一样的。这就是我们创建本…

鸿蒙开发之ArkUI 界面篇 三十三 Builder(封装容器)

鸿蒙开发中遇到容器相同、容器下面的子组件相同&#xff0c;就是子组件的文字不同&#xff0c;背景颜色不同&#xff0c;文字颜色不同之类&#xff0c;就可以使用Builder来封装&#xff0c;语法格式如下&#xff1a; 例如下面的界面&#xff1a; Row4个ColumImageText来实现&am…

Java初阶测试编程题目

文章目录 1.大小写转换2.斐波那契数列2.1递归解决&#xff08;不推荐&#xff09;2.2递推公式&#xff08;非递归&#xff09; 3.删除公共字符3.1题目说明3.2第一种方法3.3第二种方法 4.字符串的加法4.1题目说明4.2题目核心方法4.3题目代码解析 Java初阶测试编程题目分析与总结…

C++第六讲:STL--vector的使用及模拟实现

C第六讲&#xff1a;STL--vector的使用及模拟实现 1.vector简介2.vector的常见接口介绍2.1constructor -- 构造2.2destructor -- 析构2.3begin、end2.3.1vector和string的区别、vector<string> 2.4rbegin、rend2.5cbegin、cend2.6crbegin、crend2.7size、max_size、resiz…

C++AVL树的介绍和实现

目录 1.AVL树的概念 2.AVL树的实现 2.1AVL树的结构 2.2AVL树的插入 2.2.1AVL树插入一个值的大概过程 2.2.2平衡因子的更新 2.2.3插入节点及更新平衡因子的代码实现(暂未实现旋转逻辑) 2.3旋转 2.3.1旋转的原则 2.3.2右单旋(处理parent->_bf -2 && cur-&g…

简易入门:使用Docke 部署一个tomcat服务

简易入门&#xff1a;使用Docke 部署一个tomcat服务 # 拉取 >docker pull tomcat:9.0# 后台运行容器&#xff0c;端口映射为8080. -p 宿主机端口:容器端口 >docker run -d --name tomcat-c-01 -p 8080:8080 tomcat:9.0# 查看容器id >docker ps CONTAINER ID IMAG…

Qt-系统线程安全(63)

目录 描述 使用 线程不安全 线程安全 释放锁问题 其他的锁 条件变量和信号量 描述 多线程程序太复杂了 在C/C 和 Linux中&#xff0c;我们为了保证线程安全&#xff0c;简单的方式就是加锁 为此 Qt 也封装了自己的一套锁管理 使用 线程不安全 我们先测验一下线程不安…

七、程序流程控制

一、三种执行顺序 执行顺序说明顺序结构自上而下的执行代码分支结构根据条件&#xff0c;选择对应代码执行循环结构控制某段代码重复执行 二、分支结构 1、if 分支 根据条件&#xff08;真或假&#xff09;来决定执行某段代码if 分支有三种形式 //第一种形式 if(条件表达式…

Qt学习(一)——win10系统下Qt安装(Qt5.15.2+QtCreator5.0.3+MSVC2019)

win10平台下&#xff0c;Qt Creator 5.0.3 软件About Qt Creator界面如下&#xff1a; 其基于Qt 5.15.2 MSVC2019&#xff0c;64bit,故在用Qt4 设计师自定义控件所设计的控件能够被Qt Creator加载到&#xff0c;就要安装相应版本的Qt和MSVC。此安装便可支持win10系统下的自定义…

Java项目实战II基于Java+Spring Boot+MySQL的足球青训俱乐部管理后台系统的设计与开发(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 足球作为世…

【hot100-java】排序链表

链表题。 使用归并排序法。 一图解决。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; thi…