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

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

3天内不再提示

英创信息技术用GPIO实现多路外部中断及脉冲计数简介

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-11 16:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

英创工控主板都给用户提供了丰富的GPIO资源,在ESMARC系列的板卡上配置了32位GPIO,GPIO(General-purpose input/output)即通用输入输出,在实际使用中有多种用途,而作为外部中断输入便是较常用的功能,通过对外部输入中断的响应,可以满足多种应用需求,脉冲计数就是一种典型的应用。英创主板已经给用户提供了两路中断功能,是采用异步IO的方式,电平上升沿触发中断,通过信号量SIGIO通知应用程序,关于详细的资料可以参考网站:《ESM335x外部中断输入应用》。

为了让用户能够使用到更多外部输入中断,英创公司进一步在驱动中增加了相应的功能和接口,利用IO多路复用的技术让所有GPIO都能够作为外部中断输入,通过程序设置使能,一旦管脚电平发生变化,内核就会通知应用程序,这时使用select或者poll函数就可以接收到内核发出的消息。通过这种方式,用户可以将主板的32位GPIO全部作为外部中断输入,而原来提供的采用异步IO方式的两路中断我们原则上就不再做更新和维护,建议客户使用我们最新提供的方法。下面就以两路GPIO的脉冲计数功能为例,介绍如何通过select或者poll函数实现外部中断响应。

首先要启用中断输入功能,这一步需要调用英创公司提供的设置GPIO为输入状态的API函数来实现。也就是在程序中调用一次函数,设置GPIO为输入状态,就能把对应的GPIO管脚设置为外部中断输入功能,如设置GPIO0和GPIO23为中断输入,代码如下:

int GPIO_OutDisable(fd, GPIO0 | GPIO23)

当设置完成后,GPIO作为输入状态,同时会监测外部输入电平变化,并通过内核驱动通知应用层。应用程序使用select或者poll函数来监听GPIO的句柄的读事件就能够获取到通知,用户可以通过多线程的方式来实现,通过select函数实现代码如下:

while( 1 )
{
//设置读事件
FD_ZERO(&fdRead);
FD_SET(fd,&fdRead);
//设置超时时间
aTime.tv_sec= 0;
aTime.tv_usec= 20000;
ret =select(fd+1,&fdRead,NULL,NULL,&aTime);
if(ret < 0 )
{
printf("error!\n");
break;
}
if(ret > 0)
{
//判断是否读事件
if(FD_ISSET(fd,&fdRead))
{
dwPinState = GPIO0 | GPIO23;
rc = GPIO_PinState(fds.fd, &dwPinState);
if(rc< 0)
{
printf("GPIO_PinState::failed %d\n", rc);
returnrc;
}
//根据上升沿对脉冲计数
if(dwPinState& GPIO0)
pulse1_num++;
if(dwPinState& GPIO23)
pulse2_num++;
//计数到500就退出
if(pulse1_num == 500 && pulse2_num == 500)
{
printf("the pules number is 500\n");
break;
}
}
}
}
close(fd);
return 0;

使用poll函数也是类似的,同样的需要先使能GPIO的外部中断输入功能,即调用一次设置GPIO为输入状态的函数,然后使用poll函数来监听GPIO的句柄的读事件就能够获取到通知,具体代码如下:

while(1)
{
structpollfdfds;
int timeout;
//设置监听句柄
fds.fd = fd;
//设置读事件
fds.events = POLLIN;
//设置超时时间
timeout = 20000;
ret = poll(&fds, 1, timeout);
if (ret < 0 )
{
printf("error!\n");
break;
}
if (ret > 0)
{
//判断是否读事件
if (fds.revents == POLLIN)
{
dwPinState = GPIO0 | GPIO23;
rc = GPIO_PinState(fds.fd, &dwPinState);
if(rc< 0)
{
printf("GPIO_PinState::failed %d\n", rc);
returnrc;
}
//根据上升沿对脉冲计数
if(dwPinState& GPIO0)
pulse1_num++;
if(dwPinState& GPIO23)
pulse2_num++;
//计数到500就退出
if(pulse1_num == 500 && pulse2_num == 500)
{
printf("the pules number is 500\n");
break;
}
}
}
}
close(fd);
return 0;

