STM32 RTC 实时时钟说明

目录

背景

RTC(实时时钟)和后备寄存器

32.768HZ 如何产生1S定时

RTC配置程序

第一次上电RTC配置

第1步、启用备用寄存器外设时钟和PWR外设时钟

第2步、使能RTC和备份寄存器访问

第3步、备份寄存器初始化

第4步、开启LSE

第5步、等待LSE启动后稳定状态

第6步、配置LSE为RTC时钟源

第7步、使能RTC时钟

第8步、设置RTC预分频

第9步、设置秒中断

第10步、秒中断函数封装


背景

通过本篇文章对常用的RTC时钟(实时时钟)进行说明. 以及了解如何通过程序来区分上电复位和管脚复位。

RTC(实时时钟)和后备寄存器

RTC 和后备寄存器通过一个开关供电,在 V DD 有效时该开关选择 V DD 供电,否则由 V BAT 引脚供电。后 备寄存器(10 16 位的寄存器 ) 可以用于在关闭 V DD 时,保存 20 个字节的用户应用数据。 RTC 和后备寄 存器不会被系统或电源复位源复位;当从待机模式唤醒时,也不会被复位。
实时时钟具有一组连续运行的计数器,可以通过适当的软件提供日历时钟功能,还具有闹钟中断和
阶段性中断功能。 RTC 的驱动时钟可以是一个使用外部晶体的 32.768kHz 的振荡器、内部低功耗 RC 振荡器或高速的外部时钟经128 分频。内部低功耗 RC 振荡器的典型频率为 40kHz 。为补偿天然晶体的偏差,可以通过输出一个512Hz的信号对RTC的时钟进行校准。RTC具有一个32位的可编程计数器, 使用比较寄存器可以进行长时间的测量。有一个20 位的预分频器用于时基时钟,默认情况下时钟为 32.768kHz时,它将产生一个 1 秒长的时间基准。

RTC晶振 (LSE:外部低速时钟):32.768KHZ

STM32单片机内部集成了一个40KHZ的RC振荡器,内部RC振荡器会会因为温度产生漂移,精度不够高,因此使用32.768HZ的LSE作为RTC的时钟源。RTC备用电池,在单片机主电源断开的时候,给RTC时钟供电,也可以用于保存备用存储器中的数据(计时器的时间值,以及用户临时存放的数据),备用寄存器 20字节保存用户数据

32.768HZ 如何产生1S定时信号

32.768KHZ的时钟晶振产生的振荡信号经过石英钟内部 分频器进行15次分频( 2的15次方就是32768)后得到1HZ秒信号,即秒针每秒钟走一下,石英钟内部分频器只能进行 15 次分频要是换成别的频率的晶振(比如说STM32中的内部RC振荡器40KHZ),15次分频后就不是1HZ的秒信号,时钟就不准了。32.768K=32768=2的15次方,数据转换比较方便、精确。
1970-01-01主要是因为这是Unix时间戳的起点。Unix时间戳是从1970年1月1日开始计算的秒数,被广泛用于计算机系统中以表示和记录时间.

RTC配置程序

RTC的配置有两种情况:
1)第一次上电
2)非第一次上电,且备用电池有电情况。

第一次上电RTC配置

void RTC_First_Config(void){ //首次启用RTC的设置RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);//启用PWR和BKP的时钟(from APB1)PWR_BackupAccessCmd(ENABLE);//后备域解锁BKP_DeInit();//备份寄存器模块复位RCC_LSEConfig(RCC_LSE_ON);//外部32.768KHZ晶振开启   while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//等待稳定    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//RTC时钟源配置成LSE(外部低速晶振32.768KHZ)    RCC_RTCCLKCmd(ENABLE);//RTC开启    RTC_WaitForSynchro();//开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器    RTC_WaitForLastTask();//读写寄存器前,要确定上一个操作已经结束RTC_SetPrescaler(32767);//设置RTC分频器,使RTC时钟为1Hz,RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)   RTC_WaitForLastTask();//等待寄存器写入完成	//当不使用RTC秒中断,可以屏蔽下面2条
//    RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能秒中断   
//    RTC_WaitForLastTask();//等待写入完成
}

第1步、启用备用寄存器外设时钟和PWR外设时钟

通过stm32的数据手册可以知道RTC需要是能APB1

RCC_APB1Periph_PWR 

主要用于控制电源管理单元(Power Control Unit,简称PWR)的时钟使能。

