STM32的RTC实时时钟_蓝桥杯开发板时钟实验
实时时钟简介
RTC原理
-
RTC的硬件原理
RTC全称Real Time Clock,实时时钟,其本质上也是一个定时器,受时钟源驱动,与普通的TIM区别在于其断电后(只要电源电压保持,无论单片机本身在何种模式下)依旧能够独立运行,并且一经上电其寄存器会受到保护,这样的设计是为了让RTC起到记录现实时间(闹钟、日历)的功能
-
RTC的中断功能
RTC可编程的三种中断,进一步拓展了其功能:
- 闹钟中断:也就是字面意思的闹钟功能
- 秒中断:产生周期性的中断信号,最长1s
- 溢出中断:指示计数器溢出的状态
RTC的初始化配置
-
RTC的参数配置
HSE_RTC的频率较高,还需要经过RTC的分频得到1Hz,也就是对应现实中1s的信号;而且RTC记录现实的时间的功能需要事先配置好当前时间:
-
在Pinout&Configuration页面左侧栏的Timers中点开RTC,勾选Activate Clock Source后再勾选Activate Calender使能RTC并使能日历
-
在下方Parameter Settings中的General一栏进行分频,要得到1Hz:
Asynchronous Predivider value异步分频:125
Synchronous Predivider value同步分频:6000
750kHz/125=6kHz,6kHz/6000=1Hz
-
配置当前时间,在下方的Calendar Time与Calendar Date中设置时间与日期
-
-
时钟树的配置
RTC与普通TIM一样由时钟源产生的信号驱动,因此也需要先配置好单片机的时钟才能让RTC正常工作:
在CubeMX的时钟配置页Clock Configuration将RTC_ClOCK_Mux勾选为HSE_RTC,得到750kHz to RTC
实时时钟的使用
RTC使用的HAL库函数
-
保存日期/时间的结构体
时间有小时、分钟、秒,日期有年、月、日,使用一个结构体来保存这些变量使用更为方便,在HAL库函数中已经为我们做好了这些工作,我们只需要声明这个结构体类型的变量即可
RTC_TimeTypeDef time;//一个包含了各个时间变量的结构体time RTC_DateTypeDef date;//一个包含了各个日期变量的结构体data -
获取RTC时间HAL_RTC_GetTime
HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc,RTC_TimeTypeDef *sTime,uint32_t Format); /* RTC_HandleTypeDef *hrtc:RTC的句柄 RTC_TimeTypeDef *sTime:用以保存时间的结构体的地址 uint32_t Format:分RTC_FORMAT_BCD与RTC_FORMAT_BIN,一般用后者 */ //使用例:获取当前RTC的时间保存到time中 HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN); -
获取RTC日期HAL_RTC_GetDate
HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN); //类似上文
代码实现
-
输出当前时间
需要注意的是,必须同时GetDate并GetTime才能实现RTC
/* USER CODE BEGIN PTD */ RTC_TimeTypeDef time; //时间结构体 RTC_DateTypeDef date; //日期结构体 /* USER CODE END PTD */ HAL_RTC_GetTime(&hrtc,&time,RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc,&date,RTC_FORMAT_BIN); //获取时间后输出到LCD上 sprintf(buf,"Date:%2d-%2d-%2d ",date.Year,date.Month,date.Date); LCD_DisplayStringLine(Line3,(uint8_t*)buf); sprintf(buf,"Time:%2d-%2d-%2d ",time.Hours,time.Minutes,time.Seconds); LCD_DisplayStringLine(Line4,(uint8_t*)buf);
本文来自博客园,作者:无术师,转载请注明原文链接:https://www.cnblogs.com/artlessist/p/18999627
本文使用知识共享4.0协议许可 CC BY-NC-SA 4.0
特别说明版权归属的文章以及不归属于本人的转载内容(如引用的文章与图片)除外

浙公网安备 33010602011771号