0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入淺出AMetal之接口與實(shí)現(xiàn)

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-10-27 15:21 ? 次閱讀

第五章為深入淺出AMetal,本文內(nèi)容為5.1 接口與實(shí)現(xiàn)。

本章導(dǎo)讀:

對(duì)于初學(xué)者來說,要想實(shí)現(xiàn)一個(gè)溫度采集是很難的,但AMetal 可以做到。AMetal 構(gòu)建了一套抽象度更高的標(biāo)準(zhǔn)化接口,封裝了各種MCU 底層的變化,為應(yīng)用軟件提供了更穩(wěn)定的抽象服務(wù),延長(zhǎng)了軟件系統(tǒng)的生命周期。因此無論你選擇什么MCU,只要支持AMetal,開發(fā)者無需閱讀用戶手冊(cè),甚至不需要知道什么是AMetal,就可以高度復(fù)用原有的代碼。

盡管你已經(jīng)得心應(yīng)手地使用AMetal 編寫了很多的程序,但還是想深入了解更多的接口是如何實(shí)現(xiàn)的?那么我們不妨從這里開始AMetal 的神奇之旅!

5.1 接口與實(shí)現(xiàn)

>>> 5.1.1 GPIO 接口函數(shù)

AMetal 提供了操作GPIO 的標(biāo)準(zhǔn)接口函數(shù),所有GPIO 的標(biāo)準(zhǔn)接口函數(shù)原型位于ametal_am824_core_1.00\ametal\common\interface\am_gpio.h 文件中,其中包括宏定義和提供給用戶操作GPIO 的函數(shù)原型的聲明。即:

  • 配置引腳功能和模式:int am_gpio_pin_cfg(int pin, uint32_t flags)

  • 獲取引腳電平:int am_gpio_get(int pin)

  • 設(shè)置引腳電平:int am_gpio_set(int pin, int value)

  • 翻轉(zhuǎn)引腳電平:int am_gpio_toggle(int pin)

1. 配置引腳功能和模式

其中的pin 為引腳編號(hào),格式為PIOx_x,比如,PIO0_0 用于指定配置相應(yīng)引腳。在GPIO標(biāo)準(zhǔn)接口層中,所有函數(shù)的第一個(gè)參數(shù)均為pin,用于指定具體操作的引腳,相關(guān)的宏定義在ametal_easy_arm_lpc8xx\ametal\lpc8xx\drivers\include\lpc8xx_pin.h 中定義。

flags 為配置標(biāo)志,由“通用功能 | 通用模式 | 平臺(tái)功能 | 平臺(tái)模式”(‘|’就是C 語言中的按位或)組成。通用功能和模式在am_gpio.h 文件中定義,是從標(biāo)準(zhǔn)接口層抽象出來的GPIO 最通用的功能和模式,格式為AM_GPIO_*。通用功能相關(guān)宏定義與含義詳見表5.1,通用模式相關(guān)宏定義與含義詳見表5.2。

表5.1 引腳通用功能

表5.2 引腳通用模式

平臺(tái)功能和模式與具體芯片相關(guān),會(huì)隨著芯片的不同而不同,平臺(tái)功能和模式相關(guān)的宏定義在lpc8xx_pin.h 文件中定義,芯片引腳的復(fù)用功能和一些特殊的模式都定義這個(gè)文件中,格式為PIO*_*_*,比如,PIO0_4_UART0_TX,PIO0_4 的串口0 發(fā)送。

如果需要找到PIO0_0 相關(guān)的平臺(tái)功能和平臺(tái)模式,可以打開lpc8xx_pin.h 這個(gè)文件,找到PIO0_0為前綴的宏定義,PIO0_0 相關(guān)的平臺(tái)功能詳見表5.3,平臺(tái)模式詳見表5.4。

表5.3 PIO0_0 平臺(tái)功能

表5.4 PIO0_0 平臺(tái)模式

