STM32日历读取,设置和输出

一.RTC原理
二.创建CubeMX工程
三.代码编译运行

一.RTC原理

(一)RTC介绍
1.定义:

RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片。

RTC芯片是一种能提供日历/时钟(世纪、年、月、时、分、秒)及数据存储等功能的专用集成电路。

2.应用

A.跟踪日期和时间。

B.报警、闹钟、看门狗、高精度的校准寄存器。

C.在待机状态下,作为逻辑电路的主时钟。

D.信号时钟源和参数设置存储电路。

3.应用领域

A.适合于一切需要微功耗及准确计时的场合。

B.嵌入式领域:手机、数码相机、MP3、MP4、电子词典等

C.电器仪表:电视机、复费率电表、高精度时钟、可编程时间控制器等。

D.通信工程、电气自动化、工业控制等自动化程度高的领域中的无人值守环境。 4.特点:计时准确、耗电低、体积小、价格便宜。

(二)RTC发展
1.早期RTC产品

早期RTC产品实质是一个带有计算机通讯口的分频器。它通过对晶振所产生的振荡频率分频和累加,得到年、月、日、时、分、秒等时间信息并通过计算机通讯口送入处理器处理。

这一时期RTC的特征如下:在控制口线上为并行口;功耗较大;采用普通CMOS工艺;封装为双列直插式;芯片普遍没有现代RTC所具有的万年历及闰年月自动切换功能,也无法处理2000年问题。现在已经被淘汰。

2.中期RTC产品

在20世纪90年代中期出现了新一代RTC,它采用特殊CMOS工艺;功耗大为降低,典型值约0.5μA以下;供电电压仅为1.4V以下;和计算机通讯口也变为串行方式,出现了诸如三线SIO/四线SPI,部分产品采用2线I2C总线;包封上采用SOP/SSOP封装,体积大为缩小;

功能上:片内智能化程度大幅提高、具有万年历功能,输出控制也变得灵活多样。其中日本RICOH推出的RTC甚至已经出现时基软件调校功能(TTF)及振荡器停振自动检测功能而且芯片的价格极为低廉。目前,这些芯片已被客户大量使用中。

3.最新一代RTC产品

最新一代RTC产品中,除了包含第二代产品所具有的全部功能,更加入了复合功能,如低电压检测,主备用电池切换功能,抗印制板漏电功能,且本身封装更小(高度0.85mm,面积仅为2mm*2mm)。
(三)RTC硬件结构
1、 晶振

A、 晶振简介
晶振一般叫做晶体谐振器,是一种机电器件,晶振是石英振荡器的简称,英文名为Crystal

是用电损耗很小的石英晶体经精密切割磨削并镀上电极焊上引线做成。
B、 晶振的作用:提供基准频率。
C 、RTC的晶振

任何实时时钟的核心都是晶振,晶振频率为32768 Hz 。
它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期的准确性,晶振必须正常工作,不能够收到干扰。
RTC的晶振又分为:外部晶振和内置晶振。
D、RTC的晶振频率为什么是32768Hz?
① RTC时间是以振荡频率来计算的。故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。215 = 32768 。
② 32768 Hz = 215 即分频15次后为1Hz,周期 = 1s。
③ 经过工程师的经验总结32768 Hz,时钟最准确。
④ 规范和统一。
E、RTC3276832.768KHz实时时钟的作用
一、是保持时间的准确性
二、是在待机状态下,作为逻辑电路的主时钟(目的是为了节电,基本处于休眠,逻辑电路主要由32.768KHz作为主时钟)。
2、内置主备用电池自动切换电路:时刻检测主供电电压,当主供电电压低于设定电压时,自动切换为备用电源供电且备电方式灵活;
3、停振自动检测电路:芯片内部有监测电路,一旦晶振停振(即使有再次正常起振起振运行)就在芯片内相应寄存器置位,可供系统判断计时数据的有效性。
4、I2C总线方式:
通过SCL/SDA两根线同CPU通讯,占用口线少,通用性强;
5、可编程中断
可由软件设定为定时中断输出,或方波输出(频率可选),电平输出;
6、内置具有延迟功能的电压检测电路:
可以用于提示用户电量不足,保证产品的正常运行。
7、12/24小时制可选,满足多种应用场合;
8、可自动识别闰年
9、TTF(时基软件调校 Time Trimming Function )

