热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hi3516A开发--RTC电路

一、概述1、RTC芯片分类常见的RTC芯片,大致可分为三类:非集成RTC:只有RTC计时电路,不集成晶体、不集成温度补偿电路。这类芯片的计时精度主要取决于外接
一、概述
1、RTC 芯片分类

常见的 RTC 芯片,大致可分为三类:
非集成 RTC: 只有 RTC 计时电路,不集成晶体、不集成温度补偿电路。这类芯片的计时精度主要取决于外接晶体的精度,而且受温度影响较大。通常在室温环境下,计时精度较高;随着温度升高或降低,计时偏差逐渐增大。
集成晶体的 RTC: 将 RTC 计时电路与晶体集成,但没有温度补偿电路。这类芯片在室温环境下,计时精度更高。但仍然无法消除温度的影响。
集成 RTC: 将 RTC 计时电路、晶体、温度补偿电路(含温度传感器)都集成在一颗芯片中,出厂时进行调教。这类 RTC 的计时精度可以做到很高,且由于温补电路的作用,受环境温度的影响很小。
2 RTC 工作模式
Hi3516A/HI3518EV200 内置 RTC 可支持两种工作模式:
固定分频模式
    与非集成 RTC 相同, Hi3516A/HI3518EV200 内置 RTC 的时钟直接采用外部晶体与振荡电路产生的经过分频后的时钟,工作时分频比固定不变。这种工作模式下, RTC 计时精度取决于外接晶体的频率精度,而且受环境温度影响。在非集成RTC 这类芯片适用的场景,可以选择 Hi3516A/HI3518EV200 内置 RTC 替代外置非集成 RTC,节省一些器件成本。
温度补偿模式
    Hi3516A/HI3518EV200 内置了 RTC 计时电路,及温度补偿电路(含温度传感器),可校正因温度变化引起的计时偏差。但由于温度传感器集成在了Hi3516A/HI3518EV200 内部,并不能真实反应外接晶体的实际温度,实际校正效果不是很理想。对计时精度有严格要求的客户,建议选择集成晶体的 RTC,或者带有温度补偿的RTC。

上面的讲述让我明白了,为什么有些芯片内置有RTC,电路还需要外接集成晶体的RTC。

二、RTC 的硬件参考电路

1、硬件参考电路


2、选择晶体

Hi3516A/HI3518EV200 芯片中的晶体振荡电路针对 CL=12.5pF 的晶体设计,且在32.768K 晶体市场中,CL=12.5pF 的晶体为市场主流,请选用此规格晶体。

这里有几个疑问,为什么采用32.768K晶体,12pF晶体的选择和电容的选择?

1)为什么采用32.768K晶体

首先明确下,有源为晶振,无源为晶体。(该处的“源”为电源)

32.768KHZ的时钟晶振产生的振荡信号经过石英钟内部分频器进行15次分频后得到1HZ秒信号,即秒针每秒钟走一下,石英钟内部分频器只能进行15 次分频,要是换成别的频率的晶振,15次分频后就不是1HZ的秒信号,时钟就不准了。32.768K=32768=2的15次方,数据转换比较方便、精确。

简单来说就是:32768 Hz = 2^15  即分频15次后为1Hz,周期 = 1s

2)12pF晶体的选择

我们采用晶体为:SSP-T7-F  (表贴的)


市面上还有如下直插的晶体:VT-150-F/VT-200-F (小的6pF、大的12pF)


3)负载电容的选择

晶体对负载电容有着严格的规定,只有实际负载电容和晶体的 SPEC 中的负载电容一致时,晶体频率才能达到标称频率。

电容之间有以下关系:

CL = Cn + (C0 * C1) / (C0 + C1),

其中Cn为单板走线电容(约为1~2pF),C0和C1为晶体串联电容,CL为晶体电容;晶体和电容匹配是保证RTC精度的前提,电容过大则晶体输出频率偏小,电容过小则晶体输出频率过大;电容过小还可能会引起倍频情况,故电容需要选与晶体匹配的。

根据上面关系可得:

12.5pF的32.768K晶体要外挂2个22pF的串联电容。

6pF的32.768K晶体要外挂2个10pF的串联电容。

4)RTC芯片外接晶体选择

以常用的DS1302和DS1339来说,一般芯片手册上都有说明。



三、RTC驱动使用

RTC驱动所在位置/drv/rtc目录


将 hi_rtc.ko 拷贝到单板,并执行如下命令插入驱动模块:
insmod hi_rtc.ko t_secOnd=T
其中 t_second 模块参数表征温度采集的时间间隔,以秒为单位,驱动默认为 5s。如不必修改,则无需传入模块参数。若使用固定分频模式,直接使用 insmod hi_rtc.ko 命令插入 ko 即可,无需传入参数。

