STM32之RTC时钟_stm32 rtc启动造成时钟-程序员宅基地

技术标签: 嵌入式硬件  单片机  

前言 

了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求:

1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒;

2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;

3)如果输出内容中需加入“星期x”,请修改代码。

目录

前言 

一.RTC时钟介绍

RTC原理框图

RTC具体流程:

RTC时钟选择

RTC复位过程

RTC中断

二.创建cubemax

1.设置RCC

2.配置RTC

三.修改代码

四.总结


一.RTC时钟介绍

RTC (Real Time Clock):实时时钟

RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

å¨è¿éæå¥å¾çæè¿°

 可编程的预分频系数:分频系数高为220。
● 32位的可编程计数器,可用于较长时间段的测量。
● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟 频率的四分之一以上)。
● 可以选择以下三种RTC的时钟源
     ● HSE时钟除以128;
     ● LSE振荡器时钟;
     ● LSI振荡器时钟

● 2个独立的复位类型:
     ● APB1接口由系统复位;
     ● RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位

● 3个专门的可屏蔽中断:
     ● 1.闹钟中断,用来产生一个软件可编程的闹钟中断。

     ● 2.秒中断,用来产生一个可编程的周期性中断信号(长可达1秒)。

     ● 3.溢出中断,指示内部可编程计数器溢出并回转为0的状态。

RTC时钟源:
三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

● HSI振荡器时钟
● HSE振荡器时钟
● PLL时钟

这些设备有以下2种二级时钟源:

● 40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。 RTC用于从停机/待机模式下自动唤醒系统。
● 32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。



RTC原理框图

在这里插入图片描述
RTC时钟的框图还是比较简单的,这里我们把他分成 两个部分:

APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。

通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC 核心接口:由一组可编程计数器组成,分成 两个主要模块 。
在这里插入图片描述g

