ds1302模块 树莓派_(16)给树莓派B+ 安装一个实时时钟芯片DS1302
在這里首先感謝glgoo在google被墻的情況下提供搜索功能,還要感謝
http://wiringpi.com/?以及github,盡管自己眼瞎,幾經波折還是發現了塵封已久的少林“七十二絕技”,沒錯,每種絕技都能克制一個樹莓派GPIO控制外設的問題,七十二絕技的核心就是wiringpi這個為Pi GPIO寫的C語言庫了,而每種絕技則暗藏在wiringPi/examples/目錄下,這里就不一一羅列了,大家想學什么招式,就去看每個example,都非常簡短。
其實早在第9篇文章“安裝GPIO庫”,就已經下載并安裝了wiringPi,然而后來一直沒用C,而用的是python,python的便捷性、交互式開發使得調試非常方便,直到這一次準備安裝一個DS1302時鐘芯片時,苦于搜不到相關的解決方案,才最終轉回C庫。然而可能會陷入rtc-pi這個C程序來驅動DS1302,這里面并沒有用wiringPi的封裝,二是直接和交互了,像我這種菜鳥,暫時不會改里面的地址,外文網站上又寫的不清楚。好在最終還是搜到了github里面的ds1302.c,定睛一看原來是在wiringPi項目的examples里,頓時心中千萬頭草泥馬呼嘯而過。
暫時不必著急看ds1302.c源碼,因為,它相當簡單,把自己的線路連接好,引腳編號對應修改就大功告成,然后再仔細品讀源碼不遲。
DS1302時鐘模塊的5個引腳分別是VCC、GND、CLK、DAT、RST,都是有意義的,可以在樹莓派B+上面找到類似的引腳如SCLK、SDA、CE,我們就用這幾個類似的GPIO引腳來和DS1302連接,如下圖:
這里我們要注意這幾個引腳對應的wPi的編號,而不是BOARD編號,對應關系如下:
BOARD - NAME - DS1302 - wPi
1 ? ? ? ? - 3.3V ? - VCC ? ? ?- 無
23 ? ? ? - SCLK ? - CLK ? ? ?- 14
25 ? ? ? - 0V ? ? ?- GND ? ? ?- 無
27 ? ? ? - SDA.0 - DAT ? ? ?- 30
24 ? ? ? - CE0 ? ?- RST ? ? ?- 10
所以,我們只需要用14、30、10這幾個GPIO引腳來編程就可以了。
現在,可以打開wiringPi/examples/ds1302.c文件,它里面包含了wiring/devLib/下的ds1302.h,隱藏了具體的實現細節,可以先不關注。直接看main函數:
需要用到的函數就是畫紅線的幾個,首先調用ds1302setup(int clockPin, int dataPin, int csPin)來設置樹莓派GPIO引腳,參數修改成14、30、10即可。setLinuxClock()設置系統的時間,setDSclock()則是根據系統時間設置DS模塊的時間,ramTest對DS模塊的RAM進行測試,ds1302clockRead()從DS模塊讀出時間,細節處理函數這里略過。現在在examples目錄下make ds1302,成功后即可使用ds1302了。
使用方法:
1)./ds1302 -rtest,測試DS1032的RAM,如果引腳連接錯誤GPIO設置錯誤則會報錯:
成功則會顯示OK:
2)./ds1302 -sdsc,會調用setDSclock(),將DS模塊設置成系統的時間,在這之前需要把自己的時區設置成本地時區cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime,并且同步網絡時間ntpdate cn.pool.ntp.org
3)現在可以從DS模塊讀取時間
一段時間后再讀一次:
看樣子DS模塊已經保存了系統時間。
4)./ds1302 -slc,從DS模塊讀取時間來設置系統的時間
結果設置成了比本地時間慢8個小時,正好是UTC時間。
修改ds1302.c源文件,找到setDSclocl()函數,其中調用了time()來獲取系統時間,而time()函數返回的是從UTC(Coordinated Universal Time)時間1970年1月1日00:00:00(稱為UNIX系統的Epoch時間)到當前時刻的秒數,要想從該秒數轉換成本地時間需要用localtime()函數struct tm *localtime(const time_t *clock),最后修改成如下:
刪除原來的ds1302.o和ds1302,重新make ds1302。
重新執行ntpdate cn.pool.ntp.org同步網絡時間,然后./ds1302 -sdsc設置DS模塊的時間為本地時間,再執行./ds1302查看時鐘模塊的時間,這時應該就顯示正確了。
5)cp ./ds1302 /usr/bin/下,并添加開機啟動項
Arch下面用的是systemctl,所以需要將/usr/bin/ds1302 -slc命令加到一個service中,我是添加在了網卡啟動服務中。
重啟后,時間正確,則說明我們的時鐘模塊安裝成功了。
注:本文中的代碼可以通過下載wiring庫然后自行修改examples/ds1302.c,也可以從我的github下載:https://github.com/hustlbj/raspberry
總結
以上是生活随笔為你收集整理的ds1302模块 树莓派_(16)给树莓派B+ 安装一个实时时钟芯片DS1302的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nacos oaut服务地址_sprin
- 下一篇: solve函数c语言_数值计算方法编程作