0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【产品应用】AWorksLP样例详解(MR6450)-- GPIO

ZLG致远电子 2022-12-19 15:23 次阅读

AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP GPIO外设基本用法。

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

GPIO(General Purpose Input and Output)是通用输入输出口。通俗地说,就是一些引脚,可以通过它们对外输出电平信号或者通过它们读取外部的电平信息。将I/O口用作普通输入/输出功能时,有两种常见的使用方式:一种是用作普通的输入/输出接口;一种是用作中断输入接口,即当指定的输入状态事件发生(比如:下降沿)时,触发用户自定义的回调函数。


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

函数列表:

函数原型

简要描述

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);设置引脚输出值
aw_err_t aw_gpio_toggle (int pin);翻转引脚的输出值,即高电平变低电平,低电平变高电平
aw_err_t aw_gpio_trigger_cfg (int pin, uint32_t flags);配置引脚“触发条件”,触发条件可位或
aw_err_t aw_gpio_trigger_connect (int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg);连接一个回调函数到引脚
aw_err_t aw_gpio_trigger_disconnect (int pin, aw_pfuncvoid_t pfunc_callback, void *p_arg);断开引脚的回调函数
aw_err_t aw_gpio_trigger_on (int pin);开启引脚的触发功能
aw_err_t aw_gpio_trigger_off (int pin);关闭指定引脚的触发功能

使用aw_pin_cfg (int pin, uint32_t flags)接口配置pin为gpio功能时,flags参数详见下表。

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同时使能上下拉
输出模式AW_PIN_CFG_OUTPUT_MODE_DRIVE0<<5直接输出
AW_PIN_CFG_OUTPUT_MODE_OPEN_DRAIN1<<5开漏输出
AW_PIN_CFG_OUTPUT_MODE_PUSH_PULL2<<5推挽输出

配置时,flags参数可以是一个或者多个相关宏定义的组合,简单示例如下:

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)

注意:

  • 调用配置时,若上表中GPIO属性值存在缺省时,则会使用未偏移前对应值为0的宏定义默认填充,如上述示例中line3;
  • 配置时需一次性将flags进行传入,不能每次传递一个属性进行配置进行多次调用,否则可能和期望配置结果不匹配。

使用 aw_gpio_trigger_cfg(int pin, uint32_t flags)接口配置引脚中断时,flags参数见下表。

GPIO中断配置表:

宏定义

描述

AW_GPIO_TRIGGER_HIGH高电平触发
AW_GPIO_TRIGGER_LOW低电平触发
AW_GPIO_TRIGGER_RISE上升沿触发
AW_GPIO_TRIGGER_FALL下降沿触发

配置时,flags参数可以是一个或者多个上表宏定义的组合,简单示例如下:

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 ); /* 双边沿触发 */aw_pin_cfg(pin, AW_GPIO_TRIGGER_RISE | AW_GPIO_TRIGGER_FALL);

注意:

  • 当设置为不合理条件触发组合(如 AW_GPIO_TRIGGER_HIGH | AW_GPIO_TRIGGER_FALL)时,该函数会返回-AW_EINVAL。


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

AWorksLP SDK相关使用请参考《AWorksLP SDK快速入门(MR6450)——开箱体验》一文,本文不再赘述。
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的周期持续闪烁 */ 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接口分别实现了500ms时间间隔的引脚5次反转以及100ms时间间隔引脚40次反转。在HPM的SDK中,传入该例程函数的引脚为RUN灯,所以最终的实验现象是LED灯先以较慢的速度闪烁,后以较快的速度闪烁,RUN灯的位置如图1所示。

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

图1运行灯

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 记录是否产生中断 */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 /* 关闭触发中断,避免电平触发时不停地进中断导致程序无法继续运行 */ 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"); /* 信号量初始化 */ AW_SEMB_INIT(__gpio_intr_semb, AW_SEM_EMPTY, AW_SEM_Q_FIFO); /* 连接中断回调函数 */ 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 对应方式触发 */ err = aw_gpio_trigger_cfg(interrupt_pin, TRIGGER_FLAG); if (err != AW_OK) { aw_kprintf("gpio trigger cfg failed!\n"); return; } /* 开启引脚的触发 */ 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++) {            /* 设置输出管脚为低电平 */        aw_gpio_set(output_pin, 0);            /* 等待中断触发 */        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        /* 打开在回调函数中关闭的触发中断 */        err = aw_gpio_trigger_on(interrupt_pin);        if (err != AW_OK) {            aw_kprintf("gpio trigger on failed!\n");            return;        }#endif        /* 设置输出管脚为高电平 */        aw_gpio_set(output_pin, 1);                  aw_mdelay(100);    }              /* 断开中断连接回调函数 */    aw_gpio_trigger_disconnect(interrupt_pin,                               __test_gpio_trig_isr,                               (void *)interrupt_pin);              /* 关闭引脚的触发 */    aw_gpio_trigger_off(interrupt_pin);                  /* 终止信号量 */    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三个接口配置interrupt_pin引脚中断触发模式为AW_GPIO_TRIGGER_RISE、中断回调函数为__test_gpio_trig_isr并对中断进行使能,同时配置output_pin持续翻转作为中断源的提供引脚,当output_pin 输出满足例程的中断条件时,会触发中断进入__test_gpio_trig_isr函数释放__gpio_intr_semb信号量,在例程中获取信号量成功后并打印"enter gpio interrupt!"。

例程中默认使用中断例程输出信号引脚为PIN_PF08、中断测试引脚为PF09,但由于本文测试所使用开发板并未引出该组引脚,故使用开发板上丝印URX1(PIN_PE24)做信号输出引脚与UTX1(PIN_PE25)做中断引脚进行测试,需修改main.c文件中TEST_OUTPUT_PIN与TEST_INTERRUPT_PIN宏定义,修改后如下所示:


