wenbo2005.online

学习记录 / STM32

关于 RTC

STM322025-03-26

RTC实质是一个掉电后还继续运行的定时器

一,RTC的简单运用(打印日期与时间)

1,配置STM32Cubemx

RCC的HSE与LSE都设置为外部晶振,SYS;

RTC:  Activate Clock Source (激活时钟源)和 Activate calendar(激活日历)都开启;RTC OUT选择 NO RTC OUTPUT;

        Binary data format     十六进制
        BCD data format     BCD码进制

选择BCD data format(BCD码进制),并设置时间与日期;

开启串口打印;

二,程序实现

编写串口打印函数,并添加头文件,开启USE;

在主函数前添加两个结构体:

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

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

主函数://======================先读时间,再读日期

        HAL_RTC_GetTime(&hrtc,&myTime,RTC_FORMAT_BIN);//============================时间获取函数
              printf("%02d:%02d:%02d\r\n",myTime.Hours, myTime.Minutes, myTime.Seconds);

              HAL_RTC_GetDate(&hrtc,&myData,RTC_FORMAT_BIN);//=============================日期获取函数
              printf("%02d/%02d/%02d\r\n",2000 + myData.Year, myData.Month, myData.Date);
              HAL_GPIO_TogglePin(GPIOC,LED_Pin);//========================检测
                 HAL_Delay(1000);

//==================================================================================================================

void time(int x,int y, int z)//========================自定义时间设置函数,调用即可,日期设置类似
{
    RTC_TimeTypeDef myTime;
    myTime.Hours = x;
      myTime.Minutes = y;
      myTime.Seconds = z;
    if (HAL_RTC_SetTime(&hrtc, &myTime, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }
}

void date (uint8_t YY, uint8_t MM, uint8_t DD)
{
    RTC_DateTypeDef sDate;
  myDate.WeekDay = RTC_WEEKDAY_MONDAY;
  myDate.Month = MM;
  myDate.Date = DD;
  myDate.Year = YY;
  if (HAL_RTC_SetDate(&hrtc, &myDate, RTC_FORMAT_BIN) != HAL_OK)
  {
    Error_Handler();
  }

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

        /*RTC周期回调中断服务函数*/
        void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)

        /*RTC闹钟A中断服务函数*/
        void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)

        /*RTC闹钟B中断服务函数*/
        void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)

总分频公式:

F(rtc_clock) = (PREDIV + 1) * (PREDIV_S + 1);

在STM32CubeMX 中 :

Asynchronous Predivider value (PREDIV_A):127

Synchronous Predivider value (PREDIV_S):255

(127+1)×(255+1)=128×256=32768(接近实际频率)