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

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

3天内不再提示

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

AGk5_ZLG_zhiyua 来源:未知 2022-12-16 11:40 次阅读
e6135ef8-7cf2-11ed-8abf-dac502259ad0.gif AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP GPIO外设基本用法。

e622fe1c-7cf2-11ed-8abf-dac502259ad0.jpg  简介

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

e622fe1c-7cf2-11ed-8abf-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_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参数可以是一个或者多个相关宏定义的组合,简单示例如下:

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。

e622fe1c-7cf2-11ed-8abf-dac502259ad0.jpg  使用样例

AWorksLP SDK相关使用请参考《AWorksLP SDK快速入门(MR6450)——开箱体验》一文,本文不再赘述。1.通用IO功能

{SDK}demosperipheralgpio路径下为通用GPIO例程,例程具体代码如下:

#include "aworks.h"
#include "aw_delay.h"
#include "aw_gpio.h"
#include "aw_vdebug.h"


/**
 * 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的周期持续闪烁 */
  for (i = 0; i < 40; i++) {
    aw_gpio_toggle(gpio);
    aw_mdelay(100);
  }
 
  aw_kprintf("
GPIO demo exit...
");
}

上述代码中使用aw_gpio_set和aw_gpio_toggle接口分别实现了500ms时间间隔的引脚5次反转以及100ms时间间隔引脚40次反转。在HPM的SDK中,传入该例程函数的引脚为RUN灯,所以最终的实验现象是LED灯先以较慢的速度闪烁,后以较快的速度闪烁,RUN灯的位置如图1所示。

e65d55a8-7cf2-11ed-8abf-dac502259ad0.png

图1运行灯

2.中断功能

{SDK}demosperipheralint路径下为通用中断例程,例程具体代码如下:

#include "aworks.h"
#include "aw_gpio.h"
#include "aw_sem.h"
#include "aw_vdebug.h"
#include "aw_delay.h"
#include "aw_int.h"