TTF是RTC发展史上具有里程碑意义的技术,从此以晶振为基准的电子钟表,也可以具备类似传统钟表控制摆长以调节精度的功能。原来单纯依赖晶振精度的RTC有了更方便、更高精度的实现方法。下面就这一突破性的技术及生产中的调节方法做些探讨。

TTF是利用吞吐脉冲技术来补偿晶体振荡器的固有偏差而实现高精度时钟输出。利用一套特殊的数字电路增加或减去相当于晶振振荡误差的脉冲,而不改变晶振本身的振荡。在一定的调节时基中,如20S内,调节电路在最后一秒发生作用,校准整个时基。这一校正过程完全是数字化过程,故不会影响晶体负载电容匹配,不影响晶体振荡电阻。调节范围为±189ppm的大调节范围(当采用32.768KHz晶振时),调整后的精度可以达到小于±1.5ppm(1PPM=1百万分之一)。在这一时基调节过程中,调整量的大小,是增还是减,均是通过对一个RTC内部指定寄存器赋值来实现的,也就是通过测算当前所用晶振的频率与理论零误差晶振的差值而得出此次补偿字节的值。同时TTF是一个软件控制的数字调节过程,这就带来了对晶体温度特性进行补偿的可能性;即CPU只需通过感温元件,如热敏电阻经A/D读出环境温度就可算出晶体此时的温度偏差,从而计算出补偿值而写入RICOH RTC中进行温度补偿,达到TCXO振荡器效果。
(四)RTC的软件控制
在这里插入图片描述
二.创建CubeMX工程
1.设置RCC
在这里插入图片描述
2.配置RTC
在这里插入图片描述
3.RTC入侵检测校验功能
在这里插入图片描述
使用自动配置,初始化时间必须使用BCD data format,原因是库函数存在bug,如果使用Binary data format,月份配置会出错,比如说11月,配置时会赋值为RTC_MONTH_NOVEMBER,而此宏定义值为0x11,也就是说其十进制值为17

Hours: 小时

Minutes: 分钟

Seconds: 秒

Week Day: 星期

Month 月份

Date: 日期

Year: 年份
4.使能串口
在这里插入图片描述
5.创建项目
在这里插入图片描述
三.代码编译运行
1.打开stm32f1xx_hal_rtc.h文件

/* RTC Time and Date functions ************************************************/
/** @addtogroup RTC_Exported_Functions_Group2
  * @{
  */
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);/*读取系统日期*/
/**
  * @}
  */

/* RTC Alarm functions ********************************************************/
/** @addtogroup RTC_Exported_Functions_Group3
  * @{
  */
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);/*设置报警中断*/
HAL_StatusTypeDef HAL_RTC_DeactivateAlarm(RTC_HandleTypeDef *hrtc, uint32_t Alarm);/*报警时间回调函数*/
HAL_StatusTypeDef HAL_RTC_GetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Alarm, uint32_t Format);
void              HAL_RTC_AlarmIRQHandler(RTC_HandleTypeDef *hrtc);
HAL_StatusTypeDef HAL_RTC_PollForAlarmAEvent(RTC_HandleTypeDef *hrtc, uint32_t Timeout);
void              HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc);

2.输出初始时间

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

在这里插入图片描述
3.在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);

在这里插入图片描述
4.加上星期

			if(GetData.WeekDay==1){
				printf("Monday\r\n");
			}else if(GetData.WeekDay==2){
				printf("Tuesday\r\n");
			}else if(GetData.WeekDay==3){
				printf("Wednesday\r\n");
			}else if(GetData.WeekDay==4){
				printf("Thursday\r\n");
			}else if(GetData.WeekDay==5){
				printf("Friday\r\n");
			}else if(GetData.WeekDay==6){
				printf("Saturday\r\n");
			}else if(GetData.WeekDay==7){
				printf("Sunday\r\n");
			}

  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
			  /* 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);
			/* Display date Format : weekday */
			if(GetData.WeekDay==1){
				printf("Monday\r\n");
			}else if(GetData.WeekDay==2){
				printf("Tuesday\r\n");
			}else if(GetData.WeekDay==3){
				printf("Wednesday\r\n");
			}else if(GetData.WeekDay==4){
				printf("Thursday\r\n");
			}else if(GetData.WeekDay==5){
				printf("Friday\r\n");
			}else if(GetData.WeekDay==6){
				printf("Saturday\r\n");
			}else if(GetData.WeekDay==7){
				printf("Sunday\r\n");
			}
      printf("\r\n");

      HAL_Delay(1000);

  }

5.编译运行结果

在这里插入图片描述

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值