第二个模块是一个 32 位的可编程计数器 (RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。



RTC具体流程:

RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC_CNT计数到RTC_ALR就会产生计数中断,

  • RTC_Second为秒中断,用于刷新时间,
  • RTC_Overflow是溢出中断。
  • RTC Alarm 控制开关机



RTC时钟选择

使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz,因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块.(在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式).



RTC复位过程

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。

系统复位后,禁止访问后备寄存器和RCT,防止对后卫区域(BKP)的意外写操作



RTC中断

秒中断:
这里时钟自带一个秒中断,每当计数加一的时候就会触发一次秒中断,。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。我们通过往秒中断

里写更新时间的函数来达到时间同步的效果

闹钟中断:
闹钟中断就是设置一个预设定的值,计数每自加多少次触发一次闹钟中断

二.创建cubemax

1.设置RCC

 

 

  • 设置高速外部时钟HSE 选择外部时钟源
  • 使能外部晶振LSE

RTC设备因为其独特的运行方式(即掉电依旧运行)使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE

2.配置RTC

å¨è¿éæå¥å¾çæè¿°

 

  • Activate Clock Source 激活时钟源
  • Activate calendar激活日历

这两个都要点,作用也很明显,先是使能时钟源,再使能RTC日历

  • RTC_OUT: Not RTC_OUT
  • Tamper: ×

第一个是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟,

第二个: RTC入侵检测校验功能

RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上
当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。

  1. 也就是第一个是使能tamper(PC13)引脚作为时钟脉冲输出
  2. 第二个是使能tamper(PC13)引脚作为入侵检测功能

下面是两个RTC的中断:

  • RTC全局中断RTC_IRQHandler()
  • 闹钟中断函数RTCAlarm_IRQHandler()

 

此处设置时间为2020/04/25 13:30:00

  • Data Format: 日期格式

Binary data format 十六进制
BCD data format BCD码进制

使用自动配置,初始化时间必须使用BCD data format,原因是库函数存在bug,如果使用Binary data format,月份配置会出错,比如说11月,配置时会赋值为RTC_MONTH_NOVEMBER,而此宏定义值为0x11,也就是说其十进制值为17

  • Hours: 小时

  • Minutes: 分钟

  • Seconds: 秒

  • Week Day: 星期

  • Month 月份

  • Date: 日期

  • Year: 年份

3 使能串口
在这里插入图片描述

使能一下串口,因为发送日期到上位机

4时钟源设置

我的是 外部晶振为8MHz

  • 1选择外部时钟HSE 8MHz
  • 2PLL锁相环倍频9倍
  • 3系统时钟来源选择为PLL
  • 4设置APB1分频器为 /2
  • 5 使能CSS监视时钟
  • 6 设置RTC时钟为LSE

32的时钟树框图 如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

 5项目文件设置

 

 

三.修改代码

在main.c文件中重写fputc函数,完成printf函数的重定向

//添加头文件#include "stdio.h"
int fputc(int ch,FILE *f){
 uint8_t temp[1]={ch};
 HAL_UART_Transmit(&huart1,temp,1,2);
 return ch;
}

在main.c中定义时间和日期的结构体用来获取时间和日期

RTC_DateTypeDef GetData;  //获取日期结构体

RTC_TimeTypeDef GetTime;   //获取时间结构体

在main函数的while循环中添加以下代码

/* Get the RTC current Time */
	    HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
      /* Get the RTC current Date */
      HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

      /* Display date Format : yy/mm/dd */
      printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
      /* Display time Format : hh:mm:ss */
      printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

      printf("\r\n");

      HAL_Delay(1000);

编译运行,效果如下:

 添加输出星期几

/* Display date Format : weekday */
		if(GetData.WeekDay==1){
			printf("星期一\r\n");
		}else if(GetData.WeekDay==2){
			printf("星期二\r\n");
		}else if(GetData.WeekDay==3){
			printf("星期三\r\n");
		}else if(GetData.WeekDay==4){
			printf("星期四\r\n");
		}else if(GetData.WeekDay==5){
			printf("星期五\r\n");
		}else if(GetData.WeekDay==6){
			printf("星期六\r\n");
		}else if(GetData.WeekDay==7){
			printf("星期日\r\n");
		}

 运行编译

å¨è¿éæå¥å¾çæè¿°

 

四.总结

练习熟悉了RTC。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/IT23131/article/details/121791075

智能推荐

【狂神JAVA】MyBatis笔记_jdk1.7的mybatis-程序员宅基地

文章浏览阅读2.5k次。简介自学的【狂神JAVA】MyBatis分享自写源码和笔记,希望对大家有帮助本人配置jdk13.0.2 (jdk1.7以上均可)Maven 3.6.3MySQL 5.7.23 (mysql5.6以上均可)1. 配置官网文档: https://mybatis.org/mybatis-3/zh/getting-started.htmlpom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://_jdk1.7的mybatis

学习笔记---分布式调度之xxlJob调度中心的启动源码解析_xxl 调度失败:执行器地址为空-程序员宅基地

文章浏览阅读913次。调度中心的代码启动源码是从:XxlJobAdminConfig 入口;直接进入: xxlJobScheduler.init();第一个: initI18n() 处理国际化;第二个:JobRegistryMonitorHelper.getInstance().start(); 创建启动后台线程来维护在线的执行器组下的机器列表,从上篇学习笔记—分布式调度之xxlJob执行器的启动源码解析可以..._xxl 调度失败:执行器地址为空

RS485/RS232串口通信实现源码_485代码-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏72次。之前贴出了代码,但是源码已经找不到了;鉴于很多同学私信想要参考,找时间重新写了一个工程一、参考代码1.不方便下载的同学可以参考贴出来的源代码链接:RS485二、基本知识1.RS485通信讲解:读30001、30002两个寄存器,假设从机地址为1上位机(主机)发送下行报文:01 03 00 03 00 02 34 0B从机地址功能码寄存器起始地址读取寄存器个数CRC校验010300 0300 0285 ca010300 0400 0285 ca上_485代码

李开复揭密微软成功之道 寄语中国软件业(4)_在微软许多人都像我一样主动从事发现人才、跟踪人才和吸引人才的工作....-程序员宅基地

文章浏览阅读1k次。http://www.sina.com.cn 2005年04月07日 11:19 新浪科技  文/李开复  人才:微软的立业之本  微软公司把重视人才的管理理念视为公司的核心财富。在信息时代里,人才的价值尤为重要。在工业时代里,一个优秀技工和一个普通技工的效率差异可能是30%,但在信息时代里,一个高级程序员和一个普通程序员的效率差异可能高达10倍以上。 ad1= "打造校_在微软许多人都像我一样主动从事发现人才、跟踪人才和吸引人才的工作....

python量化交易pdf书籍微盘,python量化交易编程自学_python 量化交易 pdf 百度网盘-程序员宅基地

文章浏览阅读836次,点赞21次,收藏19次。大家好,小编为大家解答python量化交易教程电子书的问题。很多人还不知道python量化交易pdf书籍微盘,现在让我们一起来看看吧!_python 量化交易 pdf 百度网盘

OFDM802.11a的FPGA实现(七)一级交织:分组交织器(含verilog和matlab代码)

在前面的文章中讲解了卷积编码和删余,实现了1/2、2/3、3/4编码速率的输出。数据域在编码之后,下一个部分就是交织。今天对交织进行具体实现。

随便推点

SpringBoot与分布式事务组件-程序员宅基地

文章浏览阅读2k次。随着互联网应用的复杂性增加,越来越多的公司选择使用微服务架构模式进行应用开发,将单体应用拆分成多个小型服务,每个服务部署在不同的服务器上。同时,为了提升系统的可用性、容错性和可扩展性,需要考虑分布式事务问题。本文将介绍 Spring Boot 在分布式事务中的一些实现方案,并给出相关原理。

小程序基础入门(黑马学习笔记)_黑马微信小程序笔记-程序员宅基地

文章浏览阅读2.8k次,点赞12次,收藏90次。权当学习笔记吧_黑马微信小程序笔记

SpringBoot的旅游网站的设计与实现 - 源码免费(私信领取)

采用Spring Boot框架进行后端开发,结合前端技术(如Vue.js、React等)进行页面设计,数据库采用MySQL进行数据存储,确保系统的稳定性和性能。本项目旨在设计并实现一个基于Spring Boot的旅游网站,为用户提供便捷的旅游信息查询、预订服务,以及旅游资讯分享功能,提升用户旅游体验。通过市场调研和用户需求分析,了解用户对旅游网站的需求和偏好,明确系统的功能和特点,确保系统能够满足用户的旅游需求。进行全面的系统测试,包括功能测试、性能测试、安全性测试和用户体验测试,确保系统的质量和可靠性。

liunx服务使用(mysql数据库的安装和传说中的LAMP的安装【论坛的搭建】)-程序员宅基地

文章浏览阅读88次。首先解说一下源码包和rpm包的区别,虽然不是全面的的但是是绝对正确的。源码包mysql的安装rpm包与源码包的区别1.linux运行效率,高很多功能模块针对linux开发,在windos上并没有标准化得编程接口,很多功能并不能实现,并且mysql apache php最早也是在linux上开发的发展的,第三方软件多2.软件的选择 不一定最新当时要选最稳定的rpm与源代码rpm...

在VSCode中配置多个版本的Python环境,并设置PYTHONHOME环境变量

另外,如果你想要在项目级别配置Python解释器,你可以在项目的根目录下创建一个.vscode文件夹(如果还没有的话),然后在这个文件夹中创建一个settings.json文件。在settings.json文件中,你可以添加类似于"python.pythonPath": "/path/to/python39"的设置来指定Python解释器的路径。这样,当你在VSCode中打开这个项目时,它会自动使用你在settings.json文件中指定的Python解释器。在弹出的对话框中,点击“环境变量”按钮。

VBOX报错"Kernel driver not installed(rc=-1908)"-程序员宅基地

文章浏览阅读129次。根据报错提示先安装dkms包[root@OS4 ~]# rpm-ivh dkms-2.2.0.3-3.2.noarch.rpm warning: dkms-2.2.0.3-3.2.noarch.rp..._vboxheadless: error -1908 in suplibosinit! vboxheadless: kernel driver not i

推荐文章

热门文章

相关标签