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

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

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

【產(chǎn)品應(yīng)用】AWorksLP樣例詳解(MR6450)-- GPIO

ZLG致遠(yuǎn)電子 ? 2022-12-19 15:23 ? 次閱讀

AWorksLP對(duì)外設(shè)進(jìn)行了高度抽象化,為同一類外設(shè)提供了相同的接口,應(yīng)用程序可以輕松跨平臺(tái)。本文以MR6450平臺(tái)為例,介紹AWorksLP GPIO外設(shè)基本用法。

4b4a9c7a-7e54-11ed-b116-dac502259ad0.jpg ?簡介

GPIO(General Purpose Input and Output)是通用輸入輸出口。通俗地說,就是一些引腳,可以通過它們對(duì)外輸出電平信號(hào)或者通過它們讀取外部的電平信息。將I/O口用作普通輸入/輸出功能時(shí),有兩種常見的使用方式:一種是用作普通的輸入/輸出接口;一種是用作中斷輸入接口,即當(dāng)指定的輸入狀態(tài)事件發(fā)生(比如:下降沿)時(shí),觸發(fā)用戶自定義的回調(diào)函數(shù)。


4b4a9c7a-7e54-11ed-b116-dac502259ad0.jpg ?接口介紹

函數(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);連接一個(gè)回調(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功能時(shí),flags參數(shù)詳見下表。

GPIO屬性配置表:

GPIO屬性

宏定義

描述

GPIO模式AW_PIN_CFG_GPIO_INPUT1<<0輸入模式
AW_PIN_CFG_GPIO_OUTPUT2<<0輸出模式
AW_PIN_CFG_GPIO_OUTPUT_LOW3<<0輸出模式且輸出低
AW_PIN_CFG_GPIO_OUTPUT_HIGH4<<0輸出模式且輸出高
上下拉功能AW_PIN_CFG_FLOAT0<<3浮空
AW_PIN_CFG_PULL_UP1<<3上拉
AW_PIN_CFG_PULL_DOWN2<<3下拉
AW_PIN_CFG_PULL_UP_DOWN3<<3同時(shí)使能上下拉
輸出模式AW_PIN_CFG_OUTPUT_MODE_DRIVE0<<5直接輸出
AW_PIN_CFG_OUTPUT_MODE_OPEN_DRAIN1<<5開漏輸出
AW_PIN_CFG_OUTPUT_MODE_PUSH_PULL2<<5推挽輸出

配置時(shí),flags參數(shù)可以是一個(gè)或者多個(gè)相關(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)用配置時(shí),若上表中GPIO屬性值存在缺省時(shí),則會(huì)使用未偏移前對(duì)應(yīng)值為0的宏定義默認(rèn)填充,如上述示例中l(wèi)ine3;
  • 配置時(shí)需一次性將flags進(jìn)行傳入,不能每次傳遞一個(gè)屬性進(jìn)行配置進(jìn)行多次調(diào)用,否則可能和期望配置結(jié)果不匹配。

使用 aw_gpio_trigger_cfg(int pin, uint32_t flags)接口配置引腳中斷時(shí),flags參數(shù)見下表。

GPIO中斷配置表:

宏定義

描述

AW_GPIO_TRIGGER_HIGH高電平觸發(fā)
AW_GPIO_TRIGGER_LOW低電平觸發(fā)
AW_GPIO_TRIGGER_RISE上升沿觸發(fā)
AW_GPIO_TRIGGER_FALL下降沿觸發(fā)

配置時(shí),flags參數(shù)可以是一個(gè)或者多個(gè)上表宏定義的組合,簡單示例如下:

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);

注意:

  • 當(dāng)設(shè)置為不合理?xiàng)l件觸發(fā)組合(如 AW_GPIO_TRIGGER_HIGH | AW_GPIO_TRIGGER_FALL)時(shí),該函數(shù)會(huì)返回-AW_EINVAL。


4b4a9c7a-7e54-11ed-b116-dac502259ad0.jpg ?使用樣例

AWorksLP SDK相關(guān)使用請(qǐng)參考《AWorksLP SDK快速入門(MR6450)——開箱體驗(yàn)》一文,本文不再贅述。
1.通用IO功能

{SDK}\demos\peripheral\gpio路徑下為通用GPIO例程,例程具體代碼如下:

