当前位置: 首页 > news >正文

STM32 RTC实时时钟 F407 寄存器

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;      
    }
}

相关文章:

STM32 RTC实时时钟 F407 寄存器

RTC介绍 STM32F1: RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。 即在F1系列&#xff0c;RTC的日历部分只有一个32位的寄存器 该寄存器直接存放 时间戳 的值&#xff0c;即&#xff1…...

矩阵等价、向量组等价、线性方程组同解与公共解的关系

矩阵等价 矩阵 A 、 B 等价 ⇔ 两矩阵秩相等 R ( A ) R ( B ) ⇔ 每个矩阵的行秩等于列秩&#xff0c;两个矩阵的行秩与列秩分别相等 ⇔ 若行满秩则列向量组等价 ⇔ 若列满秩则行向量组等价 \begin{align} 矩阵A、B等价\\ &\Leftrightarrow 两矩阵秩相等R(A)R(B)\\ &\…...

[Linux] Linux 进程程序替换

标题&#xff1a;[Linux] Linux 进程程序替换 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 O、前言 一、进程程序替换的直观现象&#xff08;什么是进程程序替换&#xff1f;&#xff09; 二、进程程序替换的原理 三、进程程序替换的函数&#xff08…...

【Linux系统编程】第三十一弹---深入理解静态库:从零开始制作与高效使用的完全指南

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、静态库 1.1、怎么做静态库 1.2、怎么使用静态库 1、静态库 1.1、怎么做静态库 在Linux环境下&#xff0c;通常使用GCC&am…...

FFmpeg 简介及其下载安装步骤

目录 一、FFmpeg 简介 二、FFmpeg 安装步骤 2.1 打开官网 2.2 选择FFmpeg系统版本 2.3 下载FFmpeg压缩包 2.4 将下载好的压缩包进行解压 2.5 设置环境变量 2.5.1 在搜索栏中搜索【环境变量】&#xff0c;然后单击将其打开 2.5.2 找到系统变量中的【Path】&#xff0c;点…...

使用CSS+SVG实现加载动画

使用CSSSVG实现加载动画 效果展示 CSS知识点 SVG元素使用SVG相关CSS属性运用 整体页面布局 <section><div class"box"><div class"loader"><svg><circle cx"40" cy"40" r"40"></circl…...

物联网(IoT)的未来发展:智能互联时代的到来

物联网&#xff08;IoT&#xff09;的未来发展&#xff1a;智能互联时代的到来 物联网&#xff08;IoT&#xff09;正在迅速改变我们与世界互动的方式。无论是智能家居、智慧城市&#xff0c;还是工业自动化&#xff0c;物联网技术通过设备互联、数据采集和智能控制&#xff0…...

斯坦福 CS229 I 机器学习 I 构建大型语言模型 (LLMs)

1. Pretraining -> GPT3 1.1. Task & loss 1.1.1. 训练 LLMs 时的关键点 对于 LLMs 的训练来说&#xff0c;Architecture&#xff08;架构&#xff09;、Training algorithm/loss&#xff08;训练算法/损失函数&#xff09;、Data&#xff08;数据&#xff09;、Evalu…...

Java->排序

目录 一、排序 1.概念 2.常见的排序算法 二、常见排序算法的实现 1.插入排序 1.1直接插入排序 1.2希尔排序(缩小增量法) 1.3直接插入排序和希尔排序的耗时比较 2.选择排序 2.1直接选择排序 2.2堆排序 2.3直接选择排序与堆排序的耗时比较 3.交换排序 3.1冒泡排序…...

linux 大小写转换

var"TM_card_INFo" # 把变量中的第一个字符换成大写 echo ${var^} # 把变量中的所有小写字母&#xff0c;全部替换为大写 echo ${var^^} # 把变量中的第一个字符换成小写 echo ${var,} # 把变量中的所有大写字母&#xff0c;全部替换为小写 echo ${var,,} 参考…...

Linux——传输层协议

目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…...

centos系列,yum部署jenkins2.479.1,2024年长期支持版本

centos系列&#xff0c;yum部署jenkins2.479.1&#xff0c;2024年长期支持版本 0、介绍 注意&#xff1a;jenkins建议安装LTS长期支持版本&#xff0c;而不是安装每周更新版本&#xff0c;jenkins安装指定版本 openjdk官网下载 Index of /jenkins/redhat-stable/ | 清华大学开…...

正则表达式-“三剑客”(grep、sed、awk)

1.3正则表达式 正则表达式描述了一种字符串匹配的模式&#xff0c;可以用来检查一个串是否含有某种子串&#xff0c;将匹配的子串替换或者从某个串中取出符号某个条件的子串等&#xff0c;在linux中代表自定义的模式模版&#xff0c;linux工具可以用正则表达式过滤文本。Linux…...

数智时代的新航向:The Open Group 2024生态系统架构·可持续发展年度大会邀您共筑AI数字新时代

在全球可持续发展和数字化转型双重驱动下&#xff0c;企业正面临着前所未有的挑战与机遇。如何在激烈的市场竞争中&#xff0c;实现业务增长的同时&#xff0c;履行社会责任&#xff0c;达成可持续发展的目标&#xff1f;The Open Group 2024生态系统架构可持续发展年度大会将于…...

TensorFlow 的核心概念

TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google 开发和维护。它提供了一个强大的工具集&#xff0c;用于构建和训练各种机器学习模型。 TensorFlow 的核心概念是计算图&#xff08;Computational Graph&#xff09;。计算图由节点&#xff08;Nodes&#xff09;和…...

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;动态新增、修改等操作&#xff09; 前言数据库脚本创建需要被调度的方法创建相关实体类创建业务层接口创建业务层实现类控制层类测试结果 前言 我这边的SpringBoot的版本为2…...

Matlab详细学习教程 MATLAB使用教程与知识点总结

Matlab语言教程 章节目录 一、Matlab简介与基础操作 二、变量与数据类型 三、矩阵与数组操作 四、基本数学运算与函数 五、图形绘制与数据可视化 六、控制流与逻辑运算 七、脚本与函数编写 八、数据导入与导出 九、Matlab应用实例分析 一、Matlab简介与基础操作 重点内容知识…...

【ELKB】Kibana使用

搭建好ELKB后访问地址&#xff1a;http://localhost:5601 输入账号密码登录以后 左侧导航有home、Analysis、Enterprise search 、Observability、Security、Management home&#xff1a;首页Analysis&#xff1a;工具来分析及可视化数据Enterprise search&#xff1a;企业级搜…...

ChatGPT免费使用:人工智能在现代社会中的作用

随着人工智能技术的不断发展&#xff0c;越来越多的应用程序和工具开始使用GPT作为其语言模型。但是&#xff0c;这些应用程序和工具是否收费&#xff1f;如果是免费的&#xff0c;那么他们是如何盈利的&#xff1f;在本文中&#xff0c;我们将探讨ChatGPT免费使用的背后原理&a…...

腾讯音乐:从 Elasticsearch 到 Apache Doris 内容库升级,统一搜索分析引擎,成本直降 80%

导读&#xff1a; 为满足更严苛数据分析的需求&#xff0c;腾讯音乐借助 Apache Doris 替代了 Elasticsearch 集群&#xff0c;统一了内容库数据平台的内容搜索和分析引擎。并基于 Doris 倒排索引和全文检索的能力&#xff0c;支持了复杂的自定义标签计算&#xff0c;实现秒级查…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考

目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候&#xff0c;显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则&#xff0c;它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则&#xff1f; 这个原则的核心思想是&#xff1a; “告诉一个对象该做什么&#xff0c;而不是询问一个对象的状态再对它作出决策。…...