#define TEST_OUTPUT_PIN PIN_PE24#define TEST_INTERRUPT_PIN PIN_PE25

修改完成后,重新编译工程并下载固件至开发板中,将开发板丝印URX1与UTX1引脚短接,并使用串口工具连接至DUART接口,则可看到在上位机中打印下图信息,表明中断触发成功。

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

图2串口打印信息注意事项:

  • aw_gpio_trigger_connect函数所连接的回调函数是在中断中进行调用的,故该函数的实现需尽量的简短、高效,避免执行时间过长,否则可能会影响OS的实时性;
  • 若中断触发条件为电平触发时,需在中断回调中关闭对应引脚中断,否则电平持续阶段会一直产生中断。

由于篇幅限制,样例中仅选取了部分特性进行讲解,在使用时需根据实际情况配置相应的触发条件以满足项目需求,更多引脚属性功能使用以及中断组合特性可自行调整测试。

本文对GPIO外设接口及样例做了详细介绍,当然其他外设也会陆续发布,请大家关注后续推文更新~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GPIO
    +关注

    关注

    16

    文章

    1191

    浏览量

    51869
收藏 人收藏

    评论

    相关推荐

    差分硅振替换SiTime产品应用于SSD,相位抖动低于350fs

    差分硅振替换SiTime产品应用于SSD,相位抖动低于350fs
    的头像 发表于 11-08 09:41 109次阅读
    差分硅振替换SiTime<b class='flag-5'>产品应用</b>于SSD,相位抖动低于350fs

    SOC GPIO操作

    sapphire Soc提供了两个GPIO组每组有4个GPIO,定义为GPIO[3:0],其中只有GPIO[1:0]可以支持中断。中断在程序中打开了
    的头像 发表于 11-01 11:06 88次阅读

    使用官方SDK开发6450

    官网提供的SDK芯片类型没有包含HPM6450,如何添加6450到SDK中有人知道么?
    发表于 10-24 14:51

    TPA3255产品应用在消防广播,固定输入下, 如果输出负载变化时,输出电压还能保持不变吗?

    产品应用在消防广播或者公共广播。 固定输入下, 如果输出负载变化时,输出电压还能保持不变吗? 如果是100V定压 接20欧姆负载 能输出500W功率.
    发表于 10-09 08:07

    STM32 GPIO八种模式及工作原理详解

    一. 前言   GPIO全称General Purpose Input Output,是微控制数字输入/输出的基本模块,可以实现微控制器与外部环境的数字进行交换。借助GPIO微控制器可以实现对外
    的头像 发表于 07-22 09:32 5320次阅读
    STM32 <b class='flag-5'>GPIO</b>八种模式及工作原理<b class='flag-5'>详解</b>

    武汉凡谷:现阶段已有产品应用到5.5G系统

    近日,武汉凡谷在接受机构调研时表示,公司具备5.5G方面的产品,如多频多通道滤波器,现阶段有相关的产品应用到客户的5.5G系统。
    的头像 发表于 05-20 09:54 477次阅读

    什么是GPIOGPIO组成原理

    GPIO全拼叫General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,GPIO口是由引脚,功能寄存器组成,不同的架构中的GPIO封装不同,所使用的引脚数与寄存器数不同,具体可以参考芯片手
    发表于 04-28 12:30 6585次阅读
    什么是<b class='flag-5'>GPIO</b>?<b class='flag-5'>GPIO</b>组成原理

    MCU启动失败竟因GPIO先上电?

    由于 RT1060 上 GPIO_AD_Bx 和 GPIO_Bx 两组 PAD 供电均来自于 NVCC_GPIO,当其中任何一个 GPIO 有电压时,均可能会漏电到 NVCC_
    发表于 03-28 10:32 674次阅读
    MCU启动失败竟因<b class='flag-5'>GPIO</b>先上电?

    AI时代下的场效应管功能运用与产品应用

    AI时代下的场效应管功能运用与产品应用
    的头像 发表于 03-25 15:07 469次阅读
    AI时代下的场效应管功能运用与<b class='flag-5'>产品应用</b>

    GPIO,RTE配置完后会有xmc_gpio.h、xmc1_gpio.h、xmc_gpio.c、xmc1_gpio.c,四个的关系是什么的?

    GPIO,RTE配置完后,会有xmc_gpio.h、xmc1_gpio.h、xmc_gpio.c、xmc1_
    发表于 01-29 06:24

    AMAZINGIC晶焱科技:面板产品应用的EOS最佳解決方案

    AMAZINGIC晶焱科技:面板产品应用的EOS最佳解決方案
    的头像 发表于 01-24 10:16 563次阅读

    【2023电子工程师大会】基于RK3568的OH开发及ppt

    【2023电子工程师大会】基于RK3568的OH开发及ppt
    发表于 01-03 16:31 26次下载

    多家科创板公司明确表示已进入苹果MR产业链

    记者了解到,国内已有多家公司早早布局了MR产品,更有科创板公司明确表示已进入苹果MR产业链。
    发表于 12-21 14:21 446次阅读

    见合八方1550nm高功率蝶形SOA产品应用介绍

    电子发烧友网站提供《见合八方1550nm高功率蝶形SOA产品应用介绍.pdf》资料免费下载
    发表于 12-19 16:10 0次下载

    AWorksLP应用笔记:重定向printf函数

    printf函数作为标准库定义的格式化输出方式,本文将介绍其在AWorksLP下默认适配以及重映射至热拔插设备端口的实现。默认适配AWorksLP中默认已经对printf函数完成相关适配工作,且默认
    的头像 发表于 11-25 08:24 587次阅读
    <b class='flag-5'>AWorksLP</b>应用笔记:重定向printf函数