#include "aworks.h"#include "aw_delay.h"#include "aw_gpio.h"#include "aw_vdebug.h"
/** * \brief GPIO demo 入口 * \return 無 */void demo_gpio_entry (int gpio){ int i = 0;
aw_kprintf("\nGPIO demo testing...\r\n");
/* 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("\nGPIO demo exit...\r\n");}

上述代碼中使用aw_gpio_set和aw_gpio_toggle接口分別實(shí)現(xiàn)了500ms時(shí)間間隔的引腳5次反轉(zhuǎn)以及100ms時(shí)間間隔引腳40次反轉(zhuǎn)。在HPM的SDK中,傳入該例程函數(shù)的引腳為RUN燈,所以最終的實(shí)驗(yàn)現(xiàn)象是LED燈先以較慢的速度閃爍,后以較快的速度閃爍,RUN燈的位置如圖1所示。

4b5d1a44-7e54-11ed-b116-dac502259ad0.png

圖1運(yùn)行燈

2.中斷功能

{SDK}\demos\peripheral\int路徑下為通用中斷例程,例程具體代碼如下:

#include "aworks.h"#include "aw_gpio.h"#include "aw_sem.h"#include "aw_vdebug.h"#include "aw_delay.h"#include "aw_int.h"
/**\brief 記錄是否產(chǎn)生中斷 */AW_SEMB_DECL_STATIC(__gpio_intr_semb);#define TRIGGER_FLAG AW_GPIO_TRIGGER_RISE
static void __test_gpio_trig_isr (void* arg){ int interrupt_pin = (int)arg;#if TRIGGER_FLAG == AW_GPIO_TRIGGER_LOW || TRIGGER_FLAG == AW_GPIO_TRIGGER_HIGH /* 關(guān)閉觸發(fā)中斷,避免電平觸發(fā)時(shí)不停地進(jìn)中斷導(dǎo)致程序無法繼續(xù)運(yùn)行 */ aw_gpio_trigger_off(interrupt_pin);#endif AW_SEMB_GIVE(__gpio_intr_semb);}
void demo_interrupt_entry (int output_pin, int interrupt_pin){ aw_err_t err; int i; aw_kprintf("\ninterrupt demo testing...\r\n"); /* 信號(hào)量初始化 */ 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!\n"); return; } /* 配置為 TRIGGER_FLAG 對(duì)應(yīng)方式觸發(fā) */ err = aw_gpio_trigger_cfg(interrupt_pin, TRIGGER_FLAG); if (err != AW_OK) { aw_kprintf("gpio trigger cfg failed!\n"); return; } /* 開啟引腳的觸發(fā) */ err = aw_gpio_trigger_on(interrupt_pin); if (err != AW_OK) { aw_kprintf("gpio trigger on failed!\n"); 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!\n"); ? ? ? ?}#if TRIGGER_FLAG == AW_GPIO_TRIGGER_LOW || TRIGGER_FLAG == AW_GPIO_TRIGGER_HIGH ? ? ? ?/* 打開在回調(diào)函數(shù)中關(guān)閉的觸發(fā)中斷 */ ? ? ? ?err = aw_gpio_trigger_on(interrupt_pin); ? ? ? ?if (err != AW_OK) { ? ? ? ? ? ?aw_kprintf("gpio trigger on failed!\n"); ? ? ? ? ? ?return; ? ? ? ?}#endif ? ? ? ?/* 設(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); ? ? ? ? ? ? ? ? ?/* 終止信號(hào)量 */ ? ?AW_SEMB_TERMINATE(__gpio_intr_semb); ? ? ? ? ? ? ?aw_kprintf("interrupt demo exit...\r\n");}

在例程代碼中通過aw_gpio_trigger_connect、aw_gpio_trigger_cfg、aw_gpio_trigger_on三個(gè)接口配置interrupt_pin引腳中斷觸發(fā)模式為AW_GPIO_TRIGGER_RISE、中斷回調(diào)函數(shù)為__test_gpio_trig_isr并對(duì)中斷進(jìn)行使能,同時(shí)配置output_pin持續(xù)翻轉(zhuǎn)作為中斷源的提供引腳,當(dāng)output_pin 輸出滿足例程的中斷條件時(shí),會(huì)觸發(fā)中斷進(jìn)入__test_gpio_trig_isr函數(shù)釋放_(tái)_gpio_intr_semb信號(hào)量,在例程中獲取信號(hào)量成功后并打印"enter gpio interrupt!"。

例程中默認(rèn)使用中斷例程輸出信號(hào)引腳為PIN_PF08、中斷測試引腳為PF09,但由于本文測試所使用開發(fā)板并未引出該組引腳,故使用開發(fā)板上絲印URX1(PIN_PE24)做信號(hào)輸出引腳與UTX1(PIN_PE25)做中斷引腳進(jìn)行測試,需修改main.c文件中TEST_OUTPUT_PIN與TEST_INTERRUPT_PIN宏定義,修改后如下所示:


#define TEST_OUTPUT_PIN PIN_PE24#define TEST_INTERRUPT_PIN PIN_PE25

修改完成后,重新編譯工程并下載固件至開發(fā)板中,將開發(fā)板絲印URX1與UTX1引腳短接,并使用串口工具連接至DUART接口,則可看到在上位機(jī)中打印下圖信息,表明中斷觸發(fā)成功。

4b6a2432-7e54-11ed-b116-dac502259ad0.png

圖2串口打印信息注意事項(xiàng):

  • aw_gpio_trigger_connect函數(shù)所連接的回調(diào)函數(shù)是在中斷中進(jìn)行調(diào)用的,故該函數(shù)的實(shí)現(xiàn)需盡量的簡短、高效,避免執(zhí)行時(shí)間過長,否則可能會(huì)影響OS的實(shí)時(shí)性;
  • 若中斷觸發(fā)條件為電平觸發(fā)時(shí),需在中斷回調(diào)中關(guān)閉對(duì)應(yīng)引腳中斷,否則電平持續(xù)階段會(huì)一直產(chǎn)生中斷。

由于篇幅限制,樣例中僅選取了部分特性進(jìn)行講解,在使用時(shí)需根據(jù)實(shí)際情況配置相應(yīng)的觸發(fā)條件以滿足項(xiàng)目需求,更多引腳屬性功能使用以及中斷組合特性可自行調(diào)整測試。

本文對(duì)GPIO外設(shè)接口及樣例做了詳細(xì)介紹,當(dāng)然其他外設(shè)也會(huì)陸續(xù)發(fā)布,請(qǐng)大家關(guān)注后續(xù)推文更新~

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

    關(guān)注

    16

    文章

    1215

    瀏覽量

    52227
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    深蕾半導(dǎo)體開發(fā)者中心上線多個(gè)AI Demo

    近日深蕾半導(dǎo)體開發(fā)者中心更新了VS680 AI演示視頻、AI Demo、VS680快速開發(fā)手冊(cè)等相關(guān)內(nèi)容。
    的頭像 發(fā)表于 01-10 14:48 ?74次閱讀
    深蕾半導(dǎo)體開發(fā)者中心上線多個(gè)AI Demo<b class='flag-5'>樣</b><b class='flag-5'>例</b>

    GPIO錯(cuò)誤排查與解決

    在嵌入式系統(tǒng)和微控制器編程中,通用輸入輸出(GPIO)是最常見的接口之一。然而,在使用GPIO時(shí),我們可能會(huì)遇到各種錯(cuò)誤。 1. 理解GPIO GPIO是微控制器上的一組引腳,可以被配
    的頭像 發(fā)表于 01-09 09:46 ?174次閱讀

    為何ZLG致遠(yuǎn)電子要推出LGA嵌入式核心板?

    、MR6450等5個(gè)系列,共12個(gè)型號(hào)的LGA形態(tài)的嵌入式核心板,涵蓋了ARM9、A7、RISC-V等不同處理器架構(gòu)。為什么有板對(duì)板連接器之后,我們還要推出LGA
    的頭像 發(fā)表于 11-30 01:04 ?221次閱讀
    為何ZLG致遠(yuǎn)電子要推出LGA嵌入式核心板?

    GPIO內(nèi)部電路的原理

    原理 前言 GPIO內(nèi)部結(jié)構(gòu)概覽 GPIO內(nèi)部結(jié)構(gòu)詳解 保護(hù)電路 輸出電路 推挽輸出 開漏輸出 輸入電路 總結(jié) 參考資料 GPIO內(nèi)部結(jié)構(gòu)概覽 結(jié)構(gòu)關(guān)系圖如下圖所示
    的頭像 發(fā)表于 11-20 09:24 ?388次閱讀
    <b class='flag-5'>GPIO</b>內(nèi)部電路的原理

    差分硅振替換SiTime產(chǎn)品應(yīng)用于SSD,相位抖動(dòng)低于350fs

    差分硅振替換SiTime產(chǎn)品應(yīng)用于SSD,相位抖動(dòng)低于350fs
    的頭像 發(fā)表于 11-08 09:41 ?231次閱讀
    差分硅振替換SiTime<b class='flag-5'>產(chǎn)品應(yīng)用</b>于SSD,相位抖動(dòng)低于350fs

    SOC GPIO操作

    sapphire Soc提供了兩個(gè)GPIO組每組有4個(gè)GPIO,定義為GPIO[3:0],其中只有GPIO[1:0]可以支持中斷。中斷在程序中打開了
    的頭像 發(fā)表于 11-01 11:06 ?164次閱讀

    使用官方SDK開發(fā)6450

    官網(wǎng)提供的SDK芯片類型沒有包含HPM6450,如何添加6450到SDK中有人知道么?
    發(fā)表于 10-24 14:51

    TPA3255產(chǎn)品應(yīng)用在消防廣播,固定輸入下, 如果輸出負(fù)載變化時(shí),輸出電壓還能保持不變嗎?

    產(chǎn)品應(yīng)用在消防廣播或者公共廣播。 固定輸入下, 如果輸出負(fù)載變化時(shí),輸出電壓還能保持不變嗎? 如果是100V定壓 接20歐姆負(fù)載 能輸出500W功率.
    發(fā)表于 10-09 08:07

    STM32 GPIO八種模式及工作原理詳解

    一. 前言 ??GPIO全稱General Purpose Input Output,是微控制數(shù)字輸入/輸出的基本模塊,可以實(shí)現(xiàn)微控制器與外部環(huán)境的數(shù)字進(jìn)行交換。借助GPIO微控制器可以實(shí)現(xiàn)對(duì)外
    的頭像 發(fā)表于 07-22 09:32 ?6704次閱讀
    STM32 <b class='flag-5'>GPIO</b>八種模式及工作原理<b class='flag-5'>詳解</b>

    武漢凡谷:現(xiàn)階段已有產(chǎn)品應(yīng)用到5.5G系統(tǒng)

    近日,武漢凡谷在接受機(jī)構(gòu)調(diào)研時(shí)表示,公司具備5.5G方面的產(chǎn)品,如多頻多通道濾波器,現(xiàn)階段有相關(guān)的產(chǎn)品應(yīng)用到客戶的5.5G系統(tǒng)。
    的頭像 發(fā)表于 05-20 09:54 ?570次閱讀

    什么是GPIOGPIO組成原理

    GPIO全拼叫General Purpose Input Output(通用輸入輸出)簡稱IO口也叫總線擴(kuò)展器,GPIO口是由引腳,功能寄存器組成,不同的架構(gòu)中的GPIO封裝不同,所使用的引腳數(shù)與寄存器數(shù)不同,具體可以參考芯片手
    發(fā)表于 04-28 12:30 ?7207次閱讀
    什么是<b class='flag-5'>GPIO</b>?<b class='flag-5'>GPIO</b>組成原理

    MCU啟動(dòng)失敗竟因GPIO先上電?

    由于 RT1060 上 GPIO_AD_Bx 和 GPIO_Bx 兩組 PAD 供電均來自于 NVCC_GPIO,當(dāng)其中任何一個(gè) GPIO 有電壓時(shí),均可能會(huì)漏電到 NVCC_
    發(fā)表于 03-28 10:32 ?842次閱讀
    MCU啟動(dòng)失敗竟因<b class='flag-5'>GPIO</b>先上電?

    AI時(shí)代下的場效應(yīng)管功能運(yùn)用與產(chǎn)品應(yīng)用

    AI時(shí)代下的場效應(yīng)管功能運(yùn)用與產(chǎn)品應(yīng)用
    的頭像 發(fā)表于 03-25 15:07 ?668次閱讀
    AI時(shí)代下的場效應(yīng)管功能運(yùn)用與<b class='flag-5'>產(chǎn)品應(yīng)用</b>

    GPIO,RTE配置完后會(huì)有xmc_gpio.h、xmc1_gpio.h、xmc_gpio.c、xmc1_gpio.c,四個(gè)的關(guān)系是什么的?

    GPIO,RTE配置完后,會(huì)有xmc_gpio.h、xmc1_gpio.h、xmc_gpio.c、xmc1_
    發(fā)表于 01-29 06:24

    AMAZINGIC晶焱科技:面板產(chǎn)品應(yīng)用的EOS最佳解決方案

    AMAZINGIC晶焱科技:面板產(chǎn)品應(yīng)用的EOS最佳解決方案
    的頭像 發(fā)表于 01-24 10:16 ?649次閱讀