/**rief 记录是否产生中断 */
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("
interrupt demo testing...
");
  
   /* 信号量初始化 */
  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!
");
     return;
   }
   
  /* 配置为 TRIGGER_FLAG 对应方式触发 */
  err = aw_gpio_trigger_cfg(interrupt_pin, TRIGGER_FLAG);
  if (err != AW_OK) {
    aw_kprintf("gpio trigger cfg failed!
");
    return;
  }
   
  /* 开启引脚的触发 */
  err = aw_gpio_trigger_on(interrupt_pin);
  if (err != AW_OK) {
    aw_kprintf("gpio trigger on failed!
");
    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!
");
    }
#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!
");
      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...
");
}

在例程代码中通过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接口,则可看到在上位机中打印下图信息,表明中断触发成功。

e6ac7fb6-7cf2-11ed-8abf-dac502259ad0.png

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

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

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

e6c42332-7cf2-11ed-8abf-dac502259ad0.jpg

e6d703b2-7cf2-11ed-8abf-dac502259ad0.jpg

e7677d84-7cf2-11ed-8abf-dac502259ad0.jpge77bdd38-7cf2-11ed-8abf-dac502259ad0.jpge78e8cf8-7cf2-11ed-8abf-dac502259ad0.jpge7adb31c-7cf2-11ed-8abf-dac502259ad0.jpge7bcf584-7cf2-11ed-8abf-dac502259ad0.jpge7ce55fe-7cf2-11ed-8abf-dac502259ad0.jpg


原文标题:【产品应用】AWorksLP样例详解(MR6450)-- GPIO

文章出处:【微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

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

    关注

    13

    文章

    397

    浏览量

    31066

原文标题:【产品应用】AWorksLP样例详解(MR6450)-- GPIO

文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    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

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

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

    gpio子系统API详解

    gpio 子系统 API gpio 子系统中操作一个 GPIO 需要如下几步: 1、of_find_compatible_node2、of_get_named_gpio3、
    的头像 发表于 09-27 17:17 473次阅读
    <b class='flag-5'>gpio</b>子系统API<b class='flag-5'>详解</b>

    AWorksLP 样例详解MR6750)——双核通信

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP双核通信的基本用法。简介通信信箱MBX有2套寄存器访问
    的头像 发表于 09-27 08:26 375次阅读
    <b class='flag-5'>AWorksLP</b> 样例<b class='flag-5'>详解</b>(<b class='flag-5'>MR</b>6750)——双核通信

    敏矽微电子Cortex-M0学习笔记04——GPIO详解及应用实例

    敏矽微电子Cortex-M0学习笔记04——GPIO详解及应用实例
    的头像 发表于 09-26 17:07 604次阅读
    敏矽微电子Cortex-M0学习笔记04——<b class='flag-5'>GPIO</b><b class='flag-5'>详解</b>及应用实例

    AWorksLP 样例详解MR6750)——双核调试

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP双核调试的基本用法。简介MR6750双核是
    的头像 发表于 09-23 08:26 330次阅读
    <b class='flag-5'>AWorksLP</b> 样例<b class='flag-5'>详解</b>(<b class='flag-5'>MR</b>6750)——双核调试

    AWorksLP 样例详解MR6750)——双核烧录

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP双核烧录的方法。简介MR6750双核是集成
    的头像 发表于 09-21 08:26 339次阅读
    <b class='flag-5'>AWorksLP</b> 样例<b class='flag-5'>详解</b>(<b class='flag-5'>MR</b>6750)——双核烧录

    国产操作系统AWorks LP — 科技自立自强的排头兵

    ZLG致远电子一直在科技仪器设备、操作系统国产化道路深耕多年,推出的新一代国产化工业物联网解决方案:AWorksLP操作系统搭配国产MR6450核心板,助力用户快速开发出具有市场竞争力的产品。ZLG
    的头像 发表于 08-03 08:28 325次阅读
    国产操作系统AWorks LP — 科技自立自强的排头兵

    EPC6450-AWI工控板搭载MR6450核心板,强势来袭!

    EPC6450-AWI基于完全国产自主研发的MR6450核心板进行开发,接口丰富,性能强劲,本文将为您详细介绍该工控单板。 EPC6450-AWI工控单板是基于MR6450核心板进行开
    的头像 发表于 07-12 11:45 266次阅读
    EPC<b class='flag-5'>6450</b>-AWI工控板搭载<b class='flag-5'>MR6450</b>核心板,强势来袭!

    一文详解GPIO的输出配置

    引言:GPIO,即General purpose input output,通用输入输出端口,是可以根据实际使用场景需求来用软件来配置的引脚。需要注意的是,一款芯片的引脚分为其实分为很多域,比如仅为
    发表于 06-14 16:41 1913次阅读
    一文<b class='flag-5'>详解</b><b class='flag-5'>GPIO</b>的输出配置

    一文详解GPIO的输入配置

    引言:GPIO,即General purpose input output,通用输入输出端口,是可以根据实际使用场景需求来用软件来配置的引脚。需要注意的是,一款芯片的引脚分为其实分为很多域,比如仅为
    发表于 06-14 16:41 2969次阅读
    一文<b class='flag-5'>详解</b><b class='flag-5'>GPIO</b>的输入配置

    致远电子2023年文章月度回顾 | 2023.05期

    给设备? ꔷ  AWorksLP例程介绍(MR6450)— SD卡 ꔷ  基于CAN智慧云实现远程ECU升级 ꔷ  基
    的头像 发表于 06-08 17:00 251次阅读

    HPM6750和HPM6450是PIN to PIN的吗?

    相同的封装,HPM6750和HPM6450是PINto PIN的吗?
    发表于 06-08 08:27

    产品应用AWorksLP例程介绍(MR6450)—— SD卡

    AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP基于FatFs的SD卡的基本用法。简介SD
    的头像 发表于 05-10 09:42 370次阅读
    【<b class='flag-5'>产品应用</b>】<b class='flag-5'>AWorksLP</b>例程介绍(<b class='flag-5'>MR6450</b>)—— SD卡

    介绍AWorksLP基于FatFs的SD卡的基本用法

    AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。
    的头像 发表于 05-08 16:23 535次阅读
    介绍<b class='flag-5'>AWorksLP</b>基于FatFs的SD卡的基本用法