周立功教授新書《面向AMetal框架與接口的編程(上)》,對AMetal框架進行了詳細介紹,通過閱讀這本書,你可以學到高度復用的軟件設計原則和面向接口編程的開發思想,聚焦自己的“核心域”,改變自己的編程思維,實現企業和個人的共同進步。經周立功教授授權,即日起,致遠電子公眾號將對該書內容進行連載,愿共勉之。
第六章為重用外設驅動代碼,本文內容包含6.3 RTC 實時時鐘中的后兩個小節:
6.3.6 RX8025T
6.3.7 DS1302
6.3 RTC 實時時鐘
>>> 6.3.6 RX8025T
在MicroPort 系列擴展模塊中,除主芯片為PCF85063 的RTC 模塊外,還有RX8025T模塊和DS1302 模塊,它們都是RTC 擴展模塊,其主要區別詳見表6.14。
表6.14 RTC 芯片對比
表中,“√”表示對應器件支持該功能,“×”表示對應器件不支持該功能。
1. 器件簡介
RX8025T 是一款內置高穩定度的32.768KHz 的 DTCXO(數字溫度補償晶體振蕩器)的I2C總線接口方式的實時時鐘芯片,它提供了時間日期的設置與獲取、鬧鐘中斷、時間更新中斷、固定周期中斷、溫度補償等功能。所有地址和數據通過I2C總線來傳輸,最大總線速率可達到400kbps。
RX8025T 引腳封裝詳見圖6.6,其中的SCL 和SDA 為I2C接口引腳,VDD 和VSS 分別為電源和地;CLKOUT 為時鐘輸出引腳,可用于輸出時鐘信號;T1(CE)、TEST、T2(Vpp)引腳僅供廠家測試使用,NC 為無需連接的引腳,實際使用時,這些引腳直接懸空即可;INT 為中斷引腳,主要用于鬧鐘等功能;CLK_EN 為時鐘輸出使能引腳, 用于控制CLKOUT 時鐘的輸出。
圖6.6 RX8025T 引腳定義
RX8025T 的7 位I2C從機地址為0x32,模塊原理圖詳見圖6.7。若將MicroPort-RX8025T模塊通過MicroPort 接口與AM824-Core 相連,則SCL 和SDA 分別與PIO0_16 和PIO0_18連接,INT 引腳與PIO0_1 連接,FOE 與PIO0_10 連接。
圖6.7 RX8025T 模塊電路
2. 器件初始化
在使用RX8025T 前,必須完成RX8025T 的初始化操作,以獲取對應的操作句柄,進而才能使用RX8025T 的各種功能,初始化函數(am_rx8025t.h)的原型為:
該函數意在獲取RX8025T 器件的實例句柄,其中,p_dev 為指向am_rx8025t_dev_t 類型實例的指針,p_devinfo 為指向am_rx8025t_devinfo_t 類型的實例信息的指針。
(1)實例
定義am_rx8025t_dev_t 類型(am_rx8025t.h)實例如下:
其中,g_rx8025t_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
(2)實例信息
實例信息主要描述了具體器件的固有信息,即RX8025T 的CLK_EN、INT 引腳與微處理器引腳的連接信息。其類型am_rx8025t_devinfo_t 的定義(am_rx8025t.h)如下:
當MicroPort-RX8025T 模塊通過MicroPort 接口與AM824-Core 相連時, INT和CLK_EN和分別與PIO0_1 和PIO0_10 連接。其實例信息定義如下:
其中,g_rx8025t_devinfo 為用戶自定義的實例信息,其地址作為p_devinfo 的實參傳遞。
(3)I2C句柄i2c_handle
以I2C1 為例,其實例初始化函數am_lpc82x_i2c1_inst_init ()的返回值將作為實參傳遞給i2c_handle。即:
(4)實例句柄
RX8025T 初始化函數am_rx8025t_init ()的返回值,作為實參傳遞給其它功能接口函數的第一個參數(handle)。am_rx8025t_handle_t 類型的定義(am_rx8025t.h)如下:
若返回值為NULL,說明初始化失敗;若返回值不為NULL,說明返回值handle 有效。
基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單6.39 和程序清單6.40。
程序清單6.71 實例初始化函數實現(am_hwconf_rx8025t.c)
程序清單6.72 實例初始化函數聲明(am_hwconf_rx8025t.h)
后續只需要使用無參數的實例初始化函數,即可獲取到RX8025T 的實例句柄。即:
3. 使用RTC 功能
使用RTC 功能即使用RTC 通用接口操作RX8025T 進行時間的設置和獲取,在使用RTC通用接口前,需要獲取一個am_rtc_handle_t 類型的RTC 句柄。RX8025T 的驅動提供了相應的接口用于獲取RX8025T 的RTC 句柄,以便用戶通過RTC 通用接口操作RX8025T,其函數原型為:
該函數意在獲取RTC 句柄,其中,RX8025T 實例的句柄(rx8025t_handle)作為實參傳遞給handle,p_rtc 為指向am_rtc_serv_t 類型實例的指針,無實例信息。定義am_rtc_serv_t類型(am_rtc.h)實例如下
其中,g_rx8025t_rtc 為用戶自定義的實例,其地址作為p_rtc 的實參傳遞。
基于模塊化編程思想,將初始化相關的實例定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件分別詳見程序清單6.73 和程序清單6.74。
程序清單6.73 新增RX8025T 的RTC 實例初始化函數(am_hwconf_rx8025t.c)
程序清單6.74 am_hwconf_rx8025t.h 文件內容更新(1)
后續只需要使用無參數的RTC 實例初始化函數,即可獲取RTC 實例句柄。即:
獲取到handle 后,由于基于RTC 通用接口編寫的應用程序是可以跨平臺復用的,因此可以直接基于RX8025T 啟動如程序清單6.45 所示的RTC 時間顯示應用程序,詳見程序清單6.75。
程序清單6.75 啟動RTC 應用程序(基于RX8025T)
顯然,若將RTC 模塊由PCF85063 更換為RX8025T,應用程序核心代碼無需修改。
4. 使用鬧鐘功能
使用鬧鐘功能即使用鬧鐘通用接口操作RX8025T。在使用鬧鐘通用接口前,需要獲取到一個am_alarm_clk_handle_t 類型的鬧鐘句柄。RX8025T 的驅動提供了相應的接口用于獲取RX8025T 的鬧鐘句柄,便于用戶通過鬧鐘通用接口操作RX8025T,其函數原型為:
該函數意在獲取鬧鐘句柄,其中,RX8025T 實例的句柄(rx8025t_handle)作為實參傳遞給handle,p_alarm_clk 為指向am_alarm_clk_serv_t 類型實例的指針,無實例信息。定義am_alarm_clk_serv_t 類型(am_alarm_clk.h)實例如下:
其中,g_rx8025t_alarm_clk 為用戶自定義的實例,其地址作為p_alarm_clk 的實參傳遞。
基于模塊化編程思想,將初始化相關的實例定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件分別詳見程序清單6.76 和程序清單6.77。
程序清單6.76 新增RX8025T 的鬧鐘實例初始化函數(am_hwconf_rx8025t.c)
程序清單6.77 am_hwconf_rx8025t.h 文件內容更新(2)
后續只需要使用無參數的鬧鐘實例初始化函數,即可獲取鬧鐘實例句柄。即:
獲取到handle 后,由于基于鬧鐘通用接口編寫的應用程序是可以跨平臺復用的,因此可以直接基于RX8025T 啟動如程序清單6.54 所示的鬧鐘測試應用程序,詳見程序清單6.78。
程序清單6.78 啟動鬧鐘測試應用程序(基于RX8025T)
顯然,若將RTC 模塊由PCF85063 更換為RX8025T,鬧鐘應用程序核心代碼無需修改。
5. 為系統時間提供RTC 服務
若需要使用RX8025T 為系統時間提供RTC 服務,只需要在初始化系統時間時,將從RX8025T 中獲取的RTC 句柄作為系統時間初始化函數的rtc_handle 參數。即:
為方便使用,將初始化函數的調用添加到配置文件中,通過頭文件引出系統時間的實例初始化函數接口,詳見程序清單6.79 和程序清單6.80。
程序清單6.79 RX8025T 用作系統時間的實例初始化(am_hwconf_rx8025t.c)
程序清單6.80 am_hwconf_rx8025t.h 文件內容更新(3)
后續只需要簡單的調用該無參函數,即可完成系統時間的初始化。即:
系統時間初始化后,由于基于系統時間通用接口編寫的應用程序是可以跨平臺復用的,因此可以直接基于RX8025T 啟動如程序清單6.65 所示的系統時間測試應用程序,詳見程序清單6.81。
程序清單6.81 啟動系統時間測試應用程序(基于RX8025T)
顯然,若將RTC 模塊由PCF85063 更換為RX8025T,使用系統時間的應用程序無需修改。
6. 特殊功能控制接口
對于RX8025T,除典型的時鐘和鬧鐘功能外,還具有一些特殊功能,比如,定時器、時鐘輸出、1 字節RAM 等。這些功能由于不是通用功能,只能使用RX8025T 相應的接口進行操作。以讀寫1 字節RAM 為例,其相應的接口函數詳見表6.15。
表6.15 讀寫RAM 接口函數(am_rx8025t.h)
(1)寫入RAM
該函數用于寫入1 字節數據到RX8025T 的RAM 中,其函數原型為:
其中,handle 為RX8025T 實例句柄,data 為寫入的單字節數據。若返回AM_OK,表示數據寫入成功,反之失敗,寫入0x55 至RAM 中的范例程序詳見程序清單6.82。
程序清單6.82 寫入RAM 范例程序
(2)讀取RAM
該函數用于讀取存于RX8025T 的單字節RAM 中的數據,其函數原型為:
其中,handle 為RX8025T 實例句柄,p_data 為輸出參數,用于返回讀取的單字節數據。
返回AM_OK,表示讀取成功,反之失敗,范例程序詳見程序清單6.83。
程序清單6.83 讀取RAM 范例程序
可以使用讀寫RAM 接口簡單驗證RX8025T 是否正常,詳見程序清單6.84。
程序清單6.84 讀寫RAM 數據范例程序
若讀寫數據出錯,則點亮LED0。由此可見,雖然該程序的邏輯與程序清單6.70 所示的應用程序基本一致,但由于使用的接口是特殊功能控制接口,與具體芯片相關,因此并不能直接像RTC 應用程序和鬧鐘應用程序那樣直接跨平臺復用。
>>> 6.3.7 DS1302
1. 器件簡介
DS1302 是一款涓流充電計時芯片,它包含一個實時時鐘和31 字節的靜態 RAM,能夠提供年、月、日、時、分、秒等信息,具有閏年校正功能。
DS1302 被設計工作在非常低的電能下,在低于1μW 時還能保持數據和時鐘信息。除了基本計時功能以外,DS1302 還具有其它一些特點,比如,雙管腳主電源和備用電源,可編程涓流充電器VCC1。
DS1302 通過簡單的串行接口與微處理器通訊,使用同步串行通訊簡化了 DS1302 與微處理器的接口,通訊只需要三根線:CE、I/O(數據線)、SCLK(串行時鐘)。DS1302 的引腳封裝圖詳見圖6.8。
圖6.8 DS1302 引腳定義
其中,X1 和X2 為外接晶振的引腳,需要連接標準的32.768kHz 的石英晶體。SCLK、CE、I/O 為與微處理器的串行通信引腳。GND 為電源地,VCC1 和VCC2為電源引腳,這也是DS1302 具有特色的地方,即:雙管腳主電源和備用電源,在雙管腳中,VCC2 是主電源,VCC1 是備用電源,一般接充電電池。DS1302 是由VCC1 或VCC2 兩者中的較大者供電。當VCC2 大于VCC1+0.2V,VCC2 給芯片供電。當VCC2 小于VCC1 時,芯片由VCC1 供電。當芯片由VCC2 供電時,VCC1 不供電,同時,還可以通過可編程涓流充電器,使VCC2 向VCC1 流入很小的電流,以便為連接到VCC1 的電池充電。當然,VCC1可以不接可充電電池,此時,只需要通過控制可編程涓流充電器,使VCC2 不向VCC1 流入電流即可。
DS1032 模塊的原理圖詳見圖6.9,若將MicroPort-DS1302 模塊通過MicroPort 接口AM824-Core 相連,則SCLK、I/O 和CE 分別與PIO0_15、PIO0_13 和PIO0_14 連接。
圖6.9 DS1302 模塊電路
2. 器件初始化
在使用DS1302 前,必須完成DS1302 的初始化操作,以獲取對應的操作句柄,進而才能使用DS1302 的各種功能,初始化函數的原型(am_ds1302.h)為:
該函數意在獲取DS1302 器件的實例句柄,其中,p_dev 為指向am_ds1302_gpio_dev_t類型實例的指針,p_devinfo 為指向am_ds1302_gpio_devinfo_t 類型的實例信息的指針。
(1)實例
定義am_ds1302_gpio_dev_t 類型(am_ds1302.h)實例如下:
其中,g_ds1302_gpio_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
(2)實例信息
實例信息主要描述了具體器件的固有信息,即DS1302 的SCLK、I/O、CE 引腳與微處理器引腳的連接信息。其類型am_ds1302_gpio_devinfo_t 的定義(am_ds1302.h)如下:
當MicroPort-DS1302 模塊通過MicroPort 接口與AM824-Core 相連時, SCLK、I/O 和CE 分別與PIO0_15、PIO0_13 和PIO0_14 連接。其實例信息定義如下:
其中,g_ds1302_gpio_devinfo 為用戶自定義的實例信息,其地址作為p_devinfo 的實參傳遞。
(3)實例句柄
DS1302 的初始化函數am_ds1302_gpio_init()的返回值,作為實參傳遞給其它功能接口函數的第一個參數(handle)。am_ds1302_handle_t 類型的定義(am_ds1302.h)如下:
若返回值為NULL,說明初始化失敗;若返回值不為NULL,說明返回值handle 有效。
基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單6.85 和程序清單6.86。
程序清單6.85 實例初始化函數實現(am_hwconf_ds1302.c)
程序清單6.86 實例初始化函數聲明(am_hwconf_ds1302.h)
后續只需要使用無參數的實例初始化函數,即可獲取到DS1302 的實例句柄。即:
3. 使用RTC 功能
使用RTC 功能即可使用RTC 通用接口操作DS1302 設置和獲取時間,在使用RTC 通用接口前,需要獲取一個am_rtc_handle_t 類型的RTC 句柄。DS1302 的驅動提供了相應的接口用于獲取DS1302 的RTC 句柄,便于用戶通過RTC 通用接口操作DS1302,其函數原型為:
該函數意在獲取RTC 句柄,其中,DS1302 實例的句柄(ds1302_handle)作為實參傳遞給handle,p_rtc 為指向am_rtc_serv_t 類型實例的指針,無實例信息。定義am_rtc_serv_t 類型(am_rtc.h)實例如下:
其中,g_ds1302_rtc 為用戶自定義的實例,其地址作為p_rtc 的實參傳遞。
基于模塊化編程思想,將初始化相關的實例定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件分別詳見程序清單6.87 和程序清單6.88。
程序清單6.87 新增DS1302 的RTC 實例初始化函數(am_hwconf_ds1302.c)
程序清單6.88 am_hwconf_ds1302.h 文件內容更新(1)
后續只需要使用無參數的RTC 實例初始化函數,即可獲取RTC 實例句柄。即:
獲取handle 后,由于基于RTC 通用接口編寫的應用程序是可以跨平臺復用的,因此可以直接基于DS1302 啟動如程序清單6.45 所示的RTC 時間顯示應用程序。
程序清單6.89 啟動RTC 應用程序(基于DS1302)
由此可見,若將RTC 模塊由PCF85063 更換為DS1302,則應用程序核心代碼無需修改。
4. 為系統時間提供RTC 服務
由于DS1302 不支持鬧鐘功能,因此不能使用通用鬧鐘接口操作DS1302。若需要使用DS1302 為系統時間提供RTC 服務,只需要在初始化系統時間時,將從 DS1302 中獲取的RTC 句柄作為系統時間初始化函數的rtc_handle 參數。即:
為方便使用特將初始化函數的調用添加到配置文件中,通過頭文件引出系統時間的實例初始化函數接口,詳見程序清單6.90 和程序清單6.91。
程序清單6.90 DS1302 用作系統時間的實例初始化(am_hwconf_ds1302.c)
程序清單6.91 am_hwconf_ds1302.h 文件內容更新(2)
后續只需要簡單的調用該無參函數,即可完成系統時間的初始化。即:
系統時間初始化后,由于基于系統時間通用接口編寫的應用程序是可重用的,因此可以直接基于DS1302 啟動如程序清單6.65 所示的系統時間測試應用程序,詳見程序清單6.92。
程序清單6.92 啟動系統時間測試應用程序(基于DS1302)
顯然,若將RTC 模塊由PCF85063 更換為DS1302,使用系統時間的應用程序無需修改。
5. 特殊功能控制接口
除典型的實時時鐘功能外,DS1302 還具有一些特殊功能,比如,涓流充電功能、31 字節RAM 等。這些功能由于不是通用功能,只能使用DS1302 相應的接口操作。以讀寫RAM和涓流充電功能為例,其相應的接口函數詳見表6.16。
表6.16 DS1302 特殊功能控制接口(am_ds1302.h)
(1)寫入RAM
該函數用于寫入數據到DS1302 的RAM 中(最多可寫入31 字節數據),其函數原型為:
其中,handle 為DS1302 實例句柄,p_data 指向待寫入數據的首地址,data_len 指定寫入數據的字節數,最大為31 字節,pos 指定了寫入RAM 的起始地址,DS1302 的RAM 空間大小為31 字節,對應的地址為0 ~ 30,pos 的有效范圍即為0 ~ 30。若返回AM_OK,表示數據寫入成功,反之失敗,寫入31 字節數據至RAM 中的范例程序詳見程序清單6.93。
程序清單6.93 寫入RAM 范例程序
(2)讀取RAM
該函數用于讀取存于DS1302 的 RAM 中的數據,其函數原型為:
其中,handle 為DS1302 實例句柄,p_data 為輸出參數,用于返回讀取的數據,data_len表示讀取數據的字節數,pos 表示讀取數據的起始地址(0 ~ 30)。若返回AM_OK,表示讀取成功,反之失敗,范例程序詳見程序清單6.94。
程序清單6.94 讀取RAM 范例程序
可以使用讀寫RAM 接口簡單驗證DS1302 是否正常,詳見程序清單6.95。
程序清單6.95 讀寫RAM 數據范例程序
(3)使能涓流充電
DS1302 具有雙電源供電,當芯片由VCC2 供電時,可以通過可編程涓流充電器,使VCC2向VCC1 流入很小的電流,以便為連接到VCC1 的電池充電。使能涓流充電的函數原型為:
其中,handle 為DS1302 實例句柄,set_val 為可編程涓流充電器的控制參數,可以控制充電的電流。充電電路的示意圖詳見圖6.10。
圖6.10 DS1302 充電電路示意圖
當總開關打開后,充電電流的大小是由選擇的二極管個數(1 個或2 個)和電阻阻值(2KΩ、4KΩ 或8KΩ)決定的。二極管的個數決定了電壓的壓降,電流的計算公式為:
set_val 可用的值已經使用宏進行了定義,詳見表6.17實際使用時,應該根據需要的電流大小選擇其中一個宏作為set_val 的值。
表6.17 充電電路設置標志
比如,若選擇1 個二極管、2K電阻,則應該將set_val 的值設置為:
AM_DS1302_TRICKLE_1D_2K
由于在MicroPort-DS1302 中,VCC2 的值為3.3V,因此此時的實際電流計算公式為:
當VCC1 為0 時(電池電量完全耗盡)時,則電流達到最大值,其值為:
這就要求電池支持的最大充電電流為1.3mA。實際中,隨著對電池的充電,電池電量增加,VCC1 會逐漸增加,充電電流也隨之逐漸減小。范例程序詳見程序清單6.96。
程序清單6.96 使能涓流充電范例程序
(3)禁能涓流充電
當不需要充電時,如使用的非充電電池,可以使用該接口禁能涓流充電,其函數原型為:
其中,handle 為DS1302 實例句柄,范例程序詳見程序清單6.97。
程序清單6.97 禁能涓流充電范例程序
-
嵌入式
+關注
關注
5087文章
19147瀏覽量
306155 -
RTC
+關注
關注
2文章
541瀏覽量
66721 -
pcf85063
+關注
關注
1文章
3瀏覽量
3422
原文標題:周立功:重用外設驅動代碼—— RTC 實時時鐘(2)
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論