在這里,讀者可能會(huì)問,為什么要將功能分為通用功能和平臺(tái)功能呢?各自相關(guān)的宏存放在各自的文件中,文件數(shù)目多了,會(huì)不會(huì)使用起來更加復(fù)雜呢?

通用功能定義在標(biāo)準(zhǔn)接口層中,不會(huì)隨芯片的改變而改變。而GPIO 復(fù)用功能等,會(huì)隨著芯片的不同而不同,這些功能是由具體芯片決定的,因此必須放在平臺(tái)定義的文件中。如果這部分也放到標(biāo)準(zhǔn)接口層文件中,就不能保證所有芯片標(biāo)準(zhǔn)接口的一致性,從而也就失去了標(biāo)準(zhǔn)接口的意義。這樣分開使用讓使用者更清楚,哪些代碼是全部使用標(biāo)準(zhǔn)接口層實(shí)現(xiàn)的,全部使用標(biāo)準(zhǔn)接口層的代碼與具體芯片是無關(guān)的,是可跨平臺(tái)復(fù)用的。

如果返回AM_OK,說明配置成功;如果返回- AM_ENOTSUP,說明配置的功能不支持,配置失敗,配置引腳為GPIO 功能詳見程序清單5.1。

程序清單5.1 配置管腳為GPIO 功能

配置引腳為AD 模擬輸入功能詳見程序清單5.2。

程序清單5.2 配置引腳為AD 模擬輸入功能

配置引腳為UART 功能詳見程序清單5.3。

程序清單5.3 配置引腳為UART 功能

2. 獲取引腳電平

其中的pin 為引腳編號(hào),格式為PIOx_x,比如PIO0_0,用于獲取引腳的電平狀態(tài)。使用范例詳見程序清單5.4。

程序清單5.4 am_gpio_get()范例程序

3. 設(shè)置引腳電平

其中的pin 為引腳編號(hào),格式為PIOx_x。比如,PIO0_0 用于設(shè)置PIO0.0 引腳的電平。Value 為設(shè)置的引腳狀態(tài),0-低電平,1-高電平。如果返回AM_OK,說明操作成功,使用范例詳見程序清單5.5。

程序清單5.5 am_gpio_set()范例程序

4. 翻轉(zhuǎn)引腳電平

翻轉(zhuǎn) GPIO 引腳的輸出電平,如果GPIO 當(dāng)前輸出低電平,當(dāng)調(diào)用該函數(shù)后,GPIO 翻轉(zhuǎn)輸出高電平,反之則翻轉(zhuǎn)為低電平。

其中的Pin 為引腳編號(hào),格式為PIOx_x。比如,PIO0_0 用于翻轉(zhuǎn)PIO0.0 引腳的電平狀態(tài)。如果返回AM_OK,說明操作成功,使用范例詳見程序清單5.6。

程序清單5.6 am_gpio_toggle()范例程序

5. 范例

顯然,控制LED0 點(diǎn)亮或熄滅是通過GPIO 輸出0 或1 實(shí)現(xiàn)的,因此需要先調(diào)用am_gpio_pin_cfg()函數(shù)將GPIO 配置為輸出模式,并初始化為高電平,確保初始時(shí)LED0 處于確定的熄滅狀態(tài),接著調(diào)用am_gpio_set()函數(shù),使PIO0_20 輸出低電平點(diǎn)亮LED0,其相應(yīng)的代碼詳見程序清單5.7。

程序清單5.7 點(diǎn)亮LED 范例程序

LED 不停地閃爍就是讓一個(gè)I/O 不斷翻轉(zhuǎn)的過程,詳見程序清單5.8。

程序清單5.8 單個(gè)LED 閃爍范例程序(1)

AMetal 針對(duì)I/O 提供了引腳電平翻轉(zhuǎn)函數(shù)am_gpio_toggle(),詳見程序清單5.9。

程序清單5.9 單個(gè)LED 閃爍范例程序(2)

