×
单片机 > 单片机程序设计 > 详情

STM32开发笔记44:RTC驱动程序的移植

发布时间:2020-05-30 发布时间:
|

单片机型号:STM32F070F6P6


本文介绍,将RTC驱动程序移植到自己的工程项目中的方法。本项目仅使用了RTC的实时时钟功能,没有启动定时报警等功能。


1、在STM32CubeMX中对RTC进行配置,如下图所示,激活了时钟源和日历功能。



2、配置RTC的时钟,如下图所示,STM32F070F6P6不能接外部的32.768K的晶振,所以只能使用HSE或LSI RC供给,考虑LSI RC精度比较差,所以使用HSE作为RTC的时钟源,我现在接的HSE时钟为12MHz,由于其频率比较高,所以选择最大的分频系数,这里是32,则供给给RTC的频率为375KHz。



3、对RTC进行设置,如下图所示,这里只考虑Synchronous Predivider Value参数就可以了,其计算方法:RTC供给频率/(Asynchronous Predivider Value+1) - 1=375000/128 - 1 =2930-1=2929。



4、设置完毕后,直接生成代码就可以了。


5、在工程中加入stm32f0xx_hal_rtc.c和stm32f0xx_hal_rtc_ex.c文件。



6、在工程中新建rtc.cpp和rtc.h文件。


7、对stm32f0xx_hal_conf.h文件进行设置,使能功能宏HAL_RTC_MODULE_ENABLED。


8、拷贝相应的代码对rtc.cpp文件中,并将以下内容加入到rtc.h中。


#ifndef RTC_H_

#define RTC_H_

 

#ifdef __cplusplus

extern "C"{

 

class CRtc

{

public:

    RTC_HandleTypeDef hrtc;

    RTC_TimeTypeDef sTime;

    RTC_DateTypeDef sDate;

public:

    CRtc(void);

    void SetTime(void);

    void GetTime(void);

};

 

}

#endif

#endif

9、rtc.cpp的文件内容如下:


#include "include.h"

 

CRtc::CRtc(void)

{

  hrtc.Instance = RTC;

  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;

  hrtc.Init.AsynchPrediv = 127;

  hrtc.Init.SynchPrediv = 2929;

  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)

  {

    Target.ErrorHandler(__FILE__, __LINE__);

  }

 

  sTime.Hours = 0x0;

  sTime.Minutes = 0x0;

  sTime.Seconds = 0x0;

  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;

  sTime.StoreOperation = RTC_STOREOPERATION_RESET;

 

  sDate.WeekDay = RTC_WEEKDAY_MONDAY;

  sDate.Month = RTC_MONTH_JANUARY;

  sDate.Date = 0x1;

  sDate.Year = 0x0;

 

  SetTime();

}

 

void CRtc::SetTime(void)

{

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)

  {

    Target.ErrorHandler(__FILE__, __LINE__);

  }

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)

  {

    Target.ErrorHandler(__FILE__, __LINE__);

  }

}

 

void CRtc::GetTime(void)

{

  if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)

  {

    Target.ErrorHandler(__FILE__, __LINE__);

  }

  if (HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)

  {

    Target.ErrorHandler(__FILE__, __LINE__);

  }

}

10、在include.h中包含相应的头文件。


11、在hal.h中,声明RTC对象。


12、在main.cpp中调用RTC相应的成员函数,就可以进行时间的设置了。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址