hello、C 发表于 2021-2-27 17:09

【AT-START-F407测评】+ 3 BSP RTC Calendar

本帖最后由 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代码如下:
/**
* @briefChecks whether the specified RTC flag is set or not.
* @paramRTC_FLAG: specifies the flag to check.
*   This parameter can be one the following values:
*   @ARG RTC_FLAG_RTF: RTC Operation OFF flag
*   @ARG 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



hbxhang68 发表于 2021-3-18 20:49

感谢分享

hello、C 发表于 2021-10-15 15:05

自己顶一顶,看一看

uiint 发表于 2021-11-4 21:34

是自带的RTC吗?   

hellosdc 发表于 2021-11-4 21:34

怎么使用闹钟的功能呢?   

mituzu 发表于 2021-11-4 21:34

Calendar支持农历吗?   

suzhanhua 发表于 2021-11-4 21:35

可以计算节气吗?   

xietingfeng 发表于 2021-11-4 21:35

万年历的算法还是比较复杂的。   

isseed 发表于 2021-11-4 21:35

RTC Calendar是自带的?   

wangdezhi 发表于 2021-11-4 21:36

一直使用DS1302的   

biechedan 发表于 2021-11-4 21:36

如何转换位农历呢?      

chenci2013 发表于 2021-11-4 21:36

这个是万年历吗?   

gygp 发表于 2021-11-4 21:36

闰年的算法,周数的算法高端了。

littlelida 发表于 2021-11-5 11:42

这个板子有屏么

内政奇才 发表于 2021-11-8 09:21

Calendar支持农历吗?

hello、C 发表于 2022-1-7 14:37

肯定是可以支持农历的
页: [1]
查看完整版本: 【AT-START-F407测评】+ 3 BSP RTC Calendar