[AIROC™ 蓝牙] 【英飞凌CYW20829测评】-5-体验英飞凌RTC-DST技术

[复制链接]
 楼主| 南来之风 发表于 2024-7-20 11:01 | 显示全部楼层 |阅读模式
<
本帖最后由 南来之风 于 2024-7-20 15:51 编辑

这是首次体验RTC模块,从用户手册了解到RTC由8个字段组成,分别是RTC_SEC, RTC_MIN, RTC_HOUR, CTRL_12HR, RTC_DAY, RTC_DATE,RTC_MON和RTC_YEAR,它们都以二进制编码的十进制(BCD)格式编码。BCD编码用法 4位表示一个十进制数字。RTC支持12小时和24小时两种时间格式,其中
“小时”字段能够显示AM/PM旗帜。RTC硬件自动补偿闰年,无需手动调整。闰年被定义为能被4或400整除的年份 不是100。
•要读和写,在BACKUP_RTC_RW寄存器中设置Read位和Write位

•RTC的报警功能可以产生一个中断,可以唤醒系统从睡眠,深度睡眠和休眠电源模式。它由六个对应于RTC字段的字段组成:Month/日期、星期、小时、分、秒。这允许RTC生成一个中断,当RTCtime与ALARM寄存器中设置的时间匹配。RTC组件物理上提供两个告警 可以触发SRSS备份中断以及时提示适当操作的函数

•RTC组件提供两种夏令时模式:固定日期和相对日期。启用夏令时后,alarm2块用于执行夏令时启动或停止动作。可选启用夏令时和支持任何开始和结束日期,可以是固定日期,如3月24日


那什么是DST?相信不少人对这个术语还是比较陌生,因为主要在欧美有冬令时,夏令时等地方才使用。
【参考:https://blog.csdn.net/ecjtuync/article/details/4435443】
DST翻译成中文好像是叫“日光节约时制”,也可以叫“夏时制”,是美国以及其它一些国家实行的时间调整制度。其实施方法就是在3月份的第二个礼拜日(在2007年以前是4月份的第一个礼拜日) 凌晨2点 将时间提前一小时,然后在11月份的第一个礼拜日(在2007年以前是10月份的最后一个礼拜日)凌晨2点将时间推迟一小时。

可以通过链接 http://www.energy.ca.gov/daylightsaving.html 了解一下美国1990年至2015年使用的“夏时制”。简单讲,就是在春天,将时间提前一小时,然后在秋天,将时间推迟一小时。


对于夏令时,对于RTC模块来说,需要更新Hour字段。那么这么多的嵌入式设备如何知晓是否到了该调整的时候了?这就可以使用咱们英飞凌的RTC DST技术了。
首先进行RTC初始化

  1. cy_rslt_t cyhal_rtc_init(cyhal_rtc_t *obj)
  2. {
  3.     CY_UNUSED_PARAMETER(obj);
  4.     CY_ASSERT(NULL != obj);

  5.     static const cy_stc_rtc_config_t default_time =
  6.     {
  7.         .dayOfWeek = CY_RTC_SATURDAY,
  8.         .date = 1,
  9.         .month = 1,
  10.         .year = 0,
  11.     };
  12.     return _cyhal_rtc_init_common(&default_time);
  13. }
获取并串口打印时间,日期
  1.         rslt = cyhal_rtc_read(&rtc_obj, &date_time);
  2.         if (CY_RSLT_SUCCESS == rslt)
  3.         {
  4.             strftime(buffer, sizeof(buffer), "%c", &date_time);
  5.             printf("\r\n%s", buffer);
  6.             memset(buffer, '\0', sizeof(buffer));
  7.         }


通过串口来设置新的时间
  1. static void set_new_time(uint32_t timeout_ms)
  2. {
  3.     cy_rslt_t rslt;
  4.     char buffer[STRING_BUFFER_SIZE] = {0};
  5.     uint32_t space_count = 0;

  6.     /* Variables used to store date and time information */
  7.     int mday, month, year, sec, min, hour;
  8.     struct tm new_time = {0};

  9.     printf("\rEnter time in "HH MM SS dd mm yyyy" format \r\n");
  10.     rslt = fetch_time_data(buffer, timeout_ms, &space_count);
  11.     if (rslt != CY_RSLT_ERR_CSP_UART_GETC_TIMEOUT)
  12.     {
  13.         if (space_count != MIN_SPACE_KEY_COUNT)
  14.         {
  15.             printf("\rInvalid values! Please enter the"
  16.                     "values in specified format\r\n");
  17.         }
  18.         else
  19.         {
  20.             sscanf(buffer, "%d %d %d %d %d %d",
  21.                    &hour, &min, &sec,
  22.                    &mday, &month, &year);

  23.             if (validate_date_time(sec, min, hour, mday, month, year))
  24.             {
  25.                 new_time.tm_sec = sec;
  26.                 new_time.tm_min = min;
  27.                 new_time.tm_hour = hour;
  28.                 new_time.tm_mday = mday;
  29.                 new_time.tm_mon = month - 1;
  30.                 new_time.tm_year = year - TM_YEAR_BASE;
  31.                 new_time.tm_wday = get_day_of_week(mday, month, year);

  32.                 rslt = cyhal_rtc_write(&rtc_obj, &new_time);
  33.                 if (CY_RSLT_SUCCESS == rslt)
  34.                 {
  35.                     printf("\rRTC time updated\r\n\n");
  36.                 }
  37.                 else
  38.                 {
  39.                     handle_error();
  40.                 }
  41.             }
  42.             else
  43.             {
  44.                 printf("\rInvalid values! Please enter the values in specified"
  45.                        " format\r\n");
  46.             }
  47.         }
  48.     }
  49.     else
  50.     {
  51.         printf("\rTimeout \r\n");
  52.     }
  53. }



时间设置成功!

下面设置DST:


在经过数分钟等待进入11点后,DST开始起作用了!



总结:
RTC组件提供了两种夏令时模式:固定日期和相对日期。启用夏令时后,alarm2块用于执行夏令时启动或停止动作。可选启用夏令时和
支持任何开始和结束日期,可以是固定日期,如3月24日或者是一个相对的日期。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部