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

    文章

    6066

    浏览量

    34675
收藏 人收藏

    评论

    相关推荐

    脉冲计数器的工作原理和基本结构

    脉冲计数器,作为电子测量和自动化控制领域中一种重要的设备,其工作原理和基本结构对于理解其功能和性能至关重要。脉冲计数器主要用于统计和测量脉冲信号的个数,具有高精度、高速度、高可靠性等特点,广泛应用
    的头像 发表于 05-15 17:14 394次阅读

    脉冲计数器的分类和作用

    在电子技术和数字系统中,脉冲计数器作为一种基本而重要的逻辑器件,其应用广泛且功能多样。脉冲计数器不仅能够实现基本的计数操作,还具备多种输出功
    的头像 发表于 05-15 17:11 206次阅读

    简单认识脉冲计数

    在数字电路和电子测量领域中,脉冲计数器作为一种基本而重要的工具,其应用十分广泛。脉冲计数器,也被称为脉冲频率计或脉冲数计,主要用于统计和测量输入脉冲
    的头像 发表于 05-15 17:08 253次阅读

    在STM8L中如何使用定时器的寄存器对外部脉冲进行计数

    我现在使用的是STM8L152单片机,想利用tim2 或则tim3 进行外部脉冲计数(1个脉冲信号输入后,tim2或tim3定时器的数值寄存器值自动+1或者-1)。 请高手不吝赐教,谢谢。
    发表于 05-11 06:05

    stm8外部中断用来脉冲计数外部中断开始计数,LED灯就不正常了的原因?

    外部中断用来脉冲计数。不计数时,定时器正常,每秒翻转一次LED灯。外部中断开始
    发表于 04-22 07:29

    电路中如何实现脉冲计数功能和相位检测

    在进行DA转换,频率脉冲电压转换,pwm转变成对应的模拟量,电路是怎么实现对固定要求长度或固定频率脉冲个数进行计数进而转换成模拟量的功能? 在进行变频器有源逆变pwm回馈时,如何检测电
    发表于 01-31 19:55

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数
    的头像 发表于 11-09 17:38 624次阅读
    CKS32F4xx系列产品Timer的基本使用方法-定时器<b class='flag-5'>脉冲计数</b>

    STM32如何配置外部中断?STM32外部中断配置步骤

    上跌沿触发或上升沿触发的外部中断线。这些中断线可以通过中断线控制器(EXTI)进行设置,并可以绑定到不同的GPIO端口上,以
    的头像 发表于 10-26 17:47 2299次阅读

    如何使用网络IO的脉冲计数脉冲输出功能?

    一适用型号该笔记适用于ME31系列、MA01系列等IO设备,其中脉冲计数需要IO设备具有输入检测(即,DI输入)功能,脉冲输出需要具有开关量输出(即,DO输出)功能。二功能说明1、脉冲计数支持对DI
    的头像 发表于 09-08 08:22 767次阅读
    如何使用网络IO的<b class='flag-5'>脉冲计数</b>和<b class='flag-5'>脉冲</b>输出功能?

    数字7段脉冲计数器电路分享

    可以使用 7490 解码计数器和 7557A 构建脉冲计数器。该电路可以从9计数到3。所有 2 的引脚 7490 必须连接在一起。
    的头像 发表于 07-27 15:59 654次阅读
    数字7段<b class='flag-5'>脉冲计数</b>器电路分享

    基于CD4511的两位数显脉冲计数

    使用计数器T0,工作在方式0,对外部脉冲进行计数,当外部脉冲数量累计达到1000后LED显示值加
    的头像 发表于 07-12 11:51 1124次阅读
    基于CD4511的两位数显<b class='flag-5'>脉冲计数</b>器

    M261外部来一个脉冲计一个数,是什么中断

    M261,外部来一个脉冲计一个数,是什么中断
    发表于 06-19 14:41

    M261芯片如何用定时器不中断的方式对外部脉冲计数

    M261芯片,如何用定时器不中断的方式对外部脉冲计数? 采用中断方式,如果脉冲频率过高,会频繁进出中断
    发表于 06-19 08:22

    M261 TIMER capture外部脉冲计数的参数怎么设置?

    M261,咨询TIMER capture外部脉冲计数的设置参数? 有人能给一个例子吗?弄了很久都是没反应。
    发表于 06-19 06:53

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    上一章我们介绍了CKS32F4的通用定时器定时操作的使用方法,这一章我们将向大家介绍通用定时器作为定时器脉冲计数的使用。在本章中,我们将用TIM5的通道1(PA0)来做输入捕获,捕获PA0上的脉冲
    的头像 发表于 06-05 09:39 570次阅读
    CKS32F4xx系列产品Timer的基本使用方法-定时器<b class='flag-5'>脉冲计数</b>