文章目录
一、 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秒的波形图
CH0为串口1的输出波形,CH1为GPIOC13的波形
GPIOC13LED波形
可以发现PC13引脚每秒发生一次翻转,参考代码可以发现确实如此
串口波形
放大串口的波形
每八个点对应一个字节
其中高电平对应1,低电平对应0。
从右往左读,第一个的二进制为00110010,对应十进制的50,也就是数字2对应的ASCII码值。
该波形全部数据依次为2021/11//29 20:43:25\r\n
四、总结
RTC可以帮助我们获取时间戳
五、参考
https://blog.csdn.net/as480133937/article/details/105741893