基于stm32的RTC实时时钟 (HAL)

news2024/11/13 13:45:07

一:stm32的RTC功能概述 (基于stm32f10x)

        1:绪论

        实时时钟是一个独立的计时器,RTC提供一套持续运行的计数器,这些计数器可以配合适合的软件用来提供一个时钟日历功能。计数器的值可以被写入以设置系统当前时间/日期

        2:主要特性
   

        可编程的余分频器:分频因子可以高达220

                用于长期测量的32位可编程的计数器

        2个独立的时钟:PCLK1时钟(用于APB1接口)和RTC时钟(必须比PCLK1时钟慢至少4倍)

        两个单独的复位类型:

                APB1由系统复位复位

               RTC内核(分频器、警告、计数器、除法器)通过备份区域复位来复位

        三个专用的可屏蔽中断线:

                警告中断线,用来产生一个软件可编程的警告中断

                秒中断线,用来产生一个周期性(周期长度可编程,高达1s)的中断信号

                溢出中断线,用来检测内部可编程计数器什么时候翻滚到0

        3:功能描述

                (1)概要:

                        RTC 由两个主要的单元组成,第一个(APB1 接口)用于提供和 APB1
总线的接口,该单元还包括一套可以从 APB1总线以读或者写方式访问的16位的寄存器。APB1 接口由 APB1总线时钟驱动以和APB1总线连接。
                        另一个单元(RT内核)由一串可编程的计数器组成,这些计数器由两个模块构成:第
一个模块是RTC 预分频器模块,该模块产生RTC 时间基数 TR_CLK,时基可以被编程为1
个可以高达1秒的周期,它包含一个20位的可编程除法器(RTC预分频器)如果在RTC_CR
寄存器中使能了这个中断的话,每个TR_CLK 周期,RTC产生一个中断(秒中断);第二个
模块是一个32位的可编程的计数器,该计数器可以用当前的系统时间来初始化,系统时间
以 TR_CLK速率速率递增,并且和一个可编程的日期(存储在RTC_ALR 急存器中)进行比较以
产生一个警告中断(如果该中断在RTC_CR 控制寄存器中被使能了的话)

        RTC简化结构图

        4:读取RTC寄存器

                RTC内核完全独立于RTC APB1接口

                软件通过 APB1 接口访问RTC 预分频器,计数器和警告值,但是相关的可读寄存器在
每个由 RTC APB1 时钟再同步过的RTC时钟的上升沿期间内部更新。这对于RTC标志来说
也是一样的。
                这意味着如果 APB1接口先前被禁用了在APB1接口使能后并且还没有进行第一次内
部更新之前迅速读取RTC APB1寄存器读出的值可能是错误的(一般读到0)。这在以下情
况下可能发生:

                       (1) 发生了系统复位或电源复位

                        (2)MCU刚从STANDBY模式唤醒

                        (3)MCU刚从停止模式唤醒

                在以上所有的情况,APB1接口禁用(复位,无时钟驱动或者无电源供应)期间RTC
内核被保持在运行状态。
                因此,当禁用 RTC APB1接口后读取RTC寄存器时,软件首先必须等待RTC_CRL寄存
器中的 RSF位(寄存器同步位)被硬件置位。
                注意 RTC APB1 接口不受WFI和 WFE 低功耗模式影响。

                               
        5:配置RTC寄存器

         为了写 RTC_PRL,RTC_CNT,RTC_ALR寄存器,外设必须进入配置模式,这是通过
设置 RTC_CRL 寄存器中的CNF位来完成。
        另外,向任何RTC 寄存器的写操作仅当先前的写操作完成后才被进行。为了使软件能
够检测这种情况,RTC_CR 寄存器中的RTOFF 状态位专门用来指示寄存器是否正在进行更
新中,仅当 RTOFF 状态位值为‘1’的时候才能够向RTC 寄存器中写入新值。
配置的过程:

                1.轮询 RTOFF 位,在它的值变为‘1’之前等待
                2. 置位 CNF 位以进入配置模式
                3.写一个或者多个RTC 寄存器
                4.清除 CNF 位以退出配置模式
                5.轮询 RTOFF,直到它的值变成‘1’以确认写操作结束
                写操作仅当 CNF位被清除时才执行,需要至少3个RTCCLK周期才能够完成。

                                   

             

二:stm32cubemx中RTC配置       

        1:第一步 创建工程

                 打开stm32cubemx  选择芯片

                

                

        2:第二步 配置RTC

                RTC使能日历 将初始时间设置为 2024年8月1日18时50分39秒 周四

                

 

        3:第三步 配置调试接口

 

        4:第四步 配置时钟

 

        5:第五步 配置串口

                  使能串口2 波特率为115200 数据位为8 奇偶校验位无 停止位1

        

        6:生成工程        

