STM32CubeMX使用(六)之RTC及制作时间戳

发布于:2023-07-04 ⋅ 阅读:(322) ⋅ 点赞:(0)

一、概述

本文记录下RTC的使用过程,主要是后续使用,能有个参考。主要是为了提供时间戳,所以应用非常简单。用到其他功能,再补充此篇文章。
CubeMX芯片: STM32G0B1RCT6
实际焊接STM32G0B1RET6

二、Pinout&Configuration

开启RTC外设,设置初始的时间:
在这里插入图片描述

三、Clock Configuration

注意将RTC的时钟来源选择为外部的32.768晶振。
在这里插入图片描述
生成代码就可以了。

四、测试RTC

4.1 获取时间

RTC_DateTypeDef GetData;    //获取日期结构体
RTC_TimeTypeDef GetTime;    //获取时间结构体

while(1)
{
	  HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
      HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);

      main_debug("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
      main_debug("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);

      nbos_msleep(3000);
}

查看打印结果:
在这里插入图片描述

4.2 制作时间戳

4.2.1 生成时间戳

这里的时间戳是指,格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
首先增加时间戳函数,制作时间戳需要用到mktime库函数,需要添加的头文件和函数说明,可以参考:C 库函数 – mktime() | 菜鸟教程在这里插入图片描述
查看打印结果:
在这里插入图片描述
参考链接:STM32 之 时间戳的解析与生成

4.2.2 验证时间戳

得到时间戳后,可以使用在线工具进行验证:时间戳(Unix timestamp)转换工具 - 在线工具
将我们自己的时间戳输入进去,即可得到北京时间,以此进行验证。也可以将我们需要转换的时间输入进去,转换得到时间戳:
在这里插入图片描述
从转换结果看,时间戳得到时间,与北京时间相差8小时。可以想到,是因为时区导致,对时间戳函数进行调整即可:
在这里插入图片描述

4.2.3 时间戳时间无变化

//2022.2.11
使用过程中发现时间戳最开始能变化,很快就变成了固定值:
在这里插入图片描述
仿真查看,出现异常后,读取到的日期和时间确实不再改变。。。搜索了一下(STM32 HAL库读取RTC时钟一直不更新时间的问题),原来是需要先读时间,再读日期。更改后恢复正常。

在看4.1节中的测试代码,确实是先读取时间,所以之前没能发现这个问题。

本文含有隐藏内容,请 开通VIP 后查看