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

英创工控主板都给用户提供了丰富的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)
{
//判断是否读事件
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)
{
//判断是否读事件
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的脉冲实现可靠计数。用户还可以根据实际的应用需求,把上述代码修改为支持多路脉冲计数功能。

B2B供应链管理平台主流技术架构方案
卷扬机减速机密封失效的治理方案
显示器驱动器,传感器,传感器原理是什么?
“中国手机厂家全面胜利”的时代已近在眼前
思开半导体产品推介 | SS018N08LS助力新能源储能市场
英创信息技术用GPIO实现多路外部中断及脉冲计数简介
嵌入式系统裸机编程的内存管理简介
什么是OpenCL?面向FPGA的OpenCL有何优点?
MC34262通用输入180W,385V输出功率因数校正电路,MC34262 PFC controller
一文探讨5G FWA技术
采用TMS320F206 16位DSP的PROFIBUS-D
高速电主轴为什么要强制关机?
承德科胜软糖包装机|橡皮泥包装机|河北包装机
新款“3A”游戏本跑分曝光,跑出了近9000的高分
什么是音箱直达声与绕射声
粤港澳大湾区的数字化转型对推动我国制造业发展具有重要意义
广和通与爱立信建立全球生态伙伴关系,共探5G AIoT新商机
5G行业应用全面加速
如何用S7-1200搭建一个完整AGV控制系统!
dfrobotWiFiBee-MT7681简介