执行./test:

# ./test 
Usage: ./test [options] [parameter1] ...
Options: 
        -s(set)         Set time/alarm,     e.g '-s time 2012/7/15/13/37/59'
        -g(get)         Get time/alarm,     e.g '-g alarm'
        -w(write)       Write RTC register, e.g '-w '
        -r(read)                Read RTC register,  e.g '-r '
        -a(alarm)       Alarm ON/OFF',      e.g '-a ON'
        -reset          RTC reset
        -c(compensation) temperature compensation ON/OFF, eg '-c ON'
        -f(frequency)    frequency precise adjustment, eg '-f '
        -m(mode)        Mode of temperature gather, e.g '-m , mode[0-2]'


1、设置获取时间
通过如下命令可设置 RTC 时间:
./test –s time
通过如下命令可获取 RTC 时间:
./test –g time

# ./test -g time
[RTC_RD_TIME]
Current time value: 
year 1970
month 1
date 1
hour 0
minute 0
second 0
weekday 4

2、设置获取闹钟时间
通过如下命令可设置 RTC 闹钟时间:
./test –s alarm
通过如下命令可获取 RTC 闹钟时间:
./test –g alarm
通过如下命令设置闹钟到期是否产生中断,驱动中断例程由用户根据需求自由补充。
./test –a ON/OFF

3、读取、设置 RTC 内部寄存器
通过如下命令可读取 RTC 内部寄存器,此功能多用于辅助调试,比如读取内部温度传感器采集的温度值,读取设置的 RTC 更新温度值等。
./test –r
通过如下命令可设置 RTC 内部寄存器,此功能多用于辅助调试。
./test –w
reg 取值,请参见《 Hi3518EV20X/Hi3516CV200 经济型 HD IP Camera Soc 用户指南.pdf》 3.10 节实时时钟部分。

4、复位 RTC 模块
通过如下命令可复位 RTC 模块。
./test –reset

5、温度补偿模式开关
通过如下命令可设置温度补偿模式是否打开。 ON 表示打开 RTC 温度补偿, OFF 表示关闭温度补偿而采用固定分频模式。若单板复位重启,或者单板带有电池断电重启,重插 ko 后系统将运行在固定分频模式。若用户使用的是温度补偿模式,在重插 ko 后需要重新打开温度补偿模式。
./test –c ON/OFF

6、固定分频模式分频系数微调设置
通过如下命令可设置分频系数从而达到调整时钟的快慢效果。 
./test -f
值为将要设置的分频系数的 10000 倍,例如要设置分频系数为 327.60,则val=3276000。通过直接敲“ ./test –f”命令可以查看当前分频系数。分频系数可以配置范围为: 327.60~327.70。

说明:

频率系数仅在固定分频模式下设置,设置流程为:关闭温度补偿,然后设置分频系数(也可以采用默认值)。

7、设置温度采集方式
通过如下命令可设置温度采集方式:
./test –m
Mode 和 value 取值如表 5-1 所示。


说明:

温度采集方式设置仅在温度补偿模式下设置。设置流程为:打开温度补偿,然后设置温度采集方式。


扩展:

该板没有外接集成晶体RTC,没有/dev/rtc驱动,否则也可如下操作:

参看:RTC驱动修改

查看时间
输入命令:date
设置日期和时间
输入命令:date -s "2013-11-02 16:13:30"
将时间写入时钟芯片
输入命令:hwclock -w
输入命令:reboot
系统重启后
输入命令:date
时间为刚才设置的值,测试OK!

四、linux 读写RTC时间

#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include   
  
  
int main(void)  
{  
        int fd, retval;  
        struct rtc_time rtc_tm;  
        time_t timep;  
        struct tm *p;  
  
        fd = open("/dev/rtc", O_RDONLY);  
        if (fd == -1) {  
                perror("/dev/rtc");  
                exit(errno);  
        }  
  
        /* Read the RTC time/date */  
        retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);  
        if (retval == -1) {  
                perror("ioctl");  
                exit(errno);  
        }  
        close(fd);  
  
        fprintf(stderr, "RTC date/time: %d/%d/%d %02d:%02d:%02d\n",  
                rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900,  
                rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);  
  
        time(&timep);  
        p = gmtime(&timep);  
        fprintf(stderr, "OS date/time(UTC): %d/%d/%d %02d:%02d:%02d\n",  
                p->tm_mday, p->tm_mon + 1, p->tm_year + 1900,  
                p->tm_hour, p->tm_min, p->tm_sec);  
          
        p = localtime(&timep);  
        fprintf(stderr, "OS date/time(Local): %d/%d/%d %02d:%02d:%02d\n",  
                p->tm_mday, p->tm_mon + 1, p->tm_year + 1900,  
                p->tm_hour, p->tm_min, p->tm_sec);  
    
        return 0;  
}  

