STM32F103基于RTC实现简单日历

一、 RTC

1.定义:

RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片。 RTC芯片是一种能提供日历/时钟(世纪、年、月、时、分、秒)及数据存储等功能的专用集成电路。

2.应用

跟踪日期和时间。
报警、闹钟、看门狗、高精度的校准寄存器。
在待机状态下,作为逻辑电路的主时钟。
信号时钟源和参数设置存储电路。

3.应用领域

适合于一切需要微功耗及准确计时的场合。
嵌入式领域:车载电子、手机、数码相机、MP3、MP4、电子词典等
电器仪表:电视机、复费率电表、高精度时钟、可编程时间控制器等。
通信工程、电气自动化、工业控制等自动化程度高的领域中的无人值守环境。

4.特点

计时准确、耗电低、体积小、价格便宜

二、CubeMX创建项目

1.配置RCC

在这里插入图片描述

2.配置RTC

在这里插入图片描述

3.配置串口

在这里插入图片描述

4.配置时钟

在这里插入图片描述

5.配置项目

在这里插入图片描述

三、RTC操作

1.HAL库RTC相关操作函数

/*设置系统时间*/
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  


2.读取RTC初始日期

定义日期时间对象

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

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

获取日期和时间并输出

		HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
		printf("%02d/%02d/%02d %02d:%02d:%02d\r\n",date.Year,date.Month,date.Date,time.Hours,time.Minutes,time.Seconds);
		HAL_Delay(1000);

结果

可以发现输出的默认日期为0000/01/01 00:00:00,HAL库的日期是需要默认+2000的,也就是2000/01/01 00:00:00。
在这里插入图片描述

3.输出当前时间

初始化日期和时间

	date.Year=21;
	date.Month=11;
	date.Date=29;
	date.WeekDay=RTC_WEEKDAY_FRIDAY;
	
	time.Hours=20;
    time.Minutes=20;
	time.Seconds=20;
	
	HAL_RTC_SetDate(&hrtc,&date,RTC_FORMAT_BIN);
	HAL_RTC_SetTime(&hrtc,&time,RTC_FORMAT_BIN);

获取日期和时间并输出

		HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
		printf("%0004d/%02d/%02d %02d:%02d:%02d\r\n",date.Year+2000,date.Month,date.Date,time.Hours,time.Minutes,time.Seconds);
		HAL_Delay(1000);

结果

在这里插入图片描述

4.使用keil仿真查看串口

红色为PC13的波形,蓝色为串口一的波形。
由于没有明显的划分字节,不好分析。所以建议SaleaeLogic16逻辑分析仪进行分析。

5.使用SaleaeLogic16逻辑分析仪分析串口协议

截取5秒的波形图

在这里插入图片描述

GPIOC13LED波形

可以发现PC13引脚每秒发生一次翻转,参考代码可以发现确实如此
在这里插入图片描述

串口波形

在这里插入图片描述每八个点对应一个字节
其中高电平对应1,低电平对应0。
从右往左读,第一个的二进制为00110010,对应十进制的50,也就是数字2对应的ASCII码值。

在这里插入图片描述该波形全部数据依次为2021/11//29 20:43:25\r\n
在这里插入图片描述

四、总结

RTC可以帮助我们获取时间戳

五、参考

https://www.cnblogs.com/dreamrj/p/14046598.html
https://blog.csdn.net/as480133937/article/details/105741893

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

一、 RTC

1.定义:

RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片。 RTC芯片是一种能提供日历/时钟(世纪、年、月、时、分、秒)及数据存储等功能的专用集成电路。

2.应用

跟踪日期和时间。
报警、闹钟、看门狗、高精度的校准寄存器。
在待机状态下,作为逻辑电路的主时钟。
信号时钟源和参数设置存储电路。

3.应用领域

适合于一切需要微功耗及准确计时的场合。
嵌入式领域:车载电子、手机、数码相机、MP3、MP4、电子词典等
电器仪表:电视机、复费率电表、高精度时钟、可编程时间控制器等。
通信工程、电气自动化、工业控制等自动化程度高的领域中的无人值守环境。

4.特点

计时准确、耗电低、体积小、价格便宜

二、CubeMX创建项目

1.配置RCC

在这里插入图片描述

2.配置RTC

在这里插入图片描述

3.配置串口

在这里插入图片描述

4.配置时钟

在这里插入图片描述

5.配置项目

在这里插入图片描述

三、RTC操作

1.HAL库RTC相关操作函数

/*设置系统时间*/
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  


2.读取RTC初始日期

定义日期时间对象

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

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

获取日期和时间并输出

		HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
		printf("%02d/%02d/%02d %02d:%02d:%02d\r\n",date.Year,date.Month,date.Date,time.Hours,time.Minutes,time.Seconds);
		HAL_Delay(1000);

结果

可以发现输出的默认日期为0000/01/01 00:00:00,HAL库的日期是需要默认+2000的,也就是2000/01/01 00:00:00。
在这里插入图片描述

3.输出当前时间

初始化日期和时间

	date.Year=21;
	date.Month=11;
	date.Date=29;
	date.WeekDay=RTC_WEEKDAY_FRIDAY;
	
	time.Hours=20;
    time.Minutes=20;
	time.Seconds=20;
	
	HAL_RTC_SetDate(&hrtc,&date,RTC_FORMAT_BIN);
	HAL_RTC_SetTime(&hrtc,&time,RTC_FORMAT_BIN);

获取日期和时间并输出

		HAL_RTC_GetTime(&hrtc, &time, RTC_FORMAT_BIN);
		HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);
		printf("%0004d/%02d/%02d %02d:%02d:%02d\r\n",date.Year+2000,date.Month,date.Date,time.Hours,time.Minutes,time.Seconds);
		HAL_Delay(1000);

结果

在这里插入图片描述

4.使用keil仿真查看串口

红色为PC13的波形,蓝色为串口一的波形。
由于没有明显的划分字节,不好分析。所以建议SaleaeLogic16逻辑分析仪进行分析。

5.使用SaleaeLogic16逻辑分析仪分析串口协议

截取5秒的波形图

在这里插入图片描述

GPIOC13LED波形

可以发现PC13引脚每秒发生一次翻转,参考代码可以发现确实如此
在这里插入图片描述

串口波形

在这里插入图片描述每八个点对应一个字节
其中高电平对应1,低电平对应0。
从右往左读,第一个的二进制为00110010,对应十进制的50,也就是数字2对应的ASCII码值。

在这里插入图片描述该波形全部数据依次为2021/11//29 20:43:25\r\n
在这里插入图片描述

四、总结

RTC可以帮助我们获取时间戳

五、参考

https://www.cnblogs.com/dreamrj/p/14046598.html
https://blog.csdn.net/as480133937/article/details/105741893

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

生成海报
点赞 0

qq_46132489

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32G0 模拟看门狗 代码例程

在户外电源逆变器项目中遇到了高压MOS管烧坏的情况,经过排查,发现老化设备动态响应速度慢,做负载冲击测试的时候,出现供电不稳,供给逆变器的电压掉电又恢复,电压下

KEIL5安装STM32的芯片支持包

第一步: 找到芯片支持包的网址 https://www.keil.com/dd2/Pack/ 第二步:找到STM32系列的芯片支持包 第三步:下载完后得到 将该文件加入到KEIL5的安装目录中 接