在工业设备中,嵌入式控制系统对时间精度通常有严格要求,尤其在电力自动化、轨道交通等领域,系统时间误差常需控制在1ms以内。为满足这一要求,本地设备必须具备可靠的对时机制,并确保本地时钟系统自身具有良好的精度,因此校时机制不可或缺。
常见的时间数据源包括NTP服务器、IRIG-B信号、GPS模块以及本地RTC时钟。实际应用中需选择一种既满足精度要求又便于获取的时间源。
l NTP服务器:通过网络NTP协议获取时间数据
l IRIG-B信号:通过专用接口从时间服务器接收IRIG-B时间码
l GPS:通过串口从GPS模块接收时间信息
l RTC:从板载RTC芯片读取时间
基本的的构成框图如下:

b体育·(sports)主板上的RTC选择满足普通应用的无温度补偿的低成本方案。在对本地RTC有更高时间精度要求的场合,可以外接RX-8025T高精度时钟芯片,以获得更稳定的时间,如上图所示。
嵌入式系统时间同步的典型流程如下图所示:

b体育·(sports)工控主板提供了一系列保障系统时间精度的方法,最高可实现系统时间与基准时间误差小于1ms。实现高精度时间的前提是具备可靠的基准时间信号源,如PPS、IRIG-B、NTP或GPS信号。
下面以ESM7400为例,说明保持系统时间精度的基本软件流程:
1、 系统启动后,从ESM7400板载RTC读取时间,初始化操作系统时间
2、 应用程序启动后,从高精度时间信号源(IRIG-B、NTP、GPS)获取标准时间,校正系统时间。此步骤只需在软件启动后执行一次有效校准即可。
3、 开启PPS秒同步线程,持续进行时间微调,可将精度提升至50μs以内。该线程需持续运行,以实现每秒一次的高精度校正。
4、 定期(如每日1-2次)将校准后的系统时间回写至板载RTC,保持RTC时间准确性。
5、 执行其它应用任务。
分步说明:
一、使用IRIG-B获取标准时间
ESM7400内核已集成IRIG-B解码驱动,使用时需将IRIG-B信号连接到ESM7400的GPIO15,相关示例代码如下:
#define IRIG_B_SET_SYSTIME 0x00 #define IRIG_B_SET_RTCTIME 0x01 int ret, i1, fd; struct tm t; fd = open("/dev/irig-b", O_RDWR); //打开IRIG-B数据解码设备 i1=IRIG_B_SET_SYSTIME; //获取IRIG-B时间数据,并设置到系统时间 write(fd, &i1, sizeof(int)); i1=IRIG_B_SET_RTCTIME; //获取IRIG-B时间数据,并设置到独立时钟芯片rtc0 write(fd, &i1, sizeof(int)); ret = read(fd, &t, sizeof(struct tm)); //只读取IRIG-B时间数据 if(ret == 0) printf("time:%d-%d-%d %d:%d:%d\n",_year, _mon, _mday, _hour, _min, _sec); else printf("irig-b get time failed!\n");
对于NTP与GPS的时间获取,内核末提供专用驱动,需在应用程序中实现协议解析。常用NTP服务器可参考:
l 中国国家授时中心:114.118.7.161
l 阿里云: 118.31.3.89
二、使用PPS实现秒同步
ESM7400内核已内置GPIO-PPS驱动,支持通过PPS信号进行高精度秒同步,精度可达到30us以内。PPS信号需要接入ESM7400的GPIO8。GPIO-PPS驱动本身不直接进行时间校准,核心功能是提供精确的时间戳与上报,时间校正需由上层应用调用adjtimex()完成。基本应用流程如下:
1、打开pps0设备: open("/dev/pps0", O_RDWR);
2、设置捕捉模式: ioctl(fd, PPS_SETPARAMS, ¶ms);
3、获取pps时间戳: ioctl(fd, PPS_FETCH, &fdata)
4、检验数据并计算时间偏差
5、校正系统时间: adjtimex(&tx);
步骤3~5需在独立线程中循环执行,以实现持续同步。在我们的例子中可实现30us以内的时间误差。

例程输出信息解释:
l 序列:PPS脉冲计数,连续表示信号捕获稳定。
l 系统时间:系统当前时间(秒 + 纳秒)
l PPS时刻:PPS脉冲在当前秒内的精确到达时间
l 偏移:系统时间相对于PPS脉冲的快/慢程度(微秒),上图所示的数据表示系统时间比pps脉冲慢19us
l 调整:累计已调整的时间量,上图所示已累计调整了2us
三、无外部基准源时的RTC增强方案
在没有IRIG-B或NTP或GPS等外部高精度时间源是,只能依靠板载的RTC来保证操作系统时间的准确性性。为了保障更高时间精度,可依靠外接RX-8025T高精度时间芯片来提升时间可靠性。在硬件方面,通过I2C连接RX-8025T致ESM7400,并将RX-8025T的中断输出(秒边沿对齐)接入ESM7400的GPIO25引脚,驱动支持定期将RTC时间同步至ESM7400系统时间,每10秒同步一次,在晶振20ppm误差下,可保证系统时间与RTC偏差小于300μs。
启用该功能的代码如下:
#define RTC_TIMER_IRQ_CTRL_ON 0x5170 #define RTC_TIMER_IRQ_CTRL_OFF 0x5171 // 打开 RTC 设备 rtc_fd = open("/dev/rtc0", O_RDONLY); // 使能RTC中断并同步系统时间 ioctl(rtc_fd, RTC_TIMER_IRQ_CTRL_ON, 1); // 关闭同步功能 ioctl(rtc_fd, RTC_TIMER_IRQ_CTRL_OFF, 1);
硬件参考电路如下图所示:

该方案中所需的资源与用途:
l GPIO8: PPS信号输入
l GPIO15:IRIG-B信号输入
l GPIO25:RX-8025T时钟芯片中断信号,需外接约10K上拉电阻
l GPIO26/GPIO27:RX-8025T I2C通讯,需要外接约4.7K上拉电阻
l 串口:GPS数据接收
l 网口:NTP通讯
由于代码较多,在本文所述示例代码并不完整,如需获取全部源码,欢迎联系b体育·(sports)公司技术支持。
成都b体育·(sports)有限公司 028-8618 0660