上期講述了開(kāi)發(fā)通用外設(shè)之實(shí)戰(zhàn)TIM的流程,讓大家逐步深入了解如何開(kāi)發(fā)通用外設(shè)的驅(qū)動(dòng)。接下來(lái)將繼續(xù)進(jìn)行通用外設(shè)開(kāi)發(fā)的實(shí)戰(zhàn)篇,本次向大家介紹開(kāi)發(fā)通用外設(shè)之GPIO。
按照如下步驟開(kāi)發(fā)通用外設(shè)GPIO驅(qū)動(dòng):
了解通用外設(shè)標(biāo)準(zhǔn)接口層、外設(shè)硬件層開(kāi)發(fā)、外設(shè)驅(qū)動(dòng)層開(kāi)發(fā)、外設(shè)用戶(hù)配置文件開(kāi)發(fā)。
圖1 通用外設(shè)文件結(jié)構(gòu)
標(biāo)準(zhǔn)層了解
1、標(biāo)準(zhǔn)接口相關(guān)類(lèi)型定義
如下所示為GPIO的標(biāo)準(zhǔn)接口文件中對(duì)GPIO引腳功能、引腳模式、輸出電平以及中斷觸發(fā)方式等的定義。
圖2GPIO標(biāo)準(zhǔn)接口文件宏定義
2、標(biāo)準(zhǔn)接口函數(shù)
如下所示為GPIO標(biāo)準(zhǔn)層的函數(shù)接口,通過(guò)傳入引腳編號(hào)、配置功能標(biāo)志、回調(diào)函數(shù)等對(duì)應(yīng)的參數(shù),即可實(shí)現(xiàn)GPIO引腳的功能配置。在了解GPIO外設(shè)標(biāo)準(zhǔn)層數(shù)據(jù)類(lèi)型和接口函數(shù)之后,就明確了驅(qū)動(dòng)層需要為標(biāo)準(zhǔn)層所提供的內(nèi)容。
圖3GPIO標(biāo)準(zhǔn)層函數(shù)接口
外設(shè)HW層開(kāi)發(fā)
HW層對(duì)應(yīng)到具體的外設(shè),其提供的API基本上是直接操作寄存器的內(nèi)聯(lián)函數(shù)。根據(jù)芯片手冊(cè)來(lái)添加外設(shè)的寄存器列表;并編寫(xiě)寄存器相關(guān)操作的內(nèi)聯(lián)函數(shù)。以某款芯片的GPIO為例,如下所示為GPIO的寄存器列表,從而來(lái)明確各個(gè)寄存器的功能。
圖4GPIO寄存器列表
根據(jù)寄存器列表,我們了解并分析了各個(gè)寄存器功能以及要配置的各個(gè)功能,其他寄存器位該如何配合等。如下所示為GPIO寄存器結(jié)構(gòu)體定義。
圖5GPIO寄存器塊結(jié)構(gòu)體定義
接下來(lái)編寫(xiě)每個(gè)寄存器的功能操作函數(shù)即可完成外設(shè)硬件層的開(kāi)發(fā)。以GPIO的端口位清除寄存器brr為例,來(lái)編寫(xiě)該寄存器的硬件層函數(shù)接口,如下所示:
圖6GPIO_BRR寄存器操作函數(shù)
在每個(gè)寄存器的操作函數(shù)編寫(xiě)完畢后,可能硬件層的接口還有所欠缺,需要提供一些方便用戶(hù)使用的簡(jiǎn)單的功能性函數(shù)。在后續(xù)開(kāi)發(fā)時(shí),若發(fā)現(xiàn)有需要,可以反過(guò)來(lái)再添加。
外設(shè)驅(qū)動(dòng)層開(kāi)發(fā)
1、定義設(shè)備信息結(jié)構(gòu)體和設(shè)備結(jié)構(gòu)體
驅(qū)動(dòng)層首先應(yīng)該搭建好相關(guān)結(jié)構(gòu),再去實(shí)現(xiàn)外設(shè)的功能函數(shù)。在A(yíng)Metal中,每個(gè)設(shè)備都應(yīng)該有與之對(duì)應(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)體通常至少包含一個(gè)硬件層定義的指向寄存器基地址的指針類(lèi)型成員,除此之外,還包含一些設(shè)備的初始化配置信息,如中斷號(hào)、外設(shè)信息等成員。
圖7 GPIO設(shè)備信息結(jié)構(gòu)體和設(shè)備結(jié)構(gòu)體定義
2、驅(qū)動(dòng)函數(shù)實(shí)現(xiàn)
驅(qū)動(dòng)函數(shù)主要包括兩部分:一部分是提供給標(biāo)準(zhǔn)層的驅(qū)動(dòng)函數(shù),另一部分是面向用戶(hù)的初始化、解初始化函數(shù)。
我們可根據(jù)標(biāo)準(zhǔn)接口層函數(shù)來(lái)搭建相應(yīng)的GPIO外設(shè)的驅(qū)動(dòng)層功能函數(shù)框架;進(jìn)一步通過(guò)芯片用戶(hù)手冊(cè)中對(duì)應(yīng)操作說(shuō)明來(lái)完成GPIO的驅(qū)動(dòng)層功能函數(shù)驅(qū)動(dòng)。
如下所示為GPIO初始化函數(shù)和解初始化函數(shù);初始化函數(shù)主要是為了初始化設(shè)備中的標(biāo)準(zhǔn)服務(wù)和硬件相關(guān)設(shè)置;解初始化函數(shù)是為了釋放內(nèi)存資源和硬件資源。
圖8GPIO初始化函數(shù)和解初始化函數(shù)
外設(shè)用戶(hù)配置文件開(kāi)發(fā)
開(kāi)發(fā)完驅(qū)動(dòng)層我們知道,用戶(hù)使用一個(gè)外設(shè)的過(guò)程是,先調(diào)用驅(qū)動(dòng)初始化函數(shù),該函數(shù)返回一個(gè)handle,后續(xù)的所有操作,用戶(hù)直接使用該handle作為參數(shù)調(diào)用標(biāo)準(zhǔn)接口層函數(shù)即可。
以某款芯片的GPIO為例,如下所示為GPIO的用戶(hù)配置文件,主要包含設(shè)備信息結(jié)構(gòu)體、設(shè)備實(shí)例結(jié)構(gòu)體及其平臺(tái)初始化函數(shù)與解初始化函數(shù)。
圖9GPIO用戶(hù)配置文件
外設(shè)例程文件
外設(shè)的例程文件主要分為HW層示例和STD示例。
對(duì)于STD示例,調(diào)用標(biāo)準(zhǔn)層函數(shù)和實(shí)例初始化函數(shù)來(lái)實(shí)現(xiàn)外設(shè)功能。
對(duì)于HW示例,通過(guò)調(diào)用硬件層的函數(shù)完成相應(yīng)的配置,以此實(shí)現(xiàn)功能。如下所示為通過(guò)硬件層驅(qū)動(dòng)來(lái)實(shí)現(xiàn)按鍵切換LED狀態(tài)的示例。
圖10GPIO_HW層示例
至此,我們完成了一個(gè)通用外設(shè)GPIO驅(qū)動(dòng)的開(kāi)發(fā)。
來(lái)源:立功科技
-
GPIO
+關(guān)注
關(guān)注
16文章
1300瀏覽量
55304 -
ametal
+關(guān)注
關(guān)注
2文章
24瀏覽量
11651
發(fā)布評(píng)論請(qǐng)先 登錄
靈動(dòng)微電子MM32 MCU正式入駐AMetal平臺(tái)
靈動(dòng)微課堂 (第122講) | 基于MM32 MCU的OS移植與應(yīng)用:AMetal平臺(tái)新建工程
靈動(dòng)微課堂 (第123講) | 基于MM32 MCU的OS移植與應(yīng)用:AMetal LED燈控制
靈動(dòng)微課堂 (第123講) | 基于MM32 MCU的OS移植與應(yīng)用:AMetal LED燈控制
基于Ametal平臺(tái)開(kāi)發(fā),快速完成開(kāi)發(fā)設(shè)計(jì)!
簡(jiǎn)要分析Thread的通用GPIO設(shè)備驅(qū)動(dòng)
Linux應(yīng)用開(kāi)發(fā)【第九章】GPIO編程應(yīng)用開(kāi)發(fā)

AMetal開(kāi)發(fā)通用外設(shè)的流程與規(guī)范

AMetal適配:以TIM為例來(lái)展示如何開(kāi)發(fā)通用驅(qū)動(dòng)外設(shè)代碼

AMetal代碼倉(cāng)庫(kù)使用說(shuō)明
如何驅(qū)動(dòng)Linux開(kāi)發(fā)板LED燈

【北京迅為】iTOP-RK3568OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)GPIO基礎(chǔ)知識(shí)

基于小凌派RK2206開(kāi)發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設(shè)

迅為RK3568開(kāi)發(fā)板驅(qū)動(dòng)指南GPIO子系統(tǒng)GPIO子系統(tǒng)API函數(shù)的引入

評(píng)論