打印
[应用相关]

RTC驱动程序的移植(转载)

[复制链接]
727|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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


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


使用特权

评论回复
沙发
木木guainv|  楼主 | 2019-6-18 13:51 | 只看该作者
2、配置RTC的时钟,如下图所示,STM32F070F6P6不能接外部的32.768K的晶振,所以只能使用HSE或LSI RC供给,考虑LSI RC精度比较差,所以使用HSE作为RTC的时钟源,我现在接的HSE时钟为12MHz,由于其频率比较高,所以选择最大的分频系数,这里是32,则供给给RTC的频率为375KHz。



使用特权

评论回复
板凳
木木guainv|  楼主 | 2019-6-18 13:51 | 只看该作者

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


使用特权

评论回复
地板
木木guainv|  楼主 | 2019-6-18 13:52 | 只看该作者
4、设置完毕后,直接生成代码就可以了。

使用特权

评论回复
5
木木guainv|  楼主 | 2019-6-18 13:52 | 只看该作者

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


使用特权

评论回复
6
木木guainv|  楼主 | 2019-6-18 13:52 | 只看该作者
6、在工程中新建rtc.cpp和rtc.h文件。

使用特权

评论回复
7
木木guainv|  楼主 | 2019-6-18 13:52 | 只看该作者
7、对stm32f0xx_hal_conf.h文件进行设置,使能功能宏HAL_RTC_MODULE_ENABLED。

使用特权

评论回复
8
木木guainv|  楼主 | 2019-6-18 13:53 | 只看该作者
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
木木guainv|  楼主 | 2019-6-18 13:53 | 只看该作者
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();
}


使用特权

评论回复
10
木木guainv|  楼主 | 2019-6-18 13:54 | 只看该作者
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__);
  }
}




使用特权

评论回复
11
木木guainv|  楼主 | 2019-6-18 13:54 | 只看该作者
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__);
  }
}

使用特权

评论回复
12
木木guainv|  楼主 | 2019-6-18 13:54 | 只看该作者
10、在include.h中包含相应的头文件。

使用特权

评论回复
13
木木guainv|  楼主 | 2019-6-18 13:55 | 只看该作者
11、在hal.h中,声明RTC对象。

使用特权

评论回复
14
木木guainv|  楼主 | 2019-6-18 13:55 | 只看该作者
12、在main.cpp中调用RTC相应的成员函数,就可以进行时间的设置了。

使用特权

评论回复
15
643757107| | 2019-6-18 22:54 | 只看该作者
RTC非常好。

使用特权

评论回复
16
木木guainv|  楼主 | 2019-7-4 16:52 | 只看该作者
非常感谢支持

使用特权

评论回复
17
heimaojingzhang| | 2019-7-9 11:02 | 只看该作者
应该是各种型号通用吧

使用特权

评论回复
18
wakayi| | 2019-7-9 11:04 | 只看该作者
我自己移植的挺繁琐的

使用特权

评论回复
19
木木guainv|  楼主 | 2019-8-6 12:51 | 只看该作者
看起来很受支持啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

4130

帖子

5

粉丝