STM32的RTC实时时钟_蓝桥杯开发板时钟实验

实时时钟简介

RTC原理

  • RTC的硬件原理

    RTC全称Real Time Clock,实时时钟,其本质上也是一个定时器,受时钟源驱动,与普通的TIM区别在于其断电后(只要电源电压保持,无论单片机本身在何种模式下)依旧能够独立运行,并且一经上电其寄存器会受到保护,这样的设计是为了让RTC起到记录现实时间(闹钟、日历)的功能

  • RTC的中断功能

    RTC可编程的三种中断,进一步拓展了其功能:

    • 闹钟中断:也就是字面意思的闹钟功能
    • 秒中断:产生周期性的中断信号,最长1s
    • 溢出中断:指示计数器溢出的状态

RTC的初始化配置

  • RTC的参数配置

    HSE_RTC的频率较高,还需要经过RTC的分频得到1Hz,也就是对应现实中1s的信号;而且RTC记录现实的时间的功能需要事先配置好当前时间:

    1. 在Pinout&Configuration页面左侧栏的Timers中点开RTC,勾选Activate Clock Source后再勾选Activate Calender使能RTC并使能日历

    2. 在下方Parameter Settings中的General一栏进行分频,要得到1Hz:

      Asynchronous Predivider value异步分频:125

      Synchronous Predivider value同步分频:6000

      750kHz/125=6kHz,6kHz/6000=1Hz

    3. 配置当前时间,在下方的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);
    
posted @ 2025-07-22 21:54  无术师  阅读(135)  评论(0)    收藏  举报