打印
[活动专区]

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

[复制链接]
4870|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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



使用特权

评论回复
沙发
hbxhang68| | 2021-3-18 20:49 | 只看该作者
感谢分享

使用特权

评论回复
板凳
hello、C|  楼主 | 2021-10-15 15:05 | 只看该作者
自己顶一顶,看一看

使用特权

评论回复
地板
uiint| | 2021-11-4 21:34 | 只看该作者
是自带的RTC吗?   

使用特权

评论回复
5
hellosdc| | 2021-11-4 21:34 | 只看该作者
怎么使用闹钟的功能呢?     

使用特权

评论回复
6
mituzu| | 2021-11-4 21:34 | 只看该作者
Calendar支持农历吗?   

使用特权

评论回复
7
suzhanhua| | 2021-11-4 21:35 | 只看该作者
可以计算节气吗?   

使用特权

评论回复
8
xietingfeng| | 2021-11-4 21:35 | 只看该作者
万年历的算法还是比较复杂的。   

使用特权

评论回复
9
isseed| | 2021-11-4 21:35 | 只看该作者
RTC Calendar是自带的?   

使用特权

评论回复
10
wangdezhi| | 2021-11-4 21:36 | 只看该作者
一直使用DS1302的   

使用特权

评论回复
11
biechedan| | 2021-11-4 21:36 | 只看该作者
如何转换位农历呢?      

使用特权

评论回复
12
chenci2013| | 2021-11-4 21:36 | 只看该作者
这个是万年历吗?     

使用特权

评论回复
13
gygp| | 2021-11-4 21:36 | 只看该作者
闰年的算法,周数的算法高端了。  

使用特权

评论回复
14
littlelida| | 2021-11-5 11:42 | 只看该作者
这个板子有屏么

使用特权

评论回复
15
内政奇才| | 2021-11-8 09:21 | 只看该作者
Calendar支持农历吗?

使用特权

评论回复
16
hello、C|  楼主 | 2022-1-7 14:37 | 只看该作者
肯定是可以支持农历的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

359

帖子

2

粉丝