你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[STM32 ] RTC 实时时钟的系统时间维护

[复制链接]
STMCU-管管 发布时间:2020-12-4 14:27
[STM32 ] RTC 实时时钟的系统时间维护


STM32内部带有RTC时钟,可以使用内部LSI和外部晶振LSE提供时钟源。


LSI:单片机内部的晶振,受外部环境影响比较大,比如温度等因素;大概40Khz左右;


LSE:外接32.768KHz的晶振,比较稳定;


软件可配置选择时钟源,可判断识别是否起振。

驱动:


1、首先要启动对应的时钟


RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);


2、使能RTC功能


PWR_BackupAccessCmd(ENABLE);


3、配置时钟


RCC_LSICmd(ENABLE);    //内部晶振


RCC_LSECmd(ENABLE);    //外部晶振


读取LSE状态


RCC_GetFlagStatus(RCC_FLAG_LSERDY)


读取LSI状态


RCC_GetFlagStatus(RCC_FLAG_LSIRDY)


4、操作RTC所有寄存器之前需要先确定总线为空闲才能操作成功;


RTC_WaitForSynchro();//等待上一个指令执行完成;


5、初始化配置属性


        //软件对时钟进行校准,HSE 按照32.768KHZ接入,公式如下:


       uwAsynchPrediv = 0xFF


       uwSynchPrediv = 0x7F


ck_spre(1Hz)=RTCCLK(LSE)/(uwAsynchPrediv + 1)*(uwSynchPrediv+1)


RTC_InitStructure.RTC_AsynchPrediv=uwAsynchPrediv;


RTC_InitStructure.RTC_SynchPrediv=uwSynchPrediv;

        //24/12小时制   


RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;


RTC_Init(&RTC_InitStructure);


6、时钟在不掉电的情况下只需要初始化一次即可,程序复位防止多次初始化,在BAK区域写初始化标志,可解决;


    RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);

    初始化前,读取RTC_BKP_DR0,查看是否为0x32F2,如果是,表示已经初始化成功。


if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)

7、读取日期时间


    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);


8、写入日期时间


    RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);   






下面为此篇文章的重点


系统里面保存事件或者打印信息,都带有时标,不可能每次都去操作MCU的总线去读取RTC寄存器获取;或者是外部RTC芯片8025,IIC接口;


直接操作硬件缺点如下:


1、直接从硬件中获取事件,精度很难取到ms级别,芯片最小刻度为秒;
2、操作总线占用系统资源,降低MCU性能;


为解决这个事情,需要系统中有个维护软时钟功能,接替RTC的走时;


具体做法为:


1、开启定时器,具体根据需求定义周期,可开启一个1ms定时器;
2、软时钟1ms累加计数,1S=1000ms;累加到1000,秒数加1;
3、防止走时误差大,一小时建议同步一次时钟,从硬件RTC中,把时间读取一次到软时钟同步;

1 收藏 2 评论0 发布时间:2020-12-4 14:27

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版