目录
一、概述
本文记录下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 后查看