摘 要:電子萬年歷是集時間、日期、星期和溫度功能于一身,讀取直觀方便,市場發展前景廣闊的一個實用系統。本系統利用STM32內部RTC實時時鐘模塊,通過相應的軟件配置和算法設計,實現電子萬年歷的功能,可以在LCD12864顯示屏上實時顯示當前的年、月、日、時、分、秒、星期等信息,具有閏年補償功能,硬件實現簡單,界面友好,系統可靠程度高。本系統就是利用這個模塊,配合LCD12864顯示屏幕,來實時顯示當前時間。下面從理論分析、硬件電路、軟件設計等幾個方面分別說明。
關鍵詞:時鐘電路 萬年歷 STM32 LCD12864
中圖分類號:TN873 文獻標識碼:A 文章編號:1672-3791(2015)01(a)-0000-00
作者簡介:劉磊(1993-),男,漢族,河北蔚縣人,學歷:本科,研究方向:電氣工程及其自動化。
1 理論分析
RTC主要由兩部分組成。第一部分一是與APB1總線相連的APB1接口,它由APB1總線時鐘驅動,主要用于用戶通過APB1總線對其進行讀寫操作。第二部分是一組可編程計數器,它又由RTC預分頻模塊和RTC可編程計數模塊組成,前者用于產生1秒時間基準,后者主要用于初始化當前時鐘時間和進行時鐘計數。RTC內核完全獨立于APB1接口,軟件可以通過APB1接口來訪問預分頻值和時鐘計數器值。
要實現萬年歷功能,必須對RTC的寄存器進行相應的配置。RTC的控制寄存器有兩個,分別為RTC_CRH和RTC_CRL。對RTC_CRH的最低位置1可以允許秒中斷,這也是我們系統所需要的。在RTC_CRL中,位5到位0是有效位,分別是關于RTC關閉、配置標志、寄存器同步標志、溢出標志、鬧鐘標志和秒標志的設置。這其中也有些是需要我們注意的,比如位5為RTC操作位,該位只能由硬件操作,軟件只讀,在進行完一次RTC操作后,必須判斷該位來確定操作是否完成,若未完成,進行等待。RTC的預分頻裝載寄存器也是十分重要的寄存器之一,由RTC_PRLH和RTC_PRLL組成,主要用來配置RTC的分頻數。RTC最重要的寄存器是計數寄存器RTC_CNT,由兩個16位寄存器組成用來進行秒鐘的計數,最大計數值折合成年大概為136年。在修改RTC_CNT時需要進入配置模式。
2 硬件電路
STM32最小系統需要搭建好兩個晶振模塊,分別為32768HZ的低速晶振和8MMZ的高速晶振。然后接入復位電路,用于實現系統的復位功能。最后接入JTAG電路,就可以進行程序的下載和硬件仿真了。
LCD12864液晶顯示屏可以顯示較多的漢字和字符,程序簡單,支持串行和并行通信。在本設計中由于IO口的使用并不是很緊張,故選擇八位并行通信方式。在硬件連接方面需要注意,將顯示屏的DB0-DB7與單片機定義的八位數據口相連,并將RS、RW、EN與單片機定義的相應控制端口相連,最后根據液晶的說明書正確連接電源和背光引腳。
3 軟件設計
軟件方面首先要對STM32的RTC進行相關配置。第一步,使能電源時鐘和備份區域的時鐘,這樣這些區域才能開始正常工作。第二步,要取消備份區域的寫保護,方便對備份區域的數據進行讀寫。同時要標記時鐘已經經過配置,避免每次復位之后需要重新配置時鐘。第三步,使能外部低速振蕩器并為RTC選擇時鐘源,為萬年歷的運行提供基本的時鐘信號。第四步,使能RTC并進行相關的配置,主要包括分頻、RTC的允許配置位、更新配置和設置中斷等。這些配置為RTC按我們的需求工作提供了基礎。第五步也是十分重要的一步,編寫中斷服務函數,在中斷中需要讀出當前的時間值實現時間的實時刷新。
在程序設計方面有幾個重要的函數。首先是time_set函數,這個函數主要功能是以軟件的方式設定一個時間的起始值,也相當于現實生活中的時鐘校準。time_set函數有六個參數分別為year、month、day、hour、min、sec,用來表示用戶欲設定的年、月、日、時、分、秒,返回值為0表示設置失敗,1表示設置成功。程序算法是:若設置年份大于1970年,則將該年份減去1970再乘以一年時間對應的秒數存入某一變量,若設置月份大于1月,則將該月份減去1月乘以一月對應的秒數存入另一變量,依次類推,最后將每一個參數對應的變量相加即得到當前時間相對于1970年1月1日0時0分0秒所走過的秒數。最后將這個秒數寫入到RTC的RTC_CNT寄存器中,作為計數初值。當然在程序中也要對閏年和閏年的2月做特殊處理,不再贅述。
還有一個重要的函數是time_get函數,這個函數的主要功能是將計數器中的值讀出來并轉化為當前的時間,類似于time_set函數的逆過程。首先要將RTC_CNT寄存器中的值存入變量,用這個變量進行關于時間換算的計算。并且我們要定義一個結構體calendar來存放轉換完成后的各個變量的值。換算的方法也是簡單的數學問題,用取商和取余運算就可以得到秒數對應的年、月、日等變量的值。
對于中斷服務函數的處理也很簡單,只需要判斷標志位來確定產生的中斷是不是我們需要的秒中斷,若是則調用time_get函數刷新當前時間。
在主函數中首先要注意的是各個模塊的初始化,包括STM32系統、RTC模塊和LCD12864顯示模塊等。由于沒有外擴鍵盤,所以在下載程序時候需要進行一次時間的校準,即手動更改time_set函數的參數值。然后程序便可以進入while(1)死循環,在循環中不斷執行LCD顯示程序,因為時間是在中斷中刷新,故LCD12864也可以實時顯示當前時間,達到萬年歷的效果。
4 結論
本系統硬件電路簡單,成本低,性價比高,以軟件的方式充分利用STM32片上資源實現了萬年歷的功能,能精確顯示當前時間,系統可靠性高。
參考文獻
[1] 滕振芳,張昆.基于單片機的電子萬年歷的設計.價值工程.2010(6)056.
[2] 何乃味.基于LED點陣顯示的電子萬年歷的設計與實現.安徽電子信息職業技術學院學報.2014(1)19