假如使蜂鳴器發(fā)出1KHz 頻率的聲音,1KHz 頻率對(duì)應(yīng)的周期為:T=1/1000(s)=1(ms),由于一個(gè)周期是低電平(接通)時(shí)間和高電平(斷開)時(shí)間的總和,因此在一個(gè)周期內(nèi),高、低電平保持的的時(shí)間分別為500us。由此可見,要使蜂鳴器不間斷地發(fā)聲,只要以500us 的時(shí)間間隔不斷的翻轉(zhuǎn)引腳的輸出電平即可,詳見程序清單5.10。

程序清單5.10 蜂鳴器發(fā)聲范例程序

>>> 5.1.2 LED 接口與實(shí)現(xiàn)

下面將使用這些程序設(shè)計(jì)的概念實(shí)現(xiàn)通用函數(shù)接口,比如,家用電器的某個(gè)動(dòng)作完成時(shí),或工業(yè)現(xiàn)場(chǎng)數(shù)據(jù)采集的上下限報(bào)警,都會(huì)通過LED 提醒操作者。顯然LED 驅(qū)動(dòng)軟件應(yīng)用非常廣泛,完全有必要編寫一個(gè)通用函數(shù)作為接口以便復(fù)用。編寫通用函數(shù)應(yīng)該建立一個(gè)“.h”文件和一個(gè)“.c”文件,.h 文件用于提供接口,告知調(diào)用者提供了哪些接口,.c 文件用于實(shí)現(xiàn)各個(gè)接口函數(shù),所以需要建立一個(gè)led.c 文件和led.h 文件,并將.c 文件添加到工程中。

顯然LED 只有點(diǎn)亮、熄滅和翻轉(zhuǎn)3 種操作,如果我們不在乎抽象性的話,則可以直接調(diào)用AMetal 函數(shù)實(shí)現(xiàn)。抽象的方法在操作LED 的實(shí)現(xiàn)代碼和使用操作LED 的代碼之間添加一個(gè)函數(shù)層,創(chuàng)建一個(gè)定義明確的接口,正確的抽象性是將對(duì)象的實(shí)現(xiàn)和它的接口分離。即將操作LED 的方法“聲明”函數(shù)原型如下:

其中的led_id 對(duì)應(yīng)的LED 編號(hào),為了方便調(diào)用者以后不用再查看原理圖,則將LED 與GPIO 的對(duì)應(yīng)關(guān)系定義在一個(gè)數(shù)組中,其相應(yīng)的代碼詳見程序清單5.11。

程序清單5.11 定義LED 對(duì)應(yīng)的GPIO 口

那么調(diào)用者只要將索引號(hào)傳入數(shù)組即可。由于I/O 口的數(shù)量只有8 個(gè),則led_id 的有效值是0 ~ 7,所以需要判定led_id 是否合法防止數(shù)組越界,其相應(yīng)的代碼詳見程序清單5.12。

程序清單5.12 通用接口函數(shù)(led.c)的實(shí)現(xiàn)(1)

編程到這里貌似已經(jīng)很完善了,但LED 還是不能工作,因?yàn)檫€沒有將GPIO 配置為輸出模式,其相應(yīng)的代碼詳見程序清單5.13。

程序清單5.13 添加初始化函數(shù)

這里并沒有簡(jiǎn)單地將GPIO 初始化為輸出,而是在配置為輸出模式的同時(shí),初始化GPIO為高電平,以保證LED 處于熄滅狀態(tài)。此時(shí)編程完畢,則將相關(guān)的函數(shù)接口聲明封裝到led.h文件中,詳見程序清單5.14。當(dāng)后續(xù)需要調(diào)用時(shí),只需要 #include "led.h"就可以了。

程序清單5.14 在led.h 中添加函數(shù)聲明

