基于定時器、RTC、WDT本質(zhì)上均是計(jì)數(shù)器的共性,本次將這三種通用外設(shè)統(tǒng)一為TIM。以TIM為例,來展示如何開發(fā)通用驅(qū)動外設(shè)代碼。對于AMetal所提供的標(biāo)準(zhǔn)層驅(qū)動文件,均存放于ametal\interface路徑下。
如下圖所示,開發(fā)通用外設(shè)驅(qū)動主要包含以下步驟:了解通用外設(shè)標(biāo)準(zhǔn)接口層、外設(shè)硬件層開發(fā)、外設(shè)驅(qū)動層開發(fā)、外設(shè)用戶配置文件開發(fā)、外設(shè)例程文件開發(fā)。

了解通用外設(shè)標(biāo)準(zhǔn)層
1、通用外設(shè)標(biāo)準(zhǔn)接口相關(guān)類型定義
以WDT為例,如下所示為WDT的標(biāo)準(zhǔn)接口文件中對每個結(jié)構(gòu)體和handle的詳細(xì)介紹。

以此類推,對于定時器和RTC,其標(biāo)準(zhǔn)接口文件中均定義了驅(qū)動函數(shù)結(jié)構(gòu)體、標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體和外設(shè)標(biāo)準(zhǔn)服務(wù)操作句柄。
struct am_xxx_drv_funcs結(jié)構(gòu)體
該驅(qū)動函數(shù)結(jié)構(gòu)體表明了驅(qū)動層應(yīng)該提供對應(yīng)的函數(shù);
typedef struct am_xxx_serv結(jié)構(gòu)體
該標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體定義了標(biāo)準(zhǔn)的通用外設(shè)服務(wù),從而包含了需要驅(qū)動層為標(biāo)準(zhǔn)接口層提供的全部內(nèi)容。驅(qū)動層就只需定義這樣一個結(jié)構(gòu)體變量,然后賦好相應(yīng)的值,再以某種方式提供給標(biāo)準(zhǔn)接口層即可。
am_xxx_handle_t的定義
這是一個標(biāo)準(zhǔn)的操作句柄,本質(zhì)上就是標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體指針類型,驅(qū)動層的初始化函數(shù)需要返回該類型的handle給用戶。當(dāng)用戶在使用標(biāo)準(zhǔn)接口層函數(shù)時,就可以將獲取到的handle傳遞給標(biāo)準(zhǔn)層。那么,標(biāo)準(zhǔn)接口層就可以通過該handle訪問到驅(qū)動層提供的函數(shù)了。
2、標(biāo)準(zhǔn)接口函數(shù)
以WDT為例,如下所示為WDT標(biāo)準(zhǔn)接口函數(shù),通過內(nèi)聯(lián)函數(shù)來實(shí)現(xiàn)。這些函數(shù)就只是簡單地調(diào)用驅(qū)動層提供的函數(shù),本身并沒有做什么事情。每個函數(shù)都有對應(yīng)詳細(xì)的注釋,傳入?yún)?shù)和返回值。從中可以看到,在調(diào)用驅(qū)動層提供的函數(shù)時,就是將外設(shè)標(biāo)準(zhǔn)服務(wù)操作句柄(本質(zhì)上為標(biāo)準(zhǔn)服務(wù)結(jié)構(gòu)體)中的p_drv成員作為第一個參數(shù)傳遞。

外設(shè)HW層開發(fā)
HW 層對應(yīng)到具體的外設(shè),其提供的API基本上是直接操作寄存器的內(nèi)聯(lián)函數(shù),效率最高,內(nèi)聯(lián)函數(shù)直接定義在.h 文件中。根據(jù)芯片手冊,來添加外設(shè)的寄存器列表;并編寫寄存器相關(guān)操作的內(nèi)聯(lián)函數(shù)。以某款芯片的WDT為例,如下所示為WDT的寄存器列表,從而來明確各個寄存器的功能。

根據(jù)寄存器列表,了解了各個寄存器需要配置的各項(xiàng)功能和其他寄存器位該如何配合等。如下所示為WDT寄存器結(jié)構(gòu)體定義。

接下來需要編寫每個寄存器的功能操作函數(shù)即可完成外設(shè)硬件層的開發(fā)。以WDT的控制寄存器cr為例,來編寫該寄存器的硬件層函數(shù)接口,如下所示:

