本帖最后由 南来之风 于 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日或者是一个相对的日期。
|