在實(shí)際的使用中,接口函數(shù)都應(yīng)添加詳細(xì)的描述,告訴調(diào)用者應(yīng)該如何調(diào)用這些接口。為了方便調(diào)用,可以在led.h 中將LED 的編號(hào)與實(shí)際數(shù)組中的索引號(hào)的對(duì)應(yīng)關(guān)系使用宏定義出來。那么在調(diào)用LED 接口函數(shù)時(shí),就不再需要關(guān)心led_id 的具體數(shù)值,直接使用宏即可,其相應(yīng)的代碼詳見程序清單5.15。

程序清單5.15 LED_ID 的定義

此時(shí),如果要點(diǎn)亮LED0,則調(diào)用led_on(LED0)即可。這個(gè)接口是否已經(jīng)做到很通用了呢?雖然LED 對(duì)應(yīng)的GPIO 信息中包含了I/O 信息,卻沒有包括對(duì)應(yīng)的電平信息。如果僅僅看數(shù)組,而不看硬件原理圖,還是不知道點(diǎn)亮或熄滅LED 究竟是高電平還是低電平?

由于LED 對(duì)應(yīng)的管腳信息和相應(yīng)的電平信息分別屬于不同的數(shù)據(jù)類型,顯然只有使用結(jié)構(gòu)體,才能將不同類型的數(shù)據(jù)放在一起作為一個(gè)整體來對(duì)待。同時(shí)注意在聲明結(jié)構(gòu)體時(shí)給出typedef 定義,且在定義的類型名稱后面追加標(biāo)簽,比如,led_info,其相應(yīng)的數(shù)據(jù)結(jié)構(gòu)詳見程序清單5.16(3)~ (8)通用接口函數(shù)的實(shí)現(xiàn)。

程序清單5.16 通用接口函數(shù)(led.c)的實(shí)現(xiàn)(2)

如果我們需要改變處理數(shù)據(jù)的方法,則只需要在一個(gè)地方進(jìn)行修改就可以了,而不必改動(dòng)程序中所有直接訪問數(shù)據(jù)的地方。正確的封裝機(jī)制,不僅鼓勵(lì)而且強(qiáng)迫隱藏實(shí)現(xiàn)細(xì)節(jié)。它使你的代碼更可靠,而且更容易維護(hù)。文件led.h 僅包含了相應(yīng)的接口函數(shù)的聲明,而在led.c中對(duì)它們進(jìn)行定義,實(shí)際上用戶是看不到led.c 的。

在實(shí)際的應(yīng)用中,用戶使用LED 有兩種情況,絕大部分情況都是使用AM824-Core 板載的兩個(gè)LED,但在流水燈實(shí)驗(yàn)中,使用的是MiniPort-LED 上的8 個(gè)LED,它們對(duì)應(yīng)的引腳是不同的,基于此,可以在led.h 文件中定義一個(gè)宏USE_MINIPORT_LED,默認(rèn)值為0,使用板載LED,為1 時(shí)使用MiniPort-LED。引腳信息數(shù)組g_led_info 的定義修改如下:

顯然,根據(jù)抽象定義的接口操作對(duì)象,將極大地減少了子系統(tǒng)實(shí)現(xiàn)之間的相互依賴關(guān)系,也產(chǎn)生了可復(fù)用的程序設(shè)計(jì)的原則:只針對(duì)接口編程而不是針對(duì)實(shí)現(xiàn)編程。因?yàn)獒槍?duì)接口編程的組件不需要知道對(duì)象的具體類型和實(shí)現(xiàn),只需要知道抽象類定義了哪些接口,從而減少了實(shí)現(xiàn)上的依賴關(guān)系。

實(shí)際上,這些接口并不妨礙你將一個(gè)對(duì)象和其它對(duì)象一起使用,因而對(duì)象只能通過接口來訪問,所以并不會(huì)破壞封裝性。

>>> 5.1.3 I/O 接口與中斷

GPIO 觸發(fā)部分主要是使GPIO 工作在中斷狀態(tài)的相關(guān)操作接口,詳見表5.5。