执行结果:
root@dm368-evm:~/test# ./a.out 
RTC date/time: 24/1/2016 09:46:01
OS date/time(UTC): 24/1/2016 01:46:01
OS date/time(Local): 24/1/2016 09:46:01

五、利用rtcwake唤醒设备

参看:Linux 下利用rtcwake唤醒设备

where is rtcwake
rtcwake: /usr/sbin/rtcwake /usr/share/man/man8/rtcwake.8.gz
rtcwake --help
Usage:
 rtcwake [options]
Options:
 -d, --device    select rtc device (rtc0|rtc1|...)
 -n, --dry-run            does everything, but suspend
 -l, --local              RTC uses local timezone
 -m, --mode        standby|mem|... sleep mode
 -s, --seconds  seconds to sleep
 -t, --time      time to wake
 -u, --utc                RTC uses UTC
 -v, --verbose            verbose messages

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see rtcwake(8).
 standby
普通待机模式,为默认选项,对应ACPI  state S1
 mem
待机到内存,即内存之外把其他设备都进入低功耗模式,对应ACPI state S3
 disk
待机到硬盘,即休眠,把电脑的当前状态保存到硬盘,几乎不消耗外部电源,对应ACPI state S4
off 
通过调用系统的关机命令来休眠, 对应ACPI state S5

可以通过以下命令查阅当前系统支持的休眠模式
cat /sys/power/state
standby mem disk

我的电脑目前支持以上三种,但是测试发现休眠到disk的时候,机器会迅速醒来,standby和mem两种模式则工作正常,个中原因还不清楚。

执行该命令的时候需要root权限
1. 系统休眠后20seconds唤醒,加-v选项可以看到更多的打印信息
sudo rtcwake -v -s 20 -m mem 或
sudo rtcwake -v -s 20 -m standby
打印信息:
rtcwake -v -s 20 -m mem
Using UTC time.
delta   = 0
tzone   = 0
tzname  = UTC
systime = 1393296617, (UTC) Tue Feb 25 02:50:17 2014
rtctime = 1393296617, (UTC) Tue Feb 25 02:50:17 2014
alarm 0, sys_time 1393296617, rtc_time 1393296617, seconds 20
rtcwake: wakeup from "mem" using /dev/rtc0 at Tue Feb 25 02:50:38 2014
suspend mode: mem; suspending system

2. 系统在指定的时间醒来
rtcwake -v -t `date -d 10:53 +%s` -m mem
Using UTC time.
delta   = 0
tzone   = 0
tzname  = UTC
systime = 1393296754, (UTC) Tue Feb 25 02:52:34 2014
rtctime = 1393296754, (UTC) Tue Feb 25 02:52:34 2014
alarm 1393296780, sys_time 1393296754, rtc_time 1393296754, seconds 0
rtcwake: wakeup from "mem" using /dev/rtc0 at Tue Feb 25 02:53:00 2014
suspend mode: mem; suspending system

rtcwake -v -t `date -d 10:54 +%s` -m standby
Using UTC time.
delta   = 0
tzone   = 0
tzname  = UTC
systime = 1393296794, (UTC) Tue Feb 25 02:53:14 2014
rtctime = 1393296794, (UTC) Tue Feb 25 02:53:14 2014
alarm 1393296840, sys_time 1393296794, rtc_time 1393296794, seconds 0
rtcwake: wakeup from "standby" using /dev/rtc0 at Tue Feb 25 02:54:00 2014
suspend mode: standby; suspending system

如果发现systime 和rtctime时间不一致,需要利用hwclock进行调整。


推荐阅读
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • ihaveusedthedelphidatabindingwizardwithmyxmlfile,andeverythingcompilesandrunsfine. ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在"Debian上安装Docker",其他平台在"这里查 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • x86 linux的进程调度,x86体系结构下Linux2.6.26的进程调度和切换
    进程调度相关数据结构task_structtask_struct是进程在内核中对应的数据结构,它标识了进程的状态等各项信息。其中有一项thread_struct结构的 ... [详细]
  • 我无法续订几天前过期的RHELDeveloper帐户订阅。我执行了以下步骤,但是,订 ... [详细]
author-avatar
隐姓埋名er
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有