AWorksLP样例详解(MR6450)——GPIO

2022-12-30 0 635

AWorksLP对N53SI241SV展开了度概念化,由同两类N53SI241SV提供更多了完全相同的USB,插件能随心所欲虚拟化。责任编辑以MR6450网络平台为例,如是说AWorksLP GPION53SI241SV基本上用语。

AWorksLP样例详解(MR6450)——GPIO

ZLG微京东可买回

概要

GPIO(General Purpose Input and Output)是通用型SCSI口。浅显蔡伯介,是许多插口,能透过它对内输入阻抗讯号或是透过它加载内部的阻抗重要信息。 将I/O口用于一般输入/输入机能时,有三种常用的采用形式:两类是用于一般的输入/输入USB;两类是用于受阻输入USB,即选定的输入状况该事件出现(比如说:上升沿)时,促发采用者自订的反弹表达式。

USB如是说

表达式条目:

AWorksLP样例详解(MR6450)——GPIO

采用aw_pin_cfg (int pin, uint32_t flags) USB配置pin为gpio机能时,flags参数详见下表。

GPIO属性配置表:

AWorksLP样例详解(MR6450)——GPIO

配置时,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)USB配置插口受阻时,flags参数见下表。

GPIO受阻配置表:

AWorksLP样例详解(MR6450)——GPIO

配置时,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。

采用实例

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_toggleUSB分别实现了500ms时间间隔的插口5次反转以及100ms时间间隔插口40次反转。在HPM的SDK中,传入该例程表达式的插口为RUN灯,所以最终的实验现象是LED灯先以较慢的速度闪烁,后以较快的速度闪烁,RUN灯的位置如图1所示。

AWorksLP样例详解(MR6450)——GPIO

图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_RISEstatic 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三个USB配置interrupt_pin插口受阻促发模式为AW_GPIO_TRIGGER_RISE、受阻反弹表达式为__test_gpio_trig_isr并对受阻展开使能,同时配置output_pin持续翻转作为受阻源的提供更多插口,当output_pin 输入满足例程的受阻条件时,会促发受阻进入__test_gpio_trig_isr表达式释放__gpio_intr_semb讯号量,在

例程中默认采用受阻例程输入讯号插口为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插口短接,并采用串口工具连接至DUARTUSB,则可看到在上位机中打印下图重要信息,表明受阻促发成功。

AWorksLP样例详解(MR6450)——GPIO

图2 串口打印重要信息

注意事项:

aw_gpio_trigger_connect表达式所连接的反弹表达式是在受阻中展开调用的,故该表达式的实现需尽量的简短、高效,避免执行时间过长,否则可能会影响OS的实时性;

若受阻促发条件为阻抗促发时,需在受阻反弹中关闭对应插口受阻,否则阻抗持续阶段会一直产生受阻。

由于篇幅限制,实例中仅选取了部分特性展开讲解,在采用时需根据实际情况配置相应的促发条件以满足项目需求,更多插口属性机能采用以及受阻组合特性可自行调整测试。

责任编辑对GPION53SI241SVUSB及实例做了详细如是说,当然其他N53SI241SV也会陆续发布,请大家关注后续推文更新~

更多详细产品重要信息、技术干货,请关注微信公众号“ZLG致远电子”或“ZLG开发者社区”

举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务