在STM32中,RCC(复位和时钟控制)模块负责管理微控制器的时钟树和外设的晶振、内部振荡器以及各种时钟源的分频和倍频。具体到RCC_APB1Periph_PWR ,它是APB1总线上的一个外设,用于控制电源管理单元(PWR)的时钟使能。通过使能或失能PWR的时钟,可以控制电源管理功能的工作状态,进而影响整个系统的功耗管理。

LSE作为RTC时钟源之后,即使VDD断电,仍然可以通过RTC纽扣电池(备用电池)使得RTC外设继续工作。因此要启用PWR外设的时钟!

RCC_APB1Periph_BKP

是和后备存储器相关

第2步、使能RTC和备份寄存器访问

后面需要对RTC进行分频设置和备份寄存器初始化!

第3步、备份寄存器初始化

第4步、开启LSE

第5步、等待LSE启动后稳定状态

第6步、配置LSE为RTC时钟源

stm32数据手册中的时钟树可以RTC的时钟源有三个

1)LSE

2)  LSI(40khz)

3)HSE的128分频

第7步、使能RTC时钟

第8步、设置RTC预分频

1)等待 RTC 寄存器(RTC_CNT, RTC_ALR and RTC_PRL)与 RTC 的 APB 时钟同步

2)等待上一次rtc寄存器写操作完成

3)设置预分频

4)等待rtc寄存器写完成

固件库函数具体实现(ST公司提供)

所以要特别注意实际上的预分频数为设置值+1

第9步、设置秒中断

第10步、秒中断函数封装

void RTC_IRQHandler(void){ //RTC时钟1秒触发中断函数(名称固定不可修改)if (RTC_GetITStatus(RTC_IT_SEC) != RESET){}RTC_ClearITPendingBit(RTC_IT_SEC); RTC_WaitForLastTask();
}

RTC配置程序(用于main函数调用)

