打印
[AIROC™ 蓝牙]

【英飞凌CYW20829测评】-5-体验英飞凌RTC-DST技术

[复制链接]
298|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 南来之风 于 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初始化

cy_rslt_t cyhal_rtc_init(cyhal_rtc_t *obj)
{
    CY_UNUSED_PARAMETER(obj);
    CY_ASSERT(NULL != obj);

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


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

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

    printf("\rEnter time in \"HH MM SS dd mm yyyy\" format \r\n");
    rslt = fetch_time_data(buffer, timeout_ms, &space_count);
    if (rslt != CY_RSLT_ERR_CSP_UART_GETC_TIMEOUT)
    {
        if (space_count != MIN_SPACE_KEY_COUNT)
        {
            printf("\rInvalid values! Please enter the"
                    "values in specified format\r\n");
        }
        else
        {
            sscanf(buffer, "%d %d %d %d %d %d",
                   &hour, &min, &sec,
                   &mday, &month, &year);

            if (validate_date_time(sec, min, hour, mday, month, year))
            {
                new_time.tm_sec = sec;
                new_time.tm_min = min;
                new_time.tm_hour = hour;
                new_time.tm_mday = mday;
                new_time.tm_mon = month - 1;
                new_time.tm_year = year - TM_YEAR_BASE;
                new_time.tm_wday = get_day_of_week(mday, month, year);

                rslt = cyhal_rtc_write(&rtc_obj, &new_time);
                if (CY_RSLT_SUCCESS == rslt)
                {
                    printf("\rRTC time updated\r\n\n");
                }
                else
                {
                    handle_error();
                }
            }
            else
            {
                printf("\rInvalid values! Please enter the values in specified"
                       " format\r\n");
            }
        }
    }
    else
    {
        printf("\rTimeout \r\n");
    }
}



时间设置成功!

下面设置DST:


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



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

使用特权

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

本版积分规则

48

主题

250

帖子

2

粉丝