当输入电平发生变化,select和poll函数侦测到读事件,就可以进行相应的操作,示例代码通过判断上升沿来计数脉冲数,经过测试,上述代码能对两路2KHz的脉冲实现可靠计数。用户还可以根据实际的应用需求,把上述代码修改为支持多路脉冲计数功能。

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

    关注

    7

    文章

    6107

    浏览量

    36948
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32定时器及中断介绍

    脉冲计数的功能。通过选择合适的时钟源和触发信号,可以实现系统低功耗休眠时将MCU唤醒的功能。LPTIM 内部具有一个比较寄存器,可实现比较输出和 PWM 输出,并可以控制输出波形的极性。此外
    发表于 12-01 07:08

    龙芯中科助力2025教育信息技术应用创新大赛成功举办

    2025年11月13日-15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-21 16:23 592次阅读

    AXI GPIO扩展e203 IO口简介

    读写寄存器、设置中断等。 AXI-GPIO广泛应用于FPGA和SoC系统中,可以用于控制外部设备、实现状态检测、进行通信协议等。AXI-GPIO
    发表于 10-22 08:14

    定时器实现步进电机的正反脉冲计

    外部时钟模式 B 和挂起模式,实现步进电机的正反脉冲计数。 注:本应用笔记对应的代码是基于雅特力提供的V2.x.x 板级支持包(BSP)而开发,对于其他版本BSP,需要注意使用上的区别。 支持
    发表于 09-10 16:40

    由倍讯科技研制的CCLinkIE转ModbusTCP网关,可达成与脉冲计数器的连接

    本研究案例展示三菱可编程逻辑控制器(PLC)在工业自动化控制中的实际应用。应用时,将三菱PLC与脉冲计数器相连,实现控制与数据采集功能。采用CCLinkIE到ModbusTCP的网关转换方式,解决不
    的头像 发表于 08-26 16:58 481次阅读
    由倍讯科技研制的CCLinkIE转ModbusTCP网关,可达成与<b class='flag-5'>脉冲计数</b>器的连接

    何时使用 GPIO 中断外部中断

    何时使用 GPIO 中断外部中断
    发表于 08-26 07:27

    佛瑞亚如何通过信息技术推动业务增长

    在数字化、信息化的浪潮下,信息技术已经不仅是后台工具,更成为驱动企业发展的关键力量。本期Women Inspiring Mobility,我们采访了佛瑞亚中国区信息技术总监马瑛,了解她和团队如何将
    的头像 发表于 07-29 14:00 728次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技
    的头像 发表于 07-22 18:20 556次阅读

    开疆智能CCLinkIE转ModbusTCP网关连接脉冲计数器配置案例

    本案例是三菱PLC通过CCLinkIE转ModbusTCP网关连接脉冲计数器的配置案例,具体配置如下。 配置过程: 首先设置从站通讯参数 主要设置IP地址,工作模式以及端口号(Modbus默认502
    的头像 发表于 06-25 17:49 367次阅读
    开疆智能CCLinkIE转ModbusTCP网关连接<b class='flag-5'>脉冲计数</b>器配置案例

    经过光耦之后,脉冲计数功能为什么不能实现

    设置PA0为普通定时器,复用推挽输出,但是发现信号经过光耦之后高电平不到2V,不能进行脉冲计数,如果设置成中断输入,高电平是3.3V,请问这是啥原因?现有的电路能否实现脉冲计数功能?
    发表于 06-17 06:08

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和
    的头像 发表于 06-13 10:06 6290次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略

    第六章 外部中断

    本章介绍W55MH32的IO口作为外部中断输入的使用。先阐述了NVIC(嵌套向量中断控制器) 的结构、寄存器、优先级及相关函数,再说明EXTI(外部
    的头像 发表于 05-26 16:27 1002次阅读
    第六章 <b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO中断

    1、实验简介本实验将演示如何在小凌派-RK2206开发板上使用IOT库的GPIO中断模式,进行GPIO编程开发。例程将创建一个任务,通过配置GPIO
    的头像 发表于 04-21 10:39 889次阅读
    基于小凌派RK2206开发板:OpenHarmony如何使用IoT接口控制<b class='flag-5'>GPIO</b><b class='flag-5'>中断</b>

    GPIO模块与其他外设的连接方法

    输入或输出模式。在输入模式下,GPIO引脚可以读取外部信号的状态;在输出模式下,它们可以向外部设备发送信号。此外,GPIO引脚还可以被配置为特殊功能,如
    的头像 发表于 01-09 09:48 1485次阅读

    飞腾助力首届教育信息技术应用创新大赛圆满落幕

    近日,由中国教育技术协会主办,教育部教育管理信息中心教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信工委会支持,北京航空航天
    的头像 发表于 12-24 09:57 768次阅读