表5.5 GPIO 觸發(fā)相關(guān)接口函數(shù)

1. 配置引腳觸發(fā)條件函數(shù)

配置引腳觸發(fā)函數(shù)原型如下:

其中的pin 為引腳編號(hào),格式為PIOx_x,比如PIO0_0,配置相應(yīng)引腳的觸發(fā)條件。Flag為觸發(fā)條件,所有可選的觸發(fā)條件詳見表5.6。

表5.6 GPIO 觸發(fā)條件配置宏

注意,這些觸發(fā)條件并不一定每個(gè)GPIO 口都支持,當(dāng)配置觸發(fā)條件時(shí),應(yīng)檢測(cè)返回值,確保相應(yīng)引腳支持所配置的觸發(fā)條件。細(xì)心的人可能會(huì)發(fā)現(xiàn),這里的參數(shù)flag 為單數(shù)形式,而am_gpio_pin_cfg()函數(shù)的參數(shù)flag 為復(fù)數(shù)形式。當(dāng)參數(shù)為單數(shù)形式時(shí),則表明只能從可選宏中選擇一個(gè)具體的宏值作為實(shí)參;當(dāng)參數(shù)為復(fù)數(shù)形式時(shí),則表明可以選多個(gè)宏值的或值(C 語言中的“|”運(yùn)算符)作為實(shí)參。

如果返回AM_OK,說明配置成功,如果返回-AM_ENOTSUP,說明引腳不支持該觸發(fā)條件,配置失敗,使用范例詳見程序清單5.17。

程序清單5.17 am_gpio_trigger_cfg ()范例程序

2. 連接引腳觸發(fā)回調(diào)函數(shù)

連接一個(gè)回調(diào)函數(shù)到觸發(fā)引腳,當(dāng)相應(yīng)引腳觸發(fā)事件產(chǎn)生時(shí),則會(huì)調(diào)用本函數(shù)連接的回調(diào)函數(shù)。其函數(shù)原型為:

其中的pin 為引腳編號(hào),格式為PIOx_x,比如PIO0_0,將函數(shù)與相應(yīng)引腳關(guān)聯(lián)。pfn_callback 為回調(diào)函數(shù),類型為am_pfnvoid_t (void (*)(void *) ),即無返回值,參數(shù)為void*型的函數(shù)。p_arg 為回調(diào)函數(shù)的參數(shù)為void *型,這個(gè)參數(shù)就是當(dāng)回調(diào)函數(shù)調(diào)用時(shí),傳遞給回調(diào)函數(shù)的參數(shù)。如果返回AM_OK,說明連接成功,使用范例詳見程序清單5.18。

程序清單5.18 am_gpio_trigger_connect()范例程序

3. 斷開引腳觸發(fā)回調(diào)函數(shù)

與am_gpio_trigger_connect()函數(shù)的功能相反,當(dāng)不需要使用一個(gè)引腳中斷時(shí),應(yīng)該斷開引腳與回調(diào)函數(shù)的連接;或者當(dāng)需要將一個(gè)引腳的回調(diào)函數(shù)重新連接到另外一個(gè)函數(shù)時(shí),應(yīng)該先斷開當(dāng)前連接的回調(diào)函數(shù),再重新連接到新的回調(diào)函數(shù)。其函數(shù)原型為:

其中的Pin 為引腳編號(hào),格式為PIOx_x,比如PIO0_0,斷開相應(yīng)引腳的連接函數(shù);pfn_callback 為回調(diào)函數(shù),應(yīng)該與連接函數(shù)對(duì)應(yīng)的回調(diào)函數(shù)一致;p_arg 為回調(diào)函數(shù)的參數(shù)為void *型,應(yīng)該與連接函數(shù)對(duì)應(yīng)的回調(diào)函數(shù)參數(shù)一致。如果返回AM_OK,說明斷開連接成功,使用范例詳見程序清單5.19。

