基于定時器、RTC、WDT本質(zhì)上均是計數(shù)器的共性,本次將這三種通用外設統(tǒng)一為TIM。以TIM為例,來展示如何開發(fā)通用驅(qū)動外設代碼。對于AMetal所提供的標準層驅(qū)動文件,均存放于ametal\interface路徑下。
如下圖所示,開發(fā)通用外設驅(qū)動主要包含以下步驟:了解通用外設標準接口層、外設硬件層開發(fā)、外設驅(qū)動層開發(fā)、外設用戶配置文件開發(fā)、外設例程文件開發(fā)。
了解通用外設標準層
1、通用外設標準接口相關類型定義
以WDT為例,如下所示為WDT的標準接口文件中對每個結(jié)構(gòu)體和handle的詳細介紹。
以此類推,對于定時器和RTC,其標準接口文件中均定義了驅(qū)動函數(shù)結(jié)構(gòu)體、標準服務結(jié)構(gòu)體和外設標準服務操作句柄。
struct am_xxx_drv_funcs結(jié)構(gòu)體
該驅(qū)動函數(shù)結(jié)構(gòu)體表明了驅(qū)動層應該提供對應的函數(shù);
typedef struct am_xxx_serv結(jié)構(gòu)體
該標準服務結(jié)構(gòu)體定義了標準的通用外設服務,從而包含了需要驅(qū)動層為標準接口層提供的全部內(nèi)容。驅(qū)動層就只需定義這樣一個結(jié)構(gòu)體變量,然后賦好相應的值,再以某種方式提供給標準接口層即可。
am_xxx_handle_t的定義
這是一個標準的操作句柄,本質(zhì)上就是標準服務結(jié)構(gòu)體指針類型,驅(qū)動層的初始化函數(shù)需要返回該類型的handle給用戶。當用戶在使用標準接口層函數(shù)時,就可以將獲取到的handle傳遞給標準層。那么,標準接口層就可以通過該handle訪問到驅(qū)動層提供的函數(shù)了。
2、標準接口函數(shù)
以WDT為例,如下所示為WDT標準接口函數(shù),通過內(nèi)聯(lián)函數(shù)來實現(xiàn)。這些函數(shù)就只是簡單地調(diào)用驅(qū)動層提供的函數(shù),本身并沒有做什么事情。每個函數(shù)都有對應詳細的注釋,傳入?yún)?shù)和返回值。從中可以看到,在調(diào)用驅(qū)動層提供的函數(shù)時,就是將外設標準服務操作句柄(本質(zhì)上為標準服務結(jié)構(gòu)體)中的p_drv成員作為第一個參數(shù)傳遞。
外設HW層開發(fā)
HW 層對應到具體的外設,其提供的API基本上是直接操作寄存器的內(nèi)聯(lián)函數(shù),效率最高,內(nèi)聯(lián)函數(shù)直接定義在.h 文件中。根據(jù)芯片手冊,來添加外設的寄存器列表;并編寫寄存器相關操作的內(nèi)聯(lián)函數(shù)。以某款芯片的WDT為例,如下所示為WDT的寄存器列表,從而來明確各個寄存器的功能。
根據(jù)寄存器列表,了解了各個寄存器需要配置的各項功能和其他寄存器位該如何配合等。如下所示為WDT寄存器結(jié)構(gòu)體定義。
接下來需要編寫每個寄存器的功能操作函數(shù)即可完成外設硬件層的開發(fā)。以WDT的控制寄存器cr為例,來編寫該寄存器的硬件層函數(shù)接口,如下所示:
對于定時器、RTC的硬件層驅(qū)動開發(fā)亦是通過芯片手冊來編寫寄存器操作函數(shù)來完成驅(qū)動。
外設驅(qū)動層開發(fā)
1、定義設備信息結(jié)構(gòu)體和設備結(jié)構(gòu)體
在AMetal中,每個設備都應該有與之對應的設備結(jié)構(gòu)體和設備信息結(jié)構(gòu)體。設備結(jié)構(gòu)體主要用于內(nèi)存分配,與設備相關的變量都應該定義在設備結(jié)構(gòu)體中。設備信息結(jié)構(gòu)體主要包含該設備的一些相關信息。
2、驅(qū)動函數(shù)實現(xiàn)
驅(qū)動函數(shù)主要包括兩部分:提供給標準層的驅(qū)動函數(shù)和初始化、解初始化函數(shù)。
以WDT為例,如下所示為WDT外設的驅(qū)動層應該給標準接口層提供的函數(shù),按照芯片手冊中對應操作說明來完成看門狗的驅(qū)動層函數(shù)。
如下所示為WDT初始化函數(shù)和解初始化函數(shù);初始化函數(shù)主要是為了初始化設備中的標準服務和硬件相關設置;解初始化函數(shù)是為了釋放內(nèi)存資源和硬件資源。
對于定時器和RTC的驅(qū)動層開發(fā),其大致流程亦是如此。
外設用戶配置文件開發(fā)
開發(fā)完驅(qū)動層我們知道,用戶使用一個外設的過程是,先調(diào)用驅(qū)動初始化函數(shù),該函數(shù)返回一個handle,后續(xù)的所有操作,用戶直接使用該handle作為參數(shù)調(diào)用標準接口層函數(shù)即可。
以某款芯片的 WDT為例,如下所示為WDT的用戶配置文件,主要包含設備信息結(jié)構(gòu)體、設備實例結(jié)構(gòu)體及其平臺初始化函數(shù)與解初始化函數(shù)。定義好變量和函數(shù)后,在頭文件中添加函數(shù)聲明。用戶在使用時,只需調(diào)用外設實例初始化函數(shù),并保存其返回的handle,后續(xù)直接使用該handle作為標準接口的第一個參數(shù)來調(diào)用標準接口函數(shù)即可。
對于定時器和RTC的用戶配置文件,配置其對應的設備信息,添加平臺初始化函數(shù)與解初始化函數(shù)即可。
外設例程文件開發(fā)
外設的例程文件主要分為HW層示例和STD示例。
對于STD示例,調(diào)用標準層函數(shù)和實例初始化函數(shù)返回的handle作為參數(shù)傳入,來實現(xiàn)外設功能。
對于HW示例,可參考驅(qū)動層函數(shù)來添加硬件層示例功能函數(shù),最終實現(xiàn)外設功能。
至此,我們完成了一個通用外設驅(qū)動的開發(fā)。
來源:立功科技
-
Tim
+關注
關注
0文章
84瀏覽量
18772 -
ametal
+關注
關注
2文章
24瀏覽量
11648
發(fā)布評論請先 登錄
EEPROM存儲器外設及驅(qū)動代碼應用設計

RT-Thread驅(qū)動開發(fā)指南進階篇-動手驅(qū)動先楫未適配的外設LCD

評論