一、RTC

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

在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。
RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。

上电复位后,所有RTC寄存器都会受到保护,以防止可能的非正常写访问。

无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC便不会停止工作。
RCT特征:
● 可编程的预分频系数:分频系数高为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 核心接口:**由一组可编程计数器组成,分成 两个主要模块

第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。

第二个模块是一个 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秒钟中断一次。我们通过往秒中断里写更新时间的函数来达到时间同步的效果

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

二、配置RTC

1、设置RCC
设置高速外部时钟HSE 选择外部时钟源
使能外部晶振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()

3、RTC初始时间

可以看到RTC默认初始时间是0年1月1日0时0分0秒星期一
设置时间为创建时间2022年10月31日8:46

4、使能串口

5、时钟树配置

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

三、添加代码

RTC_HAL库函数

/*设置系统时间*/
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*设置系统日期*/
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*启动报警功能*/
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*设置报警中断*/
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*报警时间回调函数*/
__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
/*写入后备储存器*/
void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
/*读取后备储存器*/
uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister

因为系统的时间和日期开始的时候已经设置过了,所以我们这里只用两个读取函数

/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)

在stm32f1xx_hal_rtc.h头文件中,可以找到RTC_TimeTypeDefRTC_DateTypeDef这两个结构体的成员变量

/*** @brief  RTC Time structure definition*//*时间结构体*/
typedef struct
{uint8_t Hours;            /*!< Specifies the RTC Time Hour.This parameter must be a number between Min_Data = 0 and Max_Data = 23 */uint8_t Minutes;          /*!< Specifies the RTC Time Minutes.This parameter must be a number between Min_Data = 0 and Max_Data = 59 */uint8_t Seconds;          /*!< Specifies the RTC Time Seconds.This parameter must be a number between Min_Data = 0 and Max_Data = 59 */} RTC_TimeTypeDef;
/*** @brief  RTC Date structure definition*//*日期结构体*/
typedef struct
{uint8_t WeekDay;  /*!< Specifies the RTC Date WeekDay (not necessary for HAL_RTC_SetDate).This parameter can be a value of @ref RTC_WeekDay_Definitions */uint8_t Month;    /*!< Specifies the RTC Date Month (in BCD format).This parameter can be a value of @ref RTC_Month_Date_Definitions */uint8_t Date;     /*!< Specifies the RTC Date.This parameter must be a number between Min_Data = 1 and Max_Data = 31 */uint8_t Year;     /*!< Specifies the RTC Date Year.This parameter must be a number between Min_Data = 0 and Max_Data = 99 */} RTC_DateTypeDef;

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

定义两个结构体来获取日期和时间:
RTC_DateTypeDef GetData; //获取日期结构体

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

在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);

四、编译烧录

Boot0置1,Boot1置0


添加星期几
在如下位置添加代码

/* 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");}

效果实现:

五、总结

如果在串口最后无法输出内容,可以点击魔术棒——>Target——>给Use MicroLIB打勾。

STM32的日历读取、设置和输出相关推荐

  1. 了解实时时钟RTC的原理并通过stm32实现STM32的日历读取、设置和输出

    文章目录 前言 一.RTC是什么? 1.定义 2.原理 二.配置项目 三.配置代码 1.重定向printf函数 2.效果(1) 3.添加星期 4.效果(2) 四.总结 五.参考资料 前言 硬件:stm ...

  2. STM32日历读取,设置和输出

    STM32日历读取,设置和输出 一.RTC原理 (一)RTC介绍 (二)RCT特征: (三)RTC原理框图 (四)RTC时钟选择 (五)RTC复位过程 (六)配置RTC寄存器 (七)RTC时钟源 (八 ...

  3. STM32F103C8T6使用RTC实现日历读取、设置和输出

    目录 一.使用STM32cubeMX创建项目 二.添加代码 三.结果 四.总结 五.参考链接 一.使用STM32cubeMX创建项目 前面的创建过程都差不多选芯片就完事了!直接配置开始 1.RCC配置 ...

  4. stm32 学习 (设置TIM4输出4路 pwm J-LINK仿真验证)

    使用单片机:stm32f103c8t6  资源 RAM: 20K: flash: 64K:CPU频率: 72M:通用I/O: 32个:UART: 3个:SPI:2个:USB:1个:CAN: 1个:II ...

  5. STM32模拟IIC读取PCF8563

    作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...

  6. STM32通过IIC读取MPU6050原始数据过程详解

    STM32通过IIC读取MPU6050数据过程详解 一:硬件介绍 此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是主IIC,通过SCL和SDA两条线与MCU通信:第二个辅助 ...

  7. STM32的推挽输出和开漏输出

    文章目录 前言 一.推挽输出 二.开漏输出 三.区别和适应场景 总结 前言 本篇文章将带大家了解STM32的推挽输出和开漏输出,并且学习这两个的区别,学习分别在什么时候使用这两个不同的输出方式. 在 ...

  8. Android系统日历读取各厂商农历年重复event

    农历按年重复事件读取 日历业务,发现android手机设置按年重复事件,各个厂商都支持按农历年重复,比如发生时间是每月正月十五,但读取出来,日期都是设定的公历日期,在第二年就肯定错了. 比如用户添加一 ...

  9. STM32软硬件SPI读取MAX31865 PT100温度支持shell功能

    PT100的温度读取硬件是利用TB的MAX31865现成模块,也可以自己做相应的PCB.原理图可以查看美信官方文档作为参考.传送门:https://www.maximintegrated.com/en ...

最新文章

  1. access数据库拆分的用途_聊聊数据库设计一些经验 条条都是干货
  2. 【Opencv实战】入门也能学会的「黑白上色」教程与手法核心~(收藏不谢)
  3. 2_python基础—格式化符号(输入、输出、转义、结束)
  4. 小米10至尊纪念版今日开卖:120hz高刷+120W秒充
  5. Username is not in the sudoers file. This incident will be reported
  6. 【面试指南】如何看待你的竞争对手30k,而你却3k?想要高薪,我们也要学会拧螺丝、造飞机的能力
  7. LabWindows操作Access
  8. 深蓝学院-多传感器融合定位课程学习分享-专栏汇总
  9. android开发如何获取电话号码的归属地信息
  10. PIXI入门-PIXI文档翻译(1)
  11. 学习工具001:PPT画图配色
  12. 【python常用小工具】python打印26个英文字母
  13. 当幸福来敲门 经典语录
  14. NBA球星管理系统 v1.0
  15. 信息论 | Shannon编码MATLAB实现
  16. 应用程序连接hbase报错:java.net.SocketTimeoutException: callTimeout=60000
  17. MySQL事务及实现原理
  18. RFI/RFP/RFQ的区别
  19. 处理器_深度学习及 KPU 基础知识
  20. [附源码]java毕业设计代驾服务系统

热门文章

  1. B_zhan直播间弹幕抓取
  2. BZOJ P1966[Ahoi2005]VIRUS 病毒检测
  3. 英特纽购途索的商业模式是否存在裂变效应?
  4. android 开源聊天控件,聊天IM的时间戳显示规则
  5. python求乘积_Python实现求笛卡尔乘积方法详解
  6. 无题三首【百步斋诗钞】
  7. 【Android控件布局】Layout 水平平分空间、垂直平分空间
  8. (人、机、料、法、环)搞不懂,你还能做生产?
  9. 好用的待办事项app有什么功能?
  10. PHP+iis部署最干货的步骤