對于定時器、RTC的硬件層驅(qū)動開發(fā)亦是通過芯片手冊來編寫寄存器操作函數(shù)來完成驅(qū)動。
外設(shè)驅(qū)動層開發(fā)
1、定義設(shè)備信息結(jié)構(gòu)體和設(shè)備結(jié)構(gòu)體
在AMetal中,每個設(shè)備都應(yīng)該有與之對應(yīng)的設(shè)備結(jié)構(gòu)體和設(shè)備信息結(jié)構(gòu)體。設(shè)備結(jié)構(gòu)體主要用于內(nèi)存分配,與設(shè)備相關(guān)的變量都應(yīng)該定義在設(shè)備結(jié)構(gòu)體中。設(shè)備信息結(jié)構(gòu)體主要包含該設(shè)備的一些相關(guān)信息。

2、驅(qū)動函數(shù)實(shí)現(xiàn)
驅(qū)動函數(shù)主要包括兩部分:提供給標(biāo)準(zhǔn)層的驅(qū)動函數(shù)和初始化、解初始化函數(shù)。
以WDT為例,如下所示為WDT外設(shè)的驅(qū)動層應(yīng)該給標(biāo)準(zhǔn)接口層提供的函數(shù),按照芯片手冊中對應(yīng)操作說明來完成看門狗的驅(qū)動層函數(shù)。

如下所示為WDT初始化函數(shù)和解初始化函數(shù);初始化函數(shù)主要是為了初始化設(shè)備中的標(biāo)準(zhǔn)服務(wù)和硬件相關(guān)設(shè)置;解初始化函數(shù)是為了釋放內(nèi)存資源和硬件資源。

對于定時器和RTC的驅(qū)動層開發(fā),其大致流程亦是如此。
外設(shè)用戶配置文件開發(fā)
開發(fā)完驅(qū)動層我們知道,用戶使用一個外設(shè)的過程是,先調(diào)用驅(qū)動初始化函數(shù),該函數(shù)返回一個handle,后續(xù)的所有操作,用戶直接使用該handle作為參數(shù)調(diào)用標(biāo)準(zhǔn)接口層函數(shù)即可。
以某款芯片的 WDT為例,如下所示為WDT的用戶配置文件,主要包含設(shè)備信息結(jié)構(gòu)體、設(shè)備實(shí)例結(jié)構(gòu)體及其平臺初始化函數(shù)與解初始化函數(shù)。定義好變量和函數(shù)后,在頭文件中添加函數(shù)聲明。用戶在使用時,只需調(diào)用外設(shè)實(shí)例初始化函數(shù),并保存其返回的handle,后續(xù)直接使用該handle作為標(biāo)準(zhǔn)接口的第一個參數(shù)來調(diào)用標(biāo)準(zhǔn)接口函數(shù)即可。

對于定時器和RTC的用戶配置文件,配置其對應(yīng)的設(shè)備信息,添加平臺初始化函數(shù)與解初始化函數(shù)即可。
外設(shè)例程文件開發(fā)
外設(shè)的例程文件主要分為HW層示例和STD示例。
對于STD示例,調(diào)用標(biāo)準(zhǔn)層函數(shù)和實(shí)例初始化函數(shù)返回的handle作為參數(shù)傳入,來實(shí)現(xiàn)外設(shè)功能。
對于HW示例,可參考驅(qū)動層函數(shù)來添加硬件層示例功能函數(shù),最終實(shí)現(xiàn)外設(shè)功能。
至此,我們完成了一個通用外設(shè)驅(qū)動的開發(fā)。
來源:立功科技
-
Tim
+關(guān)注
關(guān)注
0文章
85瀏覽量
19042 -
ametal
+關(guān)注
關(guān)注
2文章
24瀏覽量
11717
發(fā)布評論請先 登錄
EEPROM存儲器外設(shè)及驅(qū)動代碼應(yīng)用設(shè)計(jì)
RT-Thread驅(qū)動開發(fā)指南進(jìn)階篇-動手驅(qū)動先楫未適配的外設(shè)LCD
【HAL庫每天一例】第014例:TIM-通用定時器定時
【HAL庫每天一例】第017例:TIM-通用定時器呼吸燈
【HAL庫每天一例】第018例:TIM-通用定時器輸入捕獲(脈沖測量)
靈動微電子MM32 MCU正式入駐AMetal平臺
靈動微課堂 (第122講) | 基于MM32 MCU的OS移植與應(yīng)用:AMetal平臺新建工程
API設(shè)備驅(qū)動管理層與外設(shè)驅(qū)動適配層標(biāo)準(zhǔn)接口設(shè)計(jì)實(shí)現(xiàn)
以SPI驅(qū)動為例展示如何使用ENV工具對BSP進(jìn)行配置
AMetal開發(fā)通用外設(shè)的流程與規(guī)范
AMetal適配:以TIM為例來展示如何開發(fā)通用驅(qū)動外設(shè)代碼
評論