历史上的今天
今天是:2025年07月16日(星期三)
2019年07月16日 | STM32开发笔记44:RTC驱动程序的移植
2019-07-16 来源:eefocus
单片机型号: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相应的成员函数,就可以进行时间的设置了。
史海拾趣
|
影响单片机系统可靠安全运行的主要因素主要来自系统内部和外部的各种电气干扰,并受系统结构设计、元器件选择、安装、制造工艺影响。这些都构成单片机系统的干扰因素,常会导致单片机系统运行失常,轻则影响产品质量和产量,重则会导致事故,造成重大经 ...… 查看全部问答> |
|
如题 别人写好的驱动程序,我如何才能取得这个驱动程序支持的设备id? 好像inf文件里面存了有,但不知道是怎么读出来的 本人菜鸟,忘各位多多指点… 查看全部问答> |
|
下地最近忙于一个项目,pc端用sql2005,pda准备用acesss 但是遇到mdb转cdb的困难 请教无解 于是启用方案二 采用sqlite3 发现还是格式转换的问题,.mdb和.db转换也没有资料 群里的兄弟们,小弟数据库知识欠缺,还请大家多多建议,因为查询效率问题 ...… 查看全部问答> |
|
刚开始用恩智浦的平台。很多问题不懂。 LPC11u24和1769程序烧写需要用什么烧写器? 这两种芯片自带AD吗?英文DATASHEET实在看不懂……… 查看全部问答> |
|
如今,80后已逐渐成为家装主力军,他们的消费心理也随之成为影响整个市场趋势的重要因素。 80后是追求个性化生活的一代 ,他们面对装修时更是如此,混搭风格、时尚款式、另类装饰……样样都不能少。80 ...… 查看全部问答> |
|
TI 公司 新增了多线产品组合套件,现在就来免费样片申请! 机会难得! 德州仪器(TI)公司致力于为客户提供“更多的设计和开发,更多的产品,更多的支持,更强的制造产能”,势必带给大家前所未有的体验。 从通讯、计算机、消费类电子到汽车、工业,从能源、医疗到安防、航空航天,收购国半之 ...… 查看全部问答> |
|
根据数据表,644的ADC默认是单步转换模式,这样很麻烦,我想用连续转换。 根据数据表介绍,我使能转换完成中断,在中断里面读取自动连续转换的结果数据。但是调试发现一直进不去中断。 请问大虾们,有关于644(一定要这个芯片,很多芯片的例程和 ...… 查看全部问答> |