程序清單5.19 am_gpio_trigger_disconnect()范例程序

4. 打開引腳觸發(fā)

打開引腳觸發(fā),只有打開引腳觸發(fā)后,引腳觸發(fā)才開始工作。在打開引腳觸發(fā)之前,應(yīng)該確保正確連接了回調(diào)函數(shù)并設(shè)置了相應(yīng)的觸發(fā)條件。其函數(shù)原型為:

其中的pin 為引腳編號(hào),格式為PIOx_x,比如PIO0_0,打開相應(yīng)引腳的觸發(fā)。如果返回AM_OK,說明打開成功,使用范例詳見程序清單5.20。

程序清單5.20 am_gpio_trigger_on ()范例程序

5. 關(guān)閉引腳觸發(fā)

關(guān)閉后,引腳觸發(fā)將停止工作,即相應(yīng)觸發(fā)條件滿足后,不會(huì)調(diào)用引腳相應(yīng)的回調(diào)函數(shù)。如需引腳觸發(fā)繼續(xù)工作,可以使用am_gpio_trigger_on()重新打開引腳觸發(fā)。其函數(shù)原型為:

其中的pin 為引腳編號(hào),格式為PIOx_x,比如,PIO0_0,關(guān)閉相應(yīng)引腳的觸發(fā)。如果返回AM_OK,說明關(guān)閉引腳觸發(fā)成功,使用范例詳見程序清單5.21。

程序清單5.21 am_gpio_trigger_off()范例程序


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:周立功:深入淺出AMetal——接口與實(shí)現(xiàn)

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳解ametal_鍵盤掃描接口和pwm接口技術(shù)

    第五章為深入淺出AMetal,本文內(nèi)容為5.3 鍵盤掃描接口和5.4 PWM 接口。
    的頭像 發(fā)表于 12-07 08:16 ?7164次閱讀
    詳解<b class='flag-5'>ametal</b>_鍵盤掃描<b class='flag-5'>接口</b>和pwm<b class='flag-5'>接口</b>技術(shù)

    深入淺出AVR

    深入淺出AVR,一本書。
    發(fā)表于 07-15 12:02

    深入淺出玩轉(zhuǎn)FPGA

    深入淺出玩轉(zhuǎn)FPGA
    發(fā)表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發(fā)表于 08-18 10:12

    HDMI技術(shù)深入淺出

    HDMI技術(shù)深入淺出
    發(fā)表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發(fā)表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發(fā)表于 04-26 10:48

    深入淺出安防視頻監(jiān)控系統(tǒng)

    深入淺出安防視頻監(jiān)控系統(tǒng)深入淺出安防視頻監(jiān)控系統(tǒng)
    發(fā)表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發(fā)表于 08-23 10:10

    深入淺出數(shù)據(jù)分析

    深入淺出數(shù)據(jù)分析,有需要的朋友下來看看。
    發(fā)表于 01-15 14:22 ?0次下載

    STM32深入淺出新手篇

    STM32深入淺出新手篇,很好的單片機(jī)學(xué)習(xí)資料。
    發(fā)表于 03-21 17:43 ?128次下載

    深入淺出談多層面板布線技巧

    深入淺出談多層面板布線技巧
    發(fā)表于 12-13 22:20 ?0次下載

    深入淺出Android—Android開發(fā)經(jīng)典教材

    深入淺出Android—Android開發(fā)經(jīng)典教材
    發(fā)表于 10-24 08:52 ?15次下載
    <b class='flag-5'>深入淺出</b>Android—Android開發(fā)經(jīng)典教材

    深入淺出數(shù)字信號(hào)處理

    深入淺出數(shù)字信號(hào)處理
    發(fā)表于 12-07 20:14 ?487次閱讀

    深入淺出學(xué)習(xí)250個(gè)通信原理資源下載

    深入淺出學(xué)習(xí)250個(gè)通信原理資源下載
    發(fā)表于 04-12 09:16 ?28次下載