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电路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop的Mapreduce中Map
- 下一篇: 日常生活小技巧 -- win10造字