void RTC_Config(void){ //实时时钟初始化//在BKP的后备寄存器1中,存了一个特殊字符0xA5A5//第一次上电或后备电源掉电后,该寄存器数据丢失,表明RTC数据丢失,需要重新配置if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5){//判断寄存数据是否丢失       RTC_First_Config();//重新配置RTC        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//配置完成后,向后备寄存器中写特殊字符0xA5A5}else{//若后备寄存器没有掉电,则无需重新配置RTC//这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET){//这是上电复位}else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET){//这是外部RST管脚复位}       RCC_ClearFlag();//清除RCC中复位标志//虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行//但是每次上电后,还是要使能RTCCLKRCC_RTCCLKCmd(ENABLE);//使能RTCCLK        RTC_WaitForSynchro();//等待RTC时钟与APB1时钟同步//当不使用RTC秒中断,可以屏蔽下面2条
//        RTC_ITConfig(RTC_IT_SEC, ENABLE);//使能秒中断        
//        RTC_WaitForLastTask();//等待操作完成}}

可用的部分是前面的10个,以为备份寄存器为20个字节。

RCC_FLAG_PORRST就是上电复位、RCC_FLAG_PINRST管脚复位

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android studio在gradle的build时kaptDebugKotlin这个task需要执行很久

只修改了一点java代码,kaptDebugKotlin这个任务却执行了3~5分钟。。。

机器学习(李宏毅)——self-Attention

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 二、大纲 何为self-Attention?原理剖析self-Attention VS CNN、RNN、GNN 三、何为self-Attenti…

【Java使用Geotools对shp文件进行读取,读取完成之后shp、dbf、shx文件总是被占用,无法删除,如何解决呢?】

Java使用Geotools对shp文件进行读取,读取完成之后shp、dbf、shx文件总是被占用,无法删除,如何解决呢? 问题描述原因分析与问题解决1.直接原因2.解决方案 问题描述 Java使用Geotools对shp文件进行读取,读取完成之后.sh…

lvs的DR模式

基于Linux的负载均衡集群软件 LVS 全称为Linux Virtual Server,是一款开源的四层(传输层)负载均衡软件 Nginx 支持四层和七层(应用层)负载均衡 HAProxy 和Nginx一样,也可同时支持四层和七层(应用层)负载均衡 基于Linux的高可用集群软件 Keepalived Keepalived是Linux…

基于进化式大语言模型的下一代漏洞挖掘范式:智能对抗与自适应攻防体系

摘要 本文提出了一种基于进化式大语言模型(Evolutionary LLM)的智能漏洞挖掘框架,突破了传统静态分析的局限,构建了具备对抗性思维的动态攻防体系。通过引入深度强化学习与多模态感知机制,实现了漏洞挖掘过程的自适应进化,在RCE、SQLi、XXE等关键漏洞类型的检测中达到97…

java项目之基于SSM会议管理系统的设计与实现源码(ssm+mysql)

项目简介 基于SSM会议管理系统的设计与实现实现了以下功能: 基于SSM会议管理系统的设计与实现的主要使用者分为:管理员登录后修改个人的密码。用户管理中,对公司内的用户进行管理,包括会议管理员和员工,管理部门信息…

Linux第106步_Linux内核RTC驱动实验

1、了解rtc_device结构体 1)、打开“include/linux/rtc.h” rtc_class_ops是需要用户根据所使用的RTC设备编写的,其结构体如下: struct rtc_class_ops { int (*ioctl)(struct device *, unsigned int, unsigned long);/*函数指针ioctl*/ int (*read_time)(struct device *,…

java项目之基于推荐算法的图书购物网站源码(ssm+mybatis+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的基于推荐算法的图书购物网站项目。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于推荐算法的…

【Antv G2 5.x】饼图添加点击事件,获取当前坐标数据

// 监听 tooltip:show 事件this.chart.on(tooltip:show, (event) => {this.currentShowTooltipName = event.data.items[0].name})// 监听绘图区plot的点击事件this.chart.on(interval:click, ev => {this.$emit(chartClick, this.currentShowTooltipName);})// 监听绘图…

称呼计算器:智能科技,简化您的计算生活

一款手机应用程序,安卓设备上使用。这款计算器应用以其简洁的界面、实用的功能和良好的用户体验而受到用户的喜爱。 计算器的主要特点包括: 基本计算功能:支持加、减、乘、除等基本运算。 科学计算器模式:提供更高级的数学运算功…

STM32 裸机 C编程 vs micropython编程 vs linux python

以led点亮为例。 STM32 裸机 C编程需要设置时钟,管脚。 static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0};// GPIO端口时钟使能__HAL_RCC_GPIOA_CLK_ENABLE();// 配置PA5为推挽输出模式GPIO_InitStruct.Pin GPIO_PIN_5;GPIO_InitStruct.M…

Spring boot(maven) - Mybatis 超级入门版

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

清华大学新闻与传播学院沈阳团队出品的《DeepSeek:从入门到精通》104页PDF

前言 本机运行DeepSeek R1大模型文章如下: Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)【保姆级万字教程】在Windows计算机部署DeepSeek大模型,给在实验室无外网的同事们用(基于Ollama和OpenWebUI…

kbengine服务器和 数据库 系统路径配置

一、服务器 系统路径配置 二、mysql5.7.44 系统路径配置 mysql 压缩包安装方式 解压压缩包,将解压路径加入 系统环境。 或者 系统变量新增 变量名:MYSQL_HOME 变量值:C:\MyPrograms\mysql-8.0.12-winx64修改系统变量的 path 变量&#xff…

性格测评小程序04题库管理

目录 1 创建数据源1.1 题库表1.2 选项表 2 搭建管理后台2.1 搭建题库功能2.2 搭建选项功能2.3 题库和选项联动 3 最终效果总结 我们现在性格测评的算法是通过40个题目来测评用户属于哪一个分类,为此后台需要有可以设置题目和选项的功能,本篇我们介绍一下…

Navicat导入海量Excel数据到数据库(简易介绍)

目录 前言正文 前言 此处主要作为科普帖进行记录 原先Java处理海量数据的导入时,由于接口超时,数据处理不过来,后续转为Navicat Navicat 是一款功能强大的数据库管理工具,支持多种数据库系统(如 MySQL、PostgreSQL、…

sql难点

一、 假设你有一个查询&#xff0c;需要根据 id 是否为 null 来动态生成 SQL 条件&#xff1a; xml复制 <select id"getResources" resultType"Resource">SELECT * FROM resources<where><if test"id ! null">and id <!…

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(六级)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1.下面代码的输出结果正确的是?(B) import json json_str [ "Alice", "girl", 17,"New York"] data json.loa…

Qwen2.5-Max:国内新一代 MoE 大模型的崛起!

通义千问 DeepSeek 才火没多久&#xff0c;国内又出现了一款可以比肩 DeepSeek 的 MoE 大模型——Qwen2.5-Max。这款大模型使用了超过 20 万亿 token 的预训练数据及精心设计的后训练方案进行训练&#xff0c;无疑开启了 AI 的新时代。 Qwen2.5-Max Qwen2.5-Max Qwen&#xff0…

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好二、设置Ollama环境变量三、验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话介绍 Deepseek1.5b能够运行在只用cpu和gpu内存小…