上期講述了搭建工程讓MCU在AMetal平臺運行起來,為后續開發外設驅動奠定基礎。接下來可以進入下一步的通用驅動外設開發工作,本次向大家介紹開發通用外設的一般流程與規范。
外設驅動開發的過程主要包括硬件層驅動函數的編寫、驅動層函數的實現、通用示例程序的編寫及其相關外設的配置文件開發。
圖1 AMetal架構
基于AMetal驅動架構,帶大家來了解一下通用外設驅動開發的主要流程,如下所示:
了解標準函數接口
對于通用MCU而言,AMetal提供了各個通用外設的標準層接口,開發者不需要額外開發,只需了解標準外設的接口函數即可。通用外設一般是多實例設備,標準接口層函數的第一個參數均為外設標準服務操作句柄handle。雖然標準函數接口不需要用戶編寫,但用戶還是需要充分了解標準接口層,才能夠清楚驅動層需要開發的內容——即如何實現函數接口等。AMetal提供的所有標準層驅動文件均在{SDK}\interface路徑下,標準接口層包含的文件如下所示:
圖2 標準接口層文件
通用外設硬件層開發
通過對標準層的了解,我們知道標準層實現的函數功能,以及需要驅動層提供的函數。但驅動層并不是凌空搭建的,驅動層介乎于HW層和標準接口層之間,簡單來說就是調用HW層的函數來提供給標準層,所以在完成驅動層開發前,要先來實現HW層的接口函數。
HW層對應到具體的外設,其提供的API基本上是直接操作寄存器的內聯函數,其效率最高,內聯函數直接定義在.h文件中。硬件層中所有的符號及函數命名均以amhw_/AMHW_開頭。通常情況下,HW層只有.h文件,只有當某些硬件功能設置較為復雜時,才提供對應的非內聯函數,存放在.c文件中。
開發HW層前,我們需要根據芯片用戶手冊,來大概了解一下該芯片外設的寄存器。從而對外設功能有一定的了解之后再開始開發,其流程如下:
添加寄存器列表,以確保硬件層接口的完整和準確性;
編寫寄存器相關操作函數:對該外設的所有寄存器提供操作函數;
查漏補缺:檢查補充所需功能函數;
添加指向寄存器塊的指針,方便用戶或驅動層使用。
以ZLG116為例,如下圖所示為開發通用外設過程中各個驅動文件所存放的位置。
圖3 芯片外設驅動文件
外設驅動層開發
通過對標準接口層文件的分析與理解,清楚了驅動層需要為標準接口層提供哪些具體內容,加上驅動層本身應該提供給用戶的初始化函數和解初始化函數。因此,外設驅動層需要編寫的總體內容如下:
編寫好標準接口層需要使用的基本函數;
驅動初始化函數;
驅動解初始化函數;
外設用戶配置文件開發。
由于用戶調用驅動層的初始化函數時,需要傳入設備地址和設備信息地址作為參數。為了方便用戶使用,我們需要將設備變量和設備信息常量定義好;從而用戶調用驅動的初始化函數時,只需要使用已經定義好的設備變量和設備信息常量即可,不需要再額外定義。因此,我們把這個用于存放設備變量和設備常量信息和驅動初始化函數的文件稱之為外設用戶配置文件。通常情況下,AMetal平臺為每一個外設均提供了一個獨立的用戶配置文件。
開發完驅動層我們知道,用戶使用一個外設的過程是,先調用驅動初始化函數,該函數返回一個handle,后續的所有操作,用戶直接使用該handle作為參數調用標準接口層函數即可。這樣一來,可以實現數據與代碼的分離,即達到驅動復用的效果。以I2C外設為例,在操作該外設時,四個I2C的操作方式完全一樣,僅僅是引腳、中斷號、寄存器基地址不同的區別而已:
圖4 驅動的可復用性
外設例程文件開發
開發完驅動文件之后,最后是編寫例程文件。例程文件開發主要分為兩個部分:基于硬件層實現的HW例程、基于標準層實現的STD例程以及在板測試的板級例程。為了將外設所有的例程(包括HW例程和STD例程)統一管理,例程統一存放{SDK}\examples\board\xxx_core\peripheral_name路徑。HW層的實現與標準層的實現,在文件上的命名,分別采用hw與std作為關鍵字。到了這一步,我們就需要依托硬件測試驗證我們的代碼功能,最終即可實現通用外設的開發。
以上就是基于AMetal開發通用外設的流程與規范的全部內容,相信大家熟悉了AMetal平臺上開發MCU通用外設的流程。
-
寄存器
+關注
關注
31文章
5317瀏覽量
120002 -
函數
+關注
關注
3文章
4304瀏覽量
62427 -
代碼
+關注
關注
30文章
4744瀏覽量
68345 -
ametal
+關注
關注
2文章
24瀏覽量
11392
發布評論請先 登錄
相關推薦
評論