我正在尝试在Linux设备上配置RTC闹钟。我使用了RTC documentation:
中的一个例子 int retval
struct rtc_time rtc_tm;
/* .... */
/* Read the RTC time/date */
retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
if (retval == -1) {
exit(errno);
}
/* Set the alarm to 5 sec in the future, and check for rollover */
rtc_tm.tm_sec += 5;
if (rtc_tm.tm_sec >= 60) {
rtc_tm.tm_sec %= 60;
rtc_tm.tm_min++;
}
if (rtc_tm.tm_min == 60) {
rtc_tm.tm_min = 0;
rtc_tm.tm_hour++;
}
if (rtc_tm.tm_hour == 24)
rtc_tm.tm_hour = 0;
retval = ioctl(fd, RTC_ALM_SET, &rtc_tm);
if (retval == -1) {
exit(errno);
}
此代码段使用绝对时间(从纪元开始)并且它对我不起作用。我认为这是由于硬件中的一个错误,但在一些看似随机的时间之后,警报就开始了。我设法找到的另一篇文档是rtc.cc中的评论:
case RTC_ALM_SET: /* Store a time into the alarm */
{
/*
* This expects a struct rtc_time. Writing 0xff means
* "don't care" or "match all". Only the tm_hour,
* tm_min and tm_sec are used.
*/
只使用小时,分钟和秒表明时间与调用ioctl时相关。
时间传递给ioctl(fd,RTC_ALM_SET,& rtc_tm)是相对的还是绝对的?
答案 0 :(得分:1)
RTC闹钟在绝对时间内工作,换句话说,如果您希望闹钟在5分钟后熄灭,那么您应该读取当前时间并将5分钟添加到当前时间并使用结果设置闹钟时间。
以下是来自TI RTC芯片文档的文章片段:(http://www.ti.com/lit/ds/symlink/bq3285ld.pdf)
在每个更新周期中,RTC将日期,小时,分钟和秒字节与四个相应的警报字节进行比较。如果找到所有字节的匹配,则报警中断事件标志位(寄存器C中的AF)设置为1.如果启用了报警事件,则会产生中断请求。
我相信这在整个RTC中非常标准......