不爱胡萝卜的仓鼠 发表于 2024-1-14 21:37

[STM32MP135F-DK]测评 ⑨GPIO输入

<div class='showpostmsg'><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按照之前的测评计划,还差一篇人机交互相关功能测评(按键、显示屏、触摸等),因为触摸和显示屏的功能是原厂直接做好了的,并且在之前的GTK相关文章中也使用了显示屏和触摸,那么我就写一下按键吧,其本质也就是GPIO输入。</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 之前写过一篇关于 GPIO输出的,就是点灯,今天来做一下GPIO INPUT的试验。</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 因为之前点灯时已经发现开发板上的用户按键已经被占用,那我就使用一下CN8这一大堆的GPIO</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">&nbsp;</div>

<div>通过文档可以查询到全部引脚的说明,如下图所示</div>

<div>
<div style="text-align: center;"></div>

<div>使用在点灯中用过的gpioinfo指令,和表格对应,看那个GPIO没有被使用。我这边随便找了一个PB1,对应就是gpiochip1的line 1</div>

<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<p>接下来就是基于之前的点灯代码,改成GPIO input的代码,代码如下</p>

<pre>
<code>#include &lt;errno.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;sys/ioctl.h&gt;
#include &lt;unistd.h&gt;

#include &lt;linux/gpio.h&gt;

int main(int argc, char **argv)
{
        struct gpiohandle_request req;
        struct gpiohandle_data data;
        char chrdev_name;
        int fd, ret;

        strcpy(chrdev_name, "/dev/gpiochip1");

        /* 打开GPIO设备 */
        fd = open(chrdev_name, 0);
        if (fd == -1)
        {
                ret = -errno;
                fprintf(stderr, "Failed to open %s\n", chrdev_name);

                return ret;
        }

        /* 设置使用的几号GPIO,和输入输出模式等 */
        req.lineoffsets = 1;//1号,与之前的gpiochip1组合,即表示PB1
        req.flags = GPIOHANDLE_REQUEST_INPUT;//输入模式
        req.lines = 1; // 只请求一个线路的句柄
    req.consumer_label = '\0'; // 不需要为读取设置任何标签或默认值

        /* 获取GPIO的输入句柄 */
        ret = ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &amp;req);
        /* 如果获取失败 */
        if (ret == -1)
        {
                ret = -errno;
                fprintf(stderr, "Failed to issue GET LINEHANDLE IOCTL (%d)\n",
                        ret);
        }
        /* 已经获取到/获取失败句柄,关闭文件描述符 */
        if (close(fd) == -1)
        {
                perror("Failed to close GPIO character device file");
        }
               

        /* 定时1s查询GPIO状态并打印 */
        while(1)
        {
                /* 获取GPIO状态 */
                ret = ioctl(req.fd, GPIOHANDLE_GET_LINE_VALUES_IOCTL, &amp;data);
                /* 如果获取失败 */
                if (ret == -1)
                {
                        ret = -errno;
                        fprintf(stderr, "Failed to issue %s (%d)\n",
                                        "GPIOHANDLE_GET_LINE_VALUES_IOCTL", ret);
                }
                else
                {
                        /* 打印获取到的GPIO电平 */
                        printf("value: %d\n", data.values); // 打印读取到的GPIO值(0或1)
                }
                /* delay 1S */
                sleep(1);
        }

        /*释放GPIO句柄文件描述符 */
        ret = close(req.fd);
        if (ret == -1)
        {
                perror("Failed to close GPIO LINEHANDLE device file");
                ret = -errno;
        }
        return ret;
}
</code></pre>

<p>配套的makefile文件如下</p>

<pre>
<code>PROG = gpioInput
SRCS = gpioInput.c
OBJS = $(SRCS:.c=.o)

CLEANFILES = $(PROG)

# Add / change option in CFLAGS if needed
# CFLAGS += &lt;new option&gt;

$(PROG):$(OBJS)
        $(CC) $(CFLAGS) -o $(PROG) $(OBJS)

.c.o:
        $(CC) $(CFLAGS) -c $&lt; -o $@

all: $(PROG)


clean:
        rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS)) *~
</code></pre>

<p>这个代码实现的功能就是,初始化PB1为输入模式,然后每隔1S打印GPIO的电平状态</p>

<p>如何编译代码和运行,我就不赘述了,和之前的操作一致</p>

<p>使用杜邦线给GPIO一个低电平(连接GND)或一个高电平(连接3.3V),即可在打印中看到GPIO读取的电平状态,代码运行效果如下</p>

<p>fadb56a025ddf5051c8af29969772eac<br />
&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: [STM32MP135F-DK]测评 ⑨GPIO输入