??簡介
GPIO(General Purpose Input and Output)是通用輸入輸出口。通俗地說,就是一些引腳,可以通過它們對外輸出電平信號或者通過它們讀取外部的電平信息。將I/O口用作普通輸入/輸出功能時,有兩種常見的使用方式:一種是用作普通的輸入/輸出接口;一種是用作中斷輸入接口,即當指定的輸入狀態(tài)事件發(fā)生(比如:下降沿)時,觸發(fā)用戶自定義的回調(diào)函數(shù)。
??接口介紹
函數(shù)列表:
函數(shù)原型 |
簡要描述 |
aw_err_t aw_pin_cfg (int pin, uint32_t flags); |
配置引腳屬性 |
aw_err_t aw_gpio_get (int pin); |
讀取引腳的輸入/輸出值 |
aw_err_t aw_gpio_set (int pin, int value); |
設(shè)置引腳輸出值 |
aw_err_t aw_gpio_toggle (int pin); |
翻轉(zhuǎn)引腳的輸出值,即高電平變低電平,低電平變高電平 |
aw_err_t aw_gpio_trigger_cfg (int pin, uint32_t flags); |
配置引腳“觸發(fā)條件”,觸發(fā)條件可位或 |
aw_err_t aw_gpio_trigger_connect (int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg); |
連接一個回調(diào)函數(shù)到引腳 |
aw_err_t aw_gpio_trigger_disconnect (int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg); |
斷開引腳的回調(diào)函數(shù) |
aw_err_t aw_gpio_trigger_on (int pin); |
開啟引腳的觸發(fā)功能 |
aw_err_t aw_gpio_trigger_off (int pin); |
關(guān)閉指定引腳的觸發(fā)功能 |
使用aw_pin_cfg (int pin, uint32_t flags)接口配置pin為gpio功能時,flags參數(shù)詳見下表。
GPIO屬性配置表:
GPIO屬性 |
宏定義 |
值 |
描述 |
GPIO模式 |
AW_PIN_CFG_GPIO_INPUT |
1<<0 |
輸入模式 |
AW_PIN_CFG_GPIO_OUTPUT |
2<<0 |
輸出模式 |
|
AW_PIN_CFG_GPIO_OUTPUT_LOW |
3<<0 |
輸出模式且輸出低 |
|
AW_PIN_CFG_GPIO_OUTPUT_HIGH |
4<<0 |
輸出模式且輸出高 |
|
上下拉功能 |
AW_PIN_CFG_FLOAT |
0<<3 |
浮空 |
AW_PIN_CFG_PULL_UP |
1<<3 |
上拉 |
|
AW_PIN_CFG_PULL_DOWN |
2<<3 |
下拉 |
|
AW_PIN_CFG_PULL_UP_DOWN |
3<<3 |
同時使能上下拉 |
|
輸出模式 |
AW_PIN_CFG_OUTPUT_MODE_DRIVE |
0<<5 |
直接輸出 |
AW_PIN_CFG_OUTPUT_MODE_OPEN_DRAIN |
1<<5 |
開漏輸出 |
|
AW_PIN_CFG_OUTPUT_MODE_PUSH_PULL |
2<<5 |
推挽輸出 |
配置時,flags參數(shù)可以是一個或者多個相關(guān)宏定義的組合,簡單示例如下:
aw_pin_cfg(pin, AW_PIN_CFG_GPIO_INPUT);
/* 引腳配置為輸出,浮空(無上下拉),直接輸出 */
aw_pin_cfg(pin, AW_PIN_CFG_GPIO_OUTPUT);
aw_pin_cfg(pin, AW_PIN_CFG_GPIO_INPUT | AW_PIN_CFG_PULL_DOWN );
aw_pin_cfg(pin, AW_PIN_CFG_GPIO_OUTPUT| AW_PIN_CFG_OUTPUT_MODE_PUSH_PULL)
注意:- 調(diào)用配置時,若上表中GPIO屬性值存在缺省時,則會使用未偏移前對應(yīng)值為0的宏定義默認填充,如上述示例中l(wèi)ine3;
- 配置時需一次性將flags進行傳入,不能每次傳遞一個屬性進行配置進行多次調(diào)用,否則可能和期望配置結(jié)果不匹配。
GPIO中斷配置表:
宏定義 |
描述 |
AW_GPIO_TRIGGER_HIGH |
高電平觸發(fā) |
AW_GPIO_TRIGGER_LOW |
低電平觸發(fā) |
AW_GPIO_TRIGGER_RISE |
上升沿觸發(fā) |
AW_GPIO_TRIGGER_FALL |
下降沿觸發(fā) |
配置時,flags參數(shù)可以是一個或者多個上表宏定義的組合,簡單示例如下:
aw_gpio_trigger_cfg (pin, AW_GPIO_TRIGGER_HIGH);
aw_pin_cfg(pin, AW_GPIO_TRIGGER_RISE);
aw_pin_cfg(pin, AW_GPIO_TRIGGER_RISE | AW_GPIO_TRIGGER_HIGH );
/* 雙邊沿觸發(fā) */
aw_pin_cfg(pin, AW_GPIO_TRIGGER_RISE | AW_GPIO_TRIGGER_FALL);
注意:- 當設(shè)置為不合理條件觸發(fā)組合(如 AW_GPIO_TRIGGER_HIGH | AW_GPIO_TRIGGER_FALL)時,該函數(shù)會返回-AW_EINVAL。
??使用樣例
AWorksLP SDK相關(guān)使用請參考《AWorksLP SDK快速入門(MR6450)——開箱體驗》一文,本文不再贅述。1.通用IO功能{SDK}demosperipheralgpio路徑下為通用GPIO例程,例程具體代碼如下:
/**
* rief GPIO demo 入口
*
eturn 無
*/
void demo_gpio_entry (int gpio)
{
int i = 0;
aw_kprintf("
GPIO demo testing...
");
/* LED以1s的周期閃爍5次 */
for (i = 0; i < 5; i++) {
aw_gpio_set(gpio, 0);
aw_mdelay(500);
aw_gpio_set(gpio, 1);
aw_mdelay(500);
}
/* LED以0.2s的周期持續(xù)閃爍 */
for (i = 0; i < 40; i++) {
aw_gpio_toggle(gpio);
aw_mdelay(100);
}
aw_kprintf("
GPIO demo exit...
");
}
上述代碼中使用aw_gpio_set和aw_gpio_toggle接口分別實現(xiàn)了500ms時間間隔的引腳5次反轉(zhuǎn)以及100ms時間間隔引腳40次反轉(zhuǎn)。在HPM的SDK中,傳入該例程函數(shù)的引腳為RUN燈,所以最終的實驗現(xiàn)象是LED燈先以較慢的速度閃爍,后以較快的速度閃爍,RUN燈的位置如圖1所示。
圖1運行燈
2.中斷功能{SDK}demosperipheralint路徑下為通用中斷例程,例程具體代碼如下:
/**rief 記錄是否產(chǎn)生中斷 */
AW_SEMB_DECL_STATIC(__gpio_intr_semb);
static void __test_gpio_trig_isr (void* arg)
{
int interrupt_pin = (int)arg;
/* 關(guān)閉觸發(fā)中斷,避免電平觸發(fā)時不停地進中斷導(dǎo)致程序無法繼續(xù)運行 */
aw_gpio_trigger_off(interrupt_pin);
AW_SEMB_GIVE(__gpio_intr_semb);
}
void demo_interrupt_entry (int output_pin, int interrupt_pin)
{
aw_err_t err;
int i;
aw_kprintf("
interrupt demo testing...
");
/* 信號量初始化 */
AW_SEMB_INIT(__gpio_intr_semb, AW_SEM_EMPTY, AW_SEM_Q_FIFO);
/* 連接中斷回調(diào)函數(shù) */
err = aw_gpio_trigger_connect(interrupt_pin,
__test_gpio_trig_isr,
(void *)interrupt_pin);
if (err != AW_OK) {
aw_kprintf("gpio trigger connect failed!
");
return;
}
/* 配置為 TRIGGER_FLAG 對應(yīng)方式觸發(fā) */
err = aw_gpio_trigger_cfg(interrupt_pin, TRIGGER_FLAG);
if (err != AW_OK) {
aw_kprintf("gpio trigger cfg failed!
");
return;
}
/* 開啟引腳的觸發(fā) */
err = aw_gpio_trigger_on(interrupt_pin);
if (err != AW_OK) {
aw_kprintf("gpio trigger on failed!
");
return;
}
for (i = 0; i < 50; i++) {
/* 設(shè)置輸出管腳為低電平 */
aw_gpio_set(output_pin, 0);
/* 等待中斷觸發(fā) */
err = AW_SEMB_TAKE(__gpio_intr_semb, 1000);
if (err == AW_OK) {
aw_kprintf("enter gpio interrupt!
");
}
/* 打開在回調(diào)函數(shù)中關(guān)閉的觸發(fā)中斷 */
err = aw_gpio_trigger_on(interrupt_pin);
if (err != AW_OK) {
aw_kprintf("gpio trigger on failed!
");
return;
}
/* 設(shè)置輸出管腳為高電平 */
aw_gpio_set(output_pin, 1);
aw_mdelay(100);
}
/* 斷開中斷連接回調(diào)函數(shù) */
aw_gpio_trigger_disconnect(interrupt_pin,
__test_gpio_trig_isr,
(void *)interrupt_pin);
/* 關(guān)閉引腳的觸發(fā) */
aw_gpio_trigger_off(interrupt_pin);
/* 終止信號量 */
AW_SEMB_TERMINATE(__gpio_intr_semb);
aw_kprintf("interrupt demo exit...
");
}
在例程代碼中通過aw_gpio_trigger_connect、aw_gpio_trigger_cfg、aw_gpio_trigger_on三個接口配置interrupt_pin引腳中斷觸發(fā)模式為AW_GPIO_TRIGGER_RISE、中斷回調(diào)函數(shù)為__test_gpio_trig_isr并對中斷進行使能,同時配置output_pin持續(xù)翻轉(zhuǎn)作為中斷源的提供引腳,當output_pin 輸出滿足例程的中斷條件時,會觸發(fā)中斷進入__test_gpio_trig_isr函數(shù)釋放__gpio_intr_semb信號量,在例程中獲取信號量成功后并打印"enter gpio interrupt!"。
例程中默認使用中斷例程輸出信號引腳為PIN_PF08、中斷測試引腳為PF09,但由于本文測試所使用開發(fā)板并未引出該組引腳,故使用開發(fā)板上絲印URX1(PIN_PE24)做信號輸出引腳與UTX1(PIN_PE25)做中斷引腳進行測試,需修改main.c文件中TEST_OUTPUT_PIN與TEST_INTERRUPT_PIN宏定義,修改后如下所示:
修改完成后,重新編譯工程并下載固件至開發(fā)板中,將開發(fā)板絲印URX1與UTX1引腳短接,并使用串口工具連接至DUART接口,則可看到在上位機中打印下圖信息,表明中斷觸發(fā)成功。
圖2串口打印信息注意事項:
- aw_gpio_trigger_connect函數(shù)所連接的回調(diào)函數(shù)是在中斷中進行調(diào)用的,故該函數(shù)的實現(xiàn)需盡量的簡短、高效,避免執(zhí)行時間過長,否則可能會影響OS的實時性;
- 若中斷觸發(fā)條件為電平觸發(fā)時,需在中斷回調(diào)中關(guān)閉對應(yīng)引腳中斷,否則電平持續(xù)階段會一直產(chǎn)生中斷。
由于篇幅限制,樣例中僅選取了部分特性進行講解,在使用時需根據(jù)實際情況配置相應(yīng)的觸發(fā)條件以滿足項目需求,更多引腳屬性功能使用以及中斷組合特性可自行調(diào)整測試。
本文對GPIO外設(shè)接口及樣例做了詳細介紹,當然其他外設(shè)也會陸續(xù)發(fā)布,請大家關(guān)注后續(xù)推文更新~
-
致遠電子
+關(guān)注
關(guān)注
13文章
405瀏覽量
31255
原文標題:【產(chǎn)品應(yīng)用】AWorksLP樣例詳解(MR6450)-- GPIO
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論