三:实现RTC读取时钟

       1:  第一步 打开工程 编译一下

        在main函数中可以找到rtc模块的初始化函数 

         

        时分秒设置 

        年月日 周几设置 

       2:  第二步 定义声明接收时间数据和日期数据的结构体

                找到hal库中存放时间和日期的结构体原型

        时间数据结构体原型

日期数据结构体原型

在main函数开头定义时间数据结构体和日期数据结构体用来接收rtc模块的数据

       3:  第三步 重定向串口函数

        找地方重写printf重定向函数

         包含相关的头文件

        函数源码 

int fputc(int ch, FILE *f)
{
 
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);
 
  return ch;
 
}

       4:  第四步 在HAL库函数中找到获取时间和日期的函数

        hal库中获取rtc时间函数

        hal库中获取rtc日期函数

         

       5:  第五步 调用函数将RTC时钟的时间数据存放到接收数据的结构体中

                        调用函数获取时间

                        

                        调用函数获取日期

        

         

       6:  第六步 通过串口将时间和日期发送出去 

        串口发送 日期       

         串口发送时间

        

         

        调用延时函数延时1s 在循环内每隔1s读取时间和日期并将时间和日期发送出去

 

        7:通过usb转tll用串口调试助手在电脑端显示数据

                第一步:准备usb转tll模块

                                

                第二步:接线

                        单片机的  rx 对应usb转tll的tx             tx 对应 usb转tll的rx

                                        

                第三步:下载代码后打开串口调试助手 选择配置串口是时的波特率  数据位 校验位等

                单片机发送出的日期和时间数据 实现1s发送一次 一次发送两行 第一行 为年 月 日 周几

                第二行为时 分 秒

        串口助手收不到数据时可以查看是否是魔术棒选项未勾选 Use MicroLIB 

 

        mian函数源码

int main(void)
{

  /* USER CODE BEGIN 1 */
		RTC_TimeTypeDef time_data;    //接收时间数据结构体 时分秒
		RTC_DateTypeDef date_data;		//接收日期数据结构体 周几 几月 第几天 几几年
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			
			//调用获取时间函数
			HAL_RTC_GetTime(&hrtc,&time_data,RTC_FORMAT_BIN);
								
			//调用获取日期函数
			HAL_RTC_GetDate(&hrtc,&date_data,RTC_FORMAT_BIN);
		

		
			//串口输出日期
			printf("%02d/%02d/%02d %d",2000+date_data.Year,date_data.Month,date_data.Date,date_data.WeekDay);

			//串口输出时间
			printf("%02d:%02d:%02d",time_data.Hours,time_data.Minutes,time_data.Seconds);

			HAL_Delay(1000);      //单位ms 1000 = 1s
	}
  /* USER CODE END 3 */
}

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

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

相关文章

Linux中栈的大小的修改

目录 1. 使用ulimit命令 2. 修改系统级别的资源限制 3. 修改编译器选项 4. 修改内核参数(不常用) 5. 修改Makefile文件 检查当前栈大小 在Linux系统中,可以通过几种不同的方法来修改栈的大小。下面是几种常用的方法: 1. 使…

『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型

文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…

记录一次服务器被(crontab)木马入侵事件

