Hi3516A开发--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 <reg> <val>'
-r(read) Read RTC register, e.g '-r <reg>'
-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 <val>'
-m(mode) Mode of temperature gather, e.g '-m <mode> <temp>, mode[0-2]'
1、设置获取时间
通过如下命令可设置 RTC 时间:
./test –s time <year/month/day/hour/minute/second>
通过如下命令可获取 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 <year/month/day/hour/minute/second>
通过如下命令可获取 RTC 闹钟时间:
./test –g alarm
通过如下命令设置闹钟到期是否产生中断,驱动中断例程由用户根据需求自由补充。
./test –a ON/OFF
3、读取、设置 RTC 内部寄存器
通过如下命令可读取 RTC 内部寄存器,此功能多用于辅助调试,比如读取内部温度传感器采集的温度值,读取设置的 RTC 更新温度值等。
./test –r <reg>
通过如下命令可设置 RTC 内部寄存器,此功能多用于辅助调试。
./test –w <reg> <value>
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 <val>
<val>值为将要设置的分频系数的 10000 倍,例如要设置分频系数为 327.60,则val=3276000。通过直接敲“ ./test –f”命令可以查看当前分频系数。分频系数可以配置范围为: 327.60~327.70。
说明:
频率系数仅在固定分频模式下设置,设置流程为:关闭温度补偿,然后设置分频系数(也可以采用默认值)。
7、设置温度采集方式
通过如下命令可设置温度采集方式:
./test –m <mode> <value>
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 <stdio.h>
#include <stdlib.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <time.h> 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 <device> select rtc device (rtc0|rtc1|...)
-n, --dry-run does everything, but suspend
-l, --local RTC uses local timezone
-m, --mode <mode> standby|mem|... sleep mode
-s, --seconds <seconds> seconds to sleep
-t, --time <time_t> 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进行调整。
Hi3516A开发--RTC电路相关推荐
- STM32开发 -- RTC详解
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81409693 RTC实时时钟部分,之前也是有讲到过的. Hi3516A开发– ...
- Hi3516A开发--视频输入和输出接口
海思hi3516A芯片的开发板,接口类型多样,有hdmi.sdi.cvbs.cmos的输入类型. 参看于:海图电子--Hi3516A开发板 一.hi3516A HDMI 编码板接口如下: 硬件接口: ...
- Hi3516A开发-- OSD功能实现
如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/79075800 网上相关功能实现资料有很多,关键操作:海思osd+freety ...
- Hi3516A开发-- UBI 文件系统使用指南
这篇文章在 Hi3516A V100R001C01SPC050\02.Only for Reference\02.software\documents_cn\UBI 文件系统使用指南.pdf 拿出来只 ...
- Hi3516A开发-- 板卡串口烧写
uboot使用loady命令进行串口传输 新改版的板卡,网络无法使用,uboot可以起来,但是内核和文件系统镜像,没法烧写. 在无网络的情况下,SecureCRT使用loady命令进行串口传输,烧写内 ...
- Hi3516A开发--编译内核、uboot
操作之前先安装必要的软件: 参看:Hi3516A开发--编译整个osdrv目录所遇到的问题总结 首先SDK安装 拷贝Hi3516A_SDK_V1.0.5.0.tgz至Linux下 #tar -zxvf ...
- RTC电路锂电池耗电过快的问题
最近解决了一个其他项目的问题,现象如下 : 有一个RTC电路,RTC芯片是X1226,很常用的芯片.供电是通过系统3.3V和电池CR1220来供电,电池耗电很快,远远达不到设计要求.整个系统供电电路如 ...
- python电力系统分析_ESP32-S2-Saola-1开发板电路分析
ESP32-S2-Saola-1开发板电路分析 [复制链接] 本帖最后由 dcexpert 于 2020-7-3 14:52 编辑 在开始使用前,对开发板的电路进行简单的分析,这样有助于使用.开发板的 ...
- Hi3516A开发-- 常见问题FAQs
一.查看MPP日志信息 目前日志分为 7 个等级,默认设置为等级 3.等级设置的越高,表示记录到日志中的信息量就越多,当等级为 7 时,系统的整个运行状态实时的被记录到日志中,此时的信息量非常庞大,会 ...
最新文章
- [SharePoint 2010] Configuration SMTP for SharePoint 2010
- xmlHttpRequest避免缓存的办法
- android 手机图库获取sd卡图片,关于Android读取不同位置(drawable,asset,SDCard)的图片资源的总结...
- windows如何清理无效注册表?如何重装python,如何彻底清理python
- IT人员加班处于恐惧之中
- 习题6-5 使用函数验证哥德巴赫猜想 (20 分)
- 前端学习(3031):vue+element今日头条管理-暂时当前登录用户信息
- “约见”面试官系列之常见面试题第二十篇之vuex得理解(建议收藏)
- 汇编中各寄存器的作用(16位CPU14个,32位CPU16个)和 x86汇编指令集大全(带注释)
- python List中元素两两组合
- Spring中父子容器的实现实例
- Odoo10参考系列--翻译模块
- SoPlus回顾 | 行业大咖论道AI,探讨未来行业发展趋势
- Java线程基础(二)
- 使用GIT来管理代码的心得
- 手机怎么把游戏隐藏在计算机里,怎么把手机游戏投屏到电脑?
- mysql 怎么存储毫秒,MySQL存储毫秒数据的方法
- POI excel行内换行
- 20000字干货,数据分析 Pandas 75个高频操作都在这儿了!
- Java操作redis遇到的问题