问题简述:
实验环境:使用stm32cubemx配置生成了一个RTC的工程,使能了外部时钟LSE,提供了备用电池VBTE。
问题:断开主电源后(备用电池已经安装好了),再次上电读取RTC的值发现,数值为断电前的数值。
问题分析:
断电重启之后,RTC的数据没有丢失,说明后备电池确实在为后备区域提供电源。
根据官方提供的框图,可以看到RTC和LSE掉电后都是通过备用电池供电的。
按照描述,我配置了外部时钟LSE也提供了外部供电VBTE,那么在系统掉电后,RTC应该继续计时才对。
我开始检查配置相关的程序,通过仔细查看程序,发现RTC的时钟来源居然是LSI(我明明开启了LSE的),如果是LSI的话掉电后就不工作了,当然RTC也不走时了。
回头再看STM32Cubemx发现,时钟树中RTC的时钟来源确实是LSI RC, 原来是自己太粗心,没有选择LSE,略坑呀,改为LSE后再覆盖原来的工程之后问题解决。
总结:
1.RTC是个普通32位计数器(F103),1秒累加1次,计满32位的话,大约需要136年,所以不必担心溢出问题。所以常用LINUX时间戳来计算当前时间,即从1970年1月1日0时0分0秒,到当前时间经过了多少秒,从而得到当前的日期和时间。这个涉及到平年和闰年,稍微麻烦一点。
2.RTC的时钟来源有三个,LSI内部RC(默认)、HSE(外部高速时钟)、LSE(外部低速时钟),前两个掉电都停止供电,LSE掉电后可以依靠VBTE供电工作。
3.VBTE给LSE、RTC、和后备寄存器,通常可以往后备寄存器里面随便写个值,开机的时候读取一个这个值复位没有,如果VBTE也没电了的话,说明RTC也不会走了,记录的时间也是不对的,这个时候就要从新写入时间了。