STM32—RTC

什么是RTC ?

RTC:实时时钟(Real-Time Clock),利用RTC可以实现产品的精确计时,比如平时用的笔记本电脑、电子日历等都有RTC模块,当主电源断电时,RTC的模块用电池来供电,继续进行计时。STM32中的RTC和定时器有点类似,有一个32位的计数器,可以计数2的32次方,大约可以计时136年。

RTC的结构框图

STM32—RTC_第1张图片

RTC的时钟源(STM32L1系列,其它系列的芯片时钟源会略有不同,但都是这三类):

(1) LSE 32.768kHz

(2)HSE,最大1Mhz

(3)LSI,内部低速时钟,L1系列是37k,F2系列是32K,F4系列是40K,频率不一样,预分频值的设定也不一样。

RTC的相关代码

下面是HAL库中RTC使用的一些代码。

 第一步,选择RTC的时钟源,本例选择内部低速时钟LSI,在系统时钟配置中有该时钟源的配置。

 
void SystemClock_Config(void) 
{ 

   //..............省略   



   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;      
   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;                     
   if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)= HAL_OK!)
   {   
       _Error_Handler(__ FILE __,__ LINE__); 
   }


   //............省略

}

 

然后,进行RTC初始化并启动设置RTC的定时时间,初始化部分涉及RTC的各个参数较多。

void MX_RTC_Init(void)
{ 
    / **初始化RTC  
    * / 
  hrtc.Instance = RTC; 
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小时制,还可选择12小时制
  hrtc.Init.AsynchPrediv = 124; //异步预分频值
  hrtc.Init.SynchPrediv = 295; //同步预分频值,异步与同步的预分频设置下面进行详细讲解
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; //输出关闭
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;// 输出极性为高,无效
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; //输出方式,开漏
  if(HAL_RTC_Init(&hrtc)!= HAL_OK)
  { 
    _Error_Handler(__ FILE __,__ LINE__); 
  } 

    / **初始化RTC并设置时间和日期  
    * / 
  if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0)!= 0x32F2){ 
  sTime.Hours = 0x09; 
  sTime.Minutes = 0x1F; 
  sTime.Seconds = 0x0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; //不使用夏令时
  sTime.StoreOperation = RTC_STOREOPERATION_RESET; 
  if(HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BIN)!= HAL_OK)//注意传入参数有二进制格式和BCD格式可选
  { 
    _Error_Handler(__ FILE __,__ LINE__); 
  } 

  sDate.WeekDay = RTC_WEEKDAY_MONDAY; 
  sDate.Month = RTC_MONTH_NOVEMBER; 
  sDate.Date = 0x15; 
  sDate.Year = 0x11; 

  if(HAL_RTC_SetDate(&hrtc,&sDate,RTC_FORMAT_BIN)!= HAL_OK)
  { 
    _Error_Handler(__ FILE __,__ LINE__); 
  } 

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2); 
  }
  //设置RTC定时时间1s 
  if(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,1,RTC_WAKEUPCLOCK_CK_SPRE_16BITS)!= HAL_OK)
  { 
    _Error_Handler(__ FILE __,__ LINE__); 
  }         
}
 

 RTC预分频值的设定关系到RTC多长时间记一次数。为了实现RTC的秒中断,需要对同步和异步预分频进行设置,如下图。STM32L1系列的RTC详细资料见链接:STM32L1XX_RTC。

STM32—RTC_第2张图片

如上图,为了得到1HZ计数周期,37KHZ/(124+1)/(295+1)=1HZ , 故预分频设置为124和295,如使用32.768k,设置为127和255。

RTC的时钟使能如下:

void HAL_RTC_MspInit(RTC_HandleTypeDef * hrtc)
{ 

      if(hrtc-> Instance == RTC)
      { 
      / * USER CODE BEGIN RTC_MspInit 0 * / 

      / * USER CODE END RTC_MspInit 0 * / 
        / * *RTC时钟使能* / 
        __HAL_RCC_RTC_ENABLE(); 
      / * USER CODE BEGIN RTC_MspInit 1 * / 
        HAL_NVIC_SetPriority(RTC_WKUP_IRQn,0,0);//设置RTC秒中断优先级
        HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);       //使能RTC秒中断
      / * USER CODE END RTC_MspInit 1 * / 
      } 
}
 

第三步:编写RTC中断函数并置标志位;

void RTC_WKUP_IRQHandler(void)
{
     HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
     RTC_Flag = 1; 
}

 

第四步:主函数中若标志位被置位,执行自己的程序;

while(1)
 {
   if(!RTC_Flag == RESET)
    {
          RTC_Flag = 0; //RTC标志位清零
         .......        //添加自己的程序
    }
 }
 

你可能感兴趣的:(STM32,STM32开发)