[活动专区] 【AT-START-F407测评】+ 3 BSP RTC Calendar

[复制链接]
 楼主| hello、C 发表于 2021-2-27 17:09 | 显示全部楼层 |阅读模式
本帖最后由 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接口配置,配置好上位
机的串口配置,两个配置一致,然后下载程序到目标板,其显示结果如图所示:

B1

B1


    显示时间之所以是从2018年开始的是因为在rtc.c文件中,RTC_Set(2018, 8, 8, 8, 8, 0);初始化了
实时时钟的起始时间。

    我们将初始时间改为2021年2月27日12时0分0秒,编译链接,下载到目标板,重新上电
效果如图所示:

B6

B6


    我们观察到上位机串口会一直刷新当前的日历,每秒刷新一次,我们看看程序里面有个函数的引
用:RTC_GetFlagStatus(RTC_FLAG_PACE) != RESET 即等待RTC_FLAG_PACE标志位被置位,再执行日历
算法及打印操作,而RTC_FLAG_PACE是这样解释的RTC_FLAG_PACE: Second flag.就不用再明说了吧。
RTC_GetFlagStatus代码如下:
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Checks whether the specified RTC flag is set or not.
  3.   * @param  RTC_FLAG: specifies the flag to check.
  4.   *   This parameter can be one the following values:
  5.   *     [url=home.php?mod=space&uid=2817080]@ARG[/url] RTC_FLAG_RTF: RTC Operation OFF flag
  6.   *     [url=home.php?mod=space&uid=2817080]@ARG[/url] RTC_FLAG_RSYNF: Registers Synchronized flag
  7.   *     @arg RTC_FLAG_OV: Overflow flag
  8.   *     @arg RTC_FLAG_ALA: Alarm flag
  9.   *     @arg RTC_FLAG_PACE: Second flag
  10.   * @retval The new state of RTC_FLAG (SET or RESET).
  11.   */
  12. FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG)
  13. {
  14.   FlagStatus bitstatus = RESET;

  15.   /* Check the parameters */
  16.   assert_param(IS_RTC_GET_FLAG(RTC_FLAG));

  17.   if ((RTC->CTRLL & RTC_FLAG) != (uint16_t)RESET)
  18.   {
  19.     bitstatus = SET;
  20.   }
  21.   else
  22.   {
  23.     bitstatus = RESET;
  24.   }

  25.   return bitstatus;
  26. }

    日历算法模块:rtc.c 文件中 用 _calendar_obj 结构体类型 声明了 calendar对象.当然该
模块也包含了主程中所使用的RTC方法:RTC_Get,每隔一秒获取当前实时秒数解析成实时时间。
    在rtc.c文件中还包含了闰年的算法,周数的算法,年月日时分秒的算法等。所有的计算基础都是
从1970年1月1日到现在的总的秒数,依次来推算年月日时分秒周等。

    然后是输出解析后的实时时钟信息,代码如下:

B2

B2


    还是有必要贴一下主程代码:

B3

B3


    其它的模块基本上是对所需其它外设的初始化,如:bkp、gpio、rcc、usart等。

    rtc.c 部分代码一览:
RTC_Set

B4

B4


RTC_Get

B5

B5



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 来自手机 | 显示全部楼层
肯定是可以支持农历的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

359

帖子

2

粉丝
快速回复 返回顶部 返回列表