General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,人们利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。
在嵌入式开发中,arm越来越普及,GPIO的扩展和使用也越来越多,因此它是否能正常工作对于我们使用的重要性不言而喻,因此我们在使用前必须得先判断GPIO是否正常,鉴于传统的检测方案,操作复杂而且效率低,检测的成本大,数据分析也不精确,因此开发一款操作方便的GPIO检测系统迫在眉睫。
本系统是基于LINUX环境开发的,主要的开发工具是QT,因为QT不但可以直接设计界面,而且还很方便。
在我的这个系统中,其中最主要的功能就是GPIO的读写,相对功能比较明确也比较简单,只要将GPIO的读写搞清楚了,其余的设计就看自己设计,我主要设计的是读15个GPIO的值,本来有16个GPIO的,但是有一个是电源的GPIO,没有用来传输数据,所以在这里只用到了15个,当然这个是核心板外设的接口,每个板的设计和原理图也都不一样,所以这里就不做简单的介绍了,我们直接来看一下读取GPIO代码的实现。
如果想要读取GPIO的数据,首先我们得打开GPIO所在的文件,然后进行操作。这里就以我的为列,
cd /sys/class/gpio/ 打开文件所在的目录
echo 165 > export 输入165到GPIO3 我的165是电源接口
cd gpio165/ 打开gpio165目录
echo out > direction 输出out到direction里面
echo 1 > value 给165口高电平 让他处于打开状态
echo 0 > value 给他低电平 让他处于关闭状态
这是操作GPIO的代码 ,在QT中的代码的主要实现是
fd = open(EXPORT,O_WRONLY);
if(fd == -1)
{
printf("open fail\n");
return;
}
ret = write(fd,GPIO[i],sizeof(“165”));
if(ret == -1)
{
printf("write gpio[%s] fail\n",165);
}
fd = open( "/sys/class/gpio/gpio165/direction",O_RDWR);
if(fd == -1)
{
printf("open file error.\n");
return ;
}
memset(buf,0,SIZE);
ret = read(fd,buf,SIZE);
if(buf != OUT)
{
ret = write(fd,"out",sizeof("out"));
if(ret == -1)
{
printf("write out fail\n");
}
}
}
这就是我操作GPIO的代码的实现,虽然这个只是165一个电源GPIO的实现,但是呢其他的也都差不多,就只是将输出“out”改为“in”就OK了。
最后就是再此功能的基础上的扩展了,我数据主要是读到GPIO所用的时间,然后将时间进行各种处理,比如最大值,最小值,将数据写入sqlite数据库,还有就是当地的时间,我的时间使用ntp实现的,所以时间比较准确,当然也还有其他的方法,时间准确的好处是在做掉电处理的时候计算的掉电时间准确,丢失的数据就知道了。GPIO这个项目的大体功能就是这样,希望对有需要的人有所帮助。