背景:发现平时正常登录的服务器突然进不去,也没明显的错误,重启也登录不了! 可能的原因,内存/CPU满了 重启通过用户模式进入,查看进程发现有个定时任务一直在自动创建并执行(进程ID一直在变化&a…

机械学习—零基础学习日志(高数19——函数极限理解深化)

零基础为了学人工智能,真的开始复习高数 本次学习笔记,主要讲解函数极限的计算问题。 极限四则运算规则 这里有几个需要注意的地方。函数极限的四则运算,需要知道极限存在才能大胆放心的使用。而且使用超实数的概念会更好帮助我们理解&…

Python 操作PPT幻灯片- 添加、删除、或隐藏幻灯片

PowerPoint文档是商务、教育、创意等各领域常见的用于展示、教育和传达信息的格式。在制作PPT演示文稿时,灵活地操作幻灯片是提高演示效果、优化内容组织的关键步骤。下面将介绍如何使用国产Spire.Presentation for Python库实现添加、删除或隐藏PPT幻灯片。 目录 …

浅谈Java线程池的概念

目录 说明 1.线程池特点 2.线程池的简单示例 2.1 定义一个线程池类,通过创建一个全局的阻塞队列接收任务,线程池类构造方法拿阻塞队列的线程,完成线程的执行。 3. main方法中调用该类,实现线程池的调用 4.效果如下 说明 线程…

MySql Linux 安装

下载 下载后的文件为:mysql-8.4.2-linux-glibc2.28-x86_64.tar.xz 创建用户和用户组 $> groupadd mysql $> useradd -r -g mysql -s /bin/false mysql由于用户仅用于所有权目的,而不是登录目的,因此useradd命令使用 -r和-s /bin/false…

C++笔记之编译过程和面向对象

回顾: “abcd”//数据类型 字符串常量 const char *p"abc"; new STU const char *//8 指针的内存空间 int float 指针的内存空间 p 指针指向的内存空间 "abc" 取决于字符串长度 指针变量的内容一级指针 指针变量的地址二级指针 …

深度学习------权重衰退

目录 使用均方范数作为硬性限制使用均方范数作为柔性限制演示最优解的影响参数更新法则总结高纬线性回归多项式的权重衰退从零开始实现初始化模型参数定义L2范数惩罚定义训练代码实现忽略正则化直接训练使用权重衰减从零开始代码实现 多项式的权重衰退的简洁实现简洁函数代码简…

案例分享|Alluxio在自动驾驶数据闭环中的应用

分享嘉宾: 孙涛 - 中汽创智智驾工具链数据平台开发专家 关于中汽创智: 中汽创智科技有限公司(以下简称“中汽创智”)由中国一汽、东风公司、南方工业集团、长安汽车和南京江宁经开科技共同出资设立。聚焦智能底盘、新能动力、智…

学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)

一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按,控制 LED1;触摸按键 2 单击与长按,控制 LED2;触摸按键 3 单击与长按,控制 LED3;触摸按键 4 单击与长按,控制继电器; 1.1.2硬件电路 是原理图上触摸…

vue3+element-plus实现table表格整列的拖拽

参考文章&#xff1a;https://blog.csdn.net/candy0521/article/details/136470284 一、为防止原文章不见了将参考文章代码拷过来了&#xff08;不好意思&#xff09;&#xff1a;这是参考文章的代码 可直接复制粘贴运行 <template><div class"draggable-table&…

uniapp 多渠道打包实现方案

首先一个基础分包方案&#xff1a; 包不用区分渠道&#xff0c;只是通过文件名进行区分&#xff0c;公共代码逻辑可以通过mixins进行混入。 这样分包后就需要在打包时只针对编译的渠道包文件进行替换打包&#xff0c;其他渠道包的文件不打包进去&#xff0c;通过工具类实现…

商业策划案怎么写?附商场230个策划案例

商业策划案的撰写是一个系统性工程&#xff0c;旨在详细阐述项目的背景、目标、实施策略、财务预测及风险评估等内容&#xff0c;以吸引投资者或合作伙伴的关注。 以下是一个详细的撰写步骤和要点&#xff0c;码字不易&#xff0c;如果回答对你有所帮助&#xff0c;请不吝给一…

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍&#xff08;不得不吐槽下&#xff0c;官方代码有很多遗留问题&#xff0c;他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上&#xff09;&#xff0c;经过了大量的查阅各种资料以…

【目标和】python刷题记录

R3-dp篇. 目录 思路&#xff1a; 增加记忆化搜索&#xff1a; 优化空间复杂度&#xff1a; 思路&#xff1a; class Solution:def findTargetSumWays(self, nums: List[int], target: int) -> int:#设正数之和为p,总元素之和为s&#xff0c;带符号总元素之和为t&…

AWS开发人工智能:如何基于云进行开发人工智能AI

随着人工智能技术的飞速发展&#xff0c;企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务&#xff0c;旨在为企业提供一个简单、安全的平台&#xff0c;以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…

安卓常用控件(上)

文章目录 TextViewButtonEditText TextView textview主要用于在界面上显示一段文本信息。 属性名描述id给当前控件定义一个唯一的标识符。layout_width给控件指定一个宽度。match_parent&#xff1a;控件大小与父布局一样&#xff1b;wrap_content&#xff1a;控件大小刚好够包…

WinUI vs WPF vs WinForms: 三大Windows UI框架对比

1.前言 在Windows平台上开发桌面应用程序时&#xff0c;WinUI、WPF和WinForms是三种主要的用户界面框架。每种框架都有其独特的特点和适用场景。本文将通过示例代码&#xff0c;详细介绍这些框架的优缺点及其适用场景&#xff0c;帮助dotnet桌面开发者更好地选择适合自己项目的…