開發(fā)者的最大問題是核心域和非核心域不分,大部分時間都在編寫不可重用的和非核心域的代碼。沒有聚焦提升產品競爭力的核心域知識,比如,需求、算法、用戶體驗和軟件工程方法等方面,從而導致代碼維護的成本遠遠大于初期的開發(fā)投入。
事實上,那些做出優(yōu)秀產品的團隊,不僅員工隊伍非常穩(wěn)定,而且收入也很高,甚至連精神面貌都不一樣。因為他們使用了正確的開發(fā)策略和方法,而且短時間內掌握的技術遠勝那些所謂的“老程序員”。雖然每個企業(yè)都有拿高薪的員工,但為何不是你?別人開發(fā)的產品大賣,而你開發(fā)的產品卻賣不掉?不僅浪費了來之不易的資金,而且導致我們失去了更多的創(chuàng)造更大價值的機會。
十幾年前,作者也面臨同樣的問題,于是毫不猶豫地投身于軟硬件標準化平臺技術的開發(fā),因為只有方法的突破才能開創(chuàng)未來。AWorks 就是在這樣的背景下誕生的,脫胎于Aworks—Nano 子集的AMetal 不僅實現(xiàn)了跨平臺,而且還定義了外圍器件的軟件接口標準,因此“按需定制”為用戶提供有價值的服務也就成為了現(xiàn)實。
基于此,ZLG 為用戶提供了大量標準的外設驅動與相關的協(xié)議組件,意在建立完整的生態(tài)系統(tǒng)。無論你選擇什么MCU,只要支持AMetal,都可實現(xiàn)“一次編程、終生使用”,其好處是你再也不要重新發(fā)明輪子。
6.1 E2PROM 存儲器
E2PROM(Electrically Erasable Programable Read-Only Memory,電可擦除可編程只讀存儲器)是一種掉電后數據不丟失的存儲芯片,本節(jié)以FM24C02 為例詳細介紹在AMetal 中如何使用類似的非易失存儲器。
>>> 6.1.1 器件簡介
FM24C02 總容量為2K(2048)bits,即256(2048/8)字節(jié)。每個字節(jié)對應一個存儲地址,因此其存儲數據的地址范圍為0x00 ~ 0xFF。FM24C02 頁(page)的大小為8 字節(jié),每次寫入數據不能越過頁邊界,即地址0x08、0x10、0x18……;如果寫入數據越過頁邊界時,則必須分多次寫入,其組織結構詳見表6.1。
表6.1 FM24C02 存儲器組織結構
FM24C02 的通信接口為標準的I2C 接口,僅需SDA 和SCL 兩根信號線。這里以8PIN SOIC 封裝為例,詳見圖6.1。其中的WP 為寫保護,當該引腳接高電平時,將阻止一切寫入操作。一般來說,該引腳直接直接接地,以便芯片正常讀寫。
圖6.1 FM24C02 引腳定義
A2、A1、A0 決定了FM24C02 器件的I2C 從機地址,其7-bit 從機地址為0101 0A2A1A0。如果I2C 總線上僅有一片F(xiàn)M24C02,則將A2、A1、A0 直接接地,其地址為0x50。
在AMetal 中,由于用戶無需關心讀/寫方向位的控制,因此其地址使用7-bit 地址表示。MicroPort-EEPROM 模塊通過MicroPort 接口與AM824-Core 相連,詳見圖6.2,其中的E2PROM 是復旦微半導體提供的256 個字節(jié)FM24C02C。
圖6.2 E2PROM 電路原理圖
>>> 6.1.2 初始化
AMetal 提供了支持FM24C02 、FM24C04 、FM24C08……等系列I2C 接口E2PROM 的驅動函數,下面將以FM24C02 為例予以說明,其函數原型(am_ep24cxx.h)為:
該函數意在獲取器件實例句柄fm24c02_handle,其中,p_dev 為指向am_ep24cxx_dev_t類型實例的指針,p_devinfo 為指向am_ep24cxx_devinfo_t 類型實例信息的指針。
1. 實例
單個FM24C02 可以看作EP24Cxx 的一個實例,EP24Cxx 只是抽象了代表一個系列或同種類型的E2PROM 芯片,顯然多個FM24C02 是EP24Cxx 的多個實例。如果I2C 總線上只外接了一個FM24C02,定義am_ep24cxx_dev_t 類型(am_ep24cxx.h)實例如下:
其中,g_at24c02_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。如果同一個I2C 總線上外接了2 個FM24C02,需要定義3 個實例。即:
每個實例都要初始化,且每個實例的初始化均會返回一個該實例的handle。便于使用其它接口函數時,傳遞不同的handle 操作不同的實例。
2. 實例信息
實例信息主要描述了具體器件固有的信息,即I2C 器件的從機地址和具體型號,其類型am_ep24cxx_devinfo_t 的定義(am_ep24cxx.h)如下:
當前已經支持的器件型號均在am_ep24cxx.h 中定義了對應的宏,比如,F(xiàn)M24C02 對應的宏為AM_EP24CXX_FM24C02,實例信息定義如下:
其中,g_24c02_devinfo 為用戶自定義的實例信息,其地址作為p_devinfo 的實參傳遞。
3. I2C 句柄i2c_handle
以I2C1 為例,其實例初始化函數am_lpc82x_i2c1_inst_init()的返回值將作為實參傳遞給i2c_handle。即:
4. 實例句柄fm24c02_handle
FM24C02 初始化函數am_ep24cxx_init ()的返回值fm24c02_handle,作為實參傳遞給讀寫數據函數,其類型am_ep24cxx_handle_t(am_ep24cxx.h)定義如下:
若返回值為NULL,說明初始化失敗;若返回值不為NULL,說明返回一個有效的handle。
基于模塊化編程思想,將初始化相關的實例和實例信息等的定義存放到對應的配置文件中,通過頭文件引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單6.1 和程序清單6.2。
程序清單6.1 實例初始化函數范例程序(am_hwconf_ep24cxx.c)
程序清單6.2 實例初始化函數接口(am_hwconf_ep24cxx.h)
后續(xù)只需要使用無參數的實例初始化函數,即可獲取到FM24C02 的實例句柄。即:
注意,i2c_handle 用于區(qū)分I2C0、I2C1、I2C2、I2C3,初始化函數返回值實例句柄用于區(qū)分同一系統(tǒng)中連接的多個器件。
>>> 6.1.3 讀寫函數
讀寫EP24Cxx 系列存儲器的函數原型詳見表6.2。
表6.2 ep24cxx 讀寫函數(am_ep24cxx.h)
各API 的返回值含義都是相同的:AM_OK 表示成功,負值表示失敗,失敗原因可根據具體的值查看am_errno.h 文件中相對應的宏定義。正值的含義由各API 自行定義,無特殊說明時,表明不會返回正值。
1. 寫入數據
從指定的起始地址開始寫入一段數據的函數原型為:
如果返回值為AM_OK,則說明寫入成功,反之失敗。假定從0x20 地址開始,連續(xù)寫入16 字節(jié),詳見程序清單6.3。
程序清單6.3 寫入數據范例程序
2. 讀取數據
從指定的起始地址開始讀取一段數據的函數原型為:
如果返回值為AM_OK,則說明讀取成功,反之失敗。假定從0x20 地址開始,連續(xù)讀取16 字節(jié),詳見程序清單6.4。
程序清單6.4 讀取數據范例程序
如程序清單6.5 所示為寫入20 個字節(jié)數據再讀出來,然后比較是否相同的范例。
程序清單6.5 FM24C02 讀寫范例程序
由于app_test_ep24cxx()的參數為實例handle,與EP24Cxx 器件具有依賴關系,因此無法實現(xiàn)跨平臺調用。
>>> 6.1.4 NVRAM 通用接口函數
由于FM24C02 等E2PROM 是典型的非易失存儲器,因此使用NVRAM(非易失存儲器)標準接口讀寫數據就無需關心具體的器件了。使用這些接口函數前,需將工程配置am_prj_config.h 的AM_CFG_NVRAM_ENABLE 宏的值設置為1,相關函數原型詳見表6.3。
表6.3 NVRAM 通用接口函數
1. 初始化函數
NVRAM 初始化函數意在初始化FM24C02 的NVRAM 功能,以便使用NVRAM 標準接口讀寫數據。其函數原型為:
其中,ep24cxx 實例句柄fm24c02_handle 作為實參傳遞給handle,p_dev 為指向am_nvram_dev_t 類型實例的指針,p_dev_name 為分配給FM24C02 的一個NVRAM 設備名,便于其它模塊通過該名字定位到FM24C02 存儲器。
(1)實例(NVRAM 存儲器)
NVRAM 抽象地代表了所有非易失存儲器,F(xiàn)M24C02 可以看作NVRAM 存儲器的一個具體實例。定義am_nvram_dev_t 類型(am_nvram.h)實例如下:
其中,g_24c02_nvram_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
(2)實例信息
實例信息僅包含一個由p_dev_name 指針指定的設備名。設備名為一個字符串,如"fm24c02"。初始化后,該名字就唯一的確定了一個FM24C02 存儲器設備,如果有多個FM24C02,則可以命名為"fm24c02_0"、"fm24c02_1"、"fm24c02_2"……
基于模塊化編程思想,將初始化FM24C02 為標準的NVRAM 設備的代碼存放到對應的配置文件中,通過頭文件引出相應的實例初始化函數接口,詳見程序清單6.6 和程序清單6.7。
程序清單6.6 新增NVRAM 實例初始化函數(am_hwconf_ep24cxx.c)
程序清單6.7 am_hwconf_ep24cxx.h 文件更新
后續(xù)只需要使用無參數的實例初始化函數,即可完成NVRAM 設備初始化,將FM24C02初始化為名為"fm24c02"的NVRAM 存儲設備。即:
2. 存儲段的定義
NVRAM 定義了存儲段的概念,讀寫函數均對特定的存儲段操作。NVRAM 存儲器可以被劃分為單個或多個存儲段。存儲段的類型am_nvram_segment_t 定義(am_nvram.h)如下:
存儲段的名字p_name 和單元號unit 可以唯一確定一個存儲段,當名字相同時,則使用單元號區(qū)分不同的存儲段。存儲段的名字使得每個存儲段都被賦予了實際的意義,比如,名為"ip"的存儲段表示保存IP 地址的存儲段,名為"temp_limit"的存儲段表示保存溫度上限值的存儲段。seg_addr 為該存儲段在實際存儲器中的起始地址,seg_size 為該存儲段的容量大小。p_dev_name 表示該存儲段對應的實際存儲設備的名字。
如需將存儲段分配到FM24C02 上,則需將存儲段中的p_dev_name 設定為"fm24c02"。后續(xù)針對該存儲段的讀寫操作實際上就是對FM24C02 進行讀寫操作。為了方便管理,所有存儲段統(tǒng)一定義在am_nvram_cfg.c 文件中,默認情況下存儲段為空,其定義為:
在具有FM24C02 存儲設備后,即可新增一些段的定義,如應用程序需要使用4 個存儲段分別存儲2 個IP 地址(4 字節(jié)×2)、溫度上限值(4 字節(jié))和系統(tǒng)參數(50 字節(jié)),對應的存儲段列表(存儲段信息的數組)定義如下:
為了使存儲段生效,必須在系統(tǒng)啟動時調用am_nvram_inst_init ()函數(am_nvram_cfg.h),其函數原型為:
該函數往往在板級初始化函數中調用,可以通過工程配置文件(am_prj_config.h)中的AM_CFG_NVRAM _ENABLE 宏對其進行裁剪,詳見程序清單6.10。
程序清單6.8 在板級初始化中初始化NVRAM
NVRAM 初始化后,根據在am_nvram_cfg.c 文件中定義的存儲段可知,共計增加了5個存儲段,它們的名字、單元號和大小分別詳見表6.4,后續(xù)即可使用通用的NVRAM 讀寫接口對這些存儲段進行讀寫操作。
表6.4 定義的NVRAM 存儲段
3. 寫入數據
寫入數據函數原型為:
其中,p_name 和unit 分別表示存儲段的名字和單元號,確定寫入數據的存儲段,p_buf提供寫入存儲段的數據,offset 表示從存儲段指定的偏移開始寫入數據,len 為寫入數據的長度。若返回值為AM_OK,則說明寫入成功,反之失敗。比如,保存一個IP 地址到IP 存儲段,詳見程序清單6.9。
程序清單6.9 寫入數據范例程序
4. 讀取數據
讀取數據函數原型為:
其中,p_name 和unit 分別為存儲段的名字和單元號,確定讀取數據的存儲段;p_buf保存從存儲段讀到的數據,offset 表示從存儲段指定的偏移開始讀取數據,len 為讀取數據的長度。若返回值為AM_OK,則說明讀取成功,反之失敗。比如,從IP 存儲段中讀取出IP地址,詳見程序清單6.10。
程序清單6.10 讀取數據范例程序
現(xiàn)在編寫NVRAM 通用接口的簡單測試程序,測試某個存儲段的數據讀寫是否正常。雖然測試程序是一個簡單的應用,但基于模塊化編程思想,最好還是將測試相關程序分離出來,程序實現(xiàn)和對應接口的聲明詳見程序清單6.11 和程序清單6.12。
程序清單6.11 測試程序實現(xiàn)(app_test_nvram.c)
程序清單6.12 接口聲明(app_test_nvram.h)
將待測試的存儲段(段名和單元號)通過參數傳遞給測試程序,NVRAM 通用接口對測試段讀寫數據。若讀寫數據的結果完全相等,則返回AM_OK,反之返回AM_ERROR。
由此可見,應用程序的實現(xiàn)不包含任何器件相關的語句,僅僅調用NVRAM 通用接口讀寫指定的存儲段,因此該應用程序是跨平臺的,在任何AMetal 平臺中均可使用,進一步整合NVRAM 通用接口和測試程序的范例詳見程序清單6.13。
程序清單6.13 NVRAM 通用接口讀寫范例程序
顯然,NVRAM 通用接口賦予了名字的存儲段,使得程序在可讀性和可維護性方面都優(yōu)于使用EP24Cxx 讀寫接口。而調用NVRAM 通用接口會耗費一定的內存和CPU 資源,特別是在要求效率很高或內存緊缺的場合,建議使用EP24Cxx 讀寫接口。
-
存儲器
+關注
關注
38文章
7494瀏覽量
163895 -
EEPROM
+關注
關注
9文章
1021瀏覽量
81649 -
周立功
+關注
關注
38文章
130瀏覽量
37656
原文標題:周立功:重用外設驅動代碼——EEPROM 存儲器
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論