本帖最后由 hello、C 于 2021-2-27 17:09 编辑
#申请原创# #技术资源#
RTC:Real time clock 即实时时钟,32.768kHz的时钟频率配合32768的步长实现秒级的定时,
从而实现实时时钟的计时功能,以此来描述人类在时间基础上的活动。相对于机械时钟,大大降低
了机械结构的复杂度,大大提升了钟表的实用性及便捷性,网络也为电子钟表的分段时间的时间精
度带来了大的提升。相对来说,电子钟表的实现更简单,毕竟一个微控制器加上不太多的外围电路
、蜂鸣器及显示屏,就能实现,而且制作起来还是比较简单的,因此也大大促进了其发展。
Calendar:日历(阳历),也有阴历及农历,一般都看阳历,对程序员来说,就只是算法及其
实现不一样罢了。现在我们来看看雅特力官方BSP支持库里面的例程,利用RTC实现Calendar.路径
在:\BSP\AT32F4xx_StdPeriph_Lib_V1.2.9\Project\AT_START_F407\Examples\RTC\Calendar.打开
工程文件,编译链接一下,0 error, 0 warning.简单看了一下Readme.txt,看看有没有什么需要注
意的,简单了看了下主程中包含的东西,大概知道其运行原理,利用硬件RTC结合Calendar有关算法
将Calendar信息通过UART接口到串口打印到串口上位机显示。根据程序中UART接口配置,配置好上位
机的串口配置,两个配置一致,然后下载程序到目标板,其显示结果如图所示:
显示时间之所以是从2018年开始的是因为在rtc.c文件中,RTC_Set(2018, 8, 8, 8, 8, 0);初始化了
实时时钟的起始时间。
我们将初始时间改为2021年2月27日12时0分0秒,编译链接,下载到目标板,重新上电。
效果如图所示:
我们观察到上位机串口会一直刷新当前的日历,每秒刷新一次,我们看看程序里面有个函数的引
用:RTC_GetFlagStatus(RTC_FLAG_PACE) != RESET 即等待RTC_FLAG_PACE标志位被置位,再执行日历
算法及打印操作,而RTC_FLAG_PACE是这样解释的RTC_FLAG_PACE: Second flag.就不用再明说了吧。
RTC_GetFlagStatus代码如下:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] Checks whether the specified RTC flag is set or not.
* @param RTC_FLAG: specifies the flag to check.
* This parameter can be one the following values:
* [url=home.php?mod=space&uid=2817080]@ARG[/url] RTC_FLAG_RTF: RTC Operation OFF flag
* [url=home.php?mod=space&uid=2817080]@ARG[/url] RTC_FLAG_RSYNF: Registers Synchronized flag
* @arg RTC_FLAG_OV: Overflow flag
* @arg RTC_FLAG_ALA: Alarm flag
* @arg RTC_FLAG_PACE: Second flag
* @retval The new state of RTC_FLAG (SET or RESET).
*/
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG)
{
FlagStatus bitstatus = RESET;
/* Check the parameters */
assert_param(IS_RTC_GET_FLAG(RTC_FLAG));
if ((RTC->CTRLL & RTC_FLAG) != (uint16_t)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
日历算法模块:rtc.c 文件中 用 _calendar_obj 结构体类型 声明了 calendar对象.当然该
模块也包含了主程中所使用的RTC方法:RTC_Get,每隔一秒获取当前实时秒数解析成实时时间。
在rtc.c文件中还包含了闰年的算法,周数的算法,年月日时分秒的算法等。所有的计算基础都是
从1970年1月1日到现在的总的秒数,依次来推算年月日时分秒周等。
然后是输出解析后的实时时钟信息,代码如下:
还是有必要贴一下主程代码:
其它的模块基本上是对所需其它外设的初始化,如:bkp、gpio、rcc、usart等。
rtc.c 部分代码一览:
RTC_Set
RTC_Get
|