dql2016 发表于 2022-4-16 09:19

【米尔MYC-JX8MPQ评测】三、gpio应用编程

<div class='showpostmsg'><p>gpio操作可以通过sys文件系统接口,文件系统 gpio 操作 在文件系统操作 GPIO 时,必须先检查想要操作的 GPIO 是否被其他驱动占用,如果 被占用,后续操作会报 busy 的警告。</p>

<p>以操作拓展脚的一个接口为例,使用万用表测 量电压。(ECSPI2_MOSI_3V3, GPIO5_IO11,139)</p>

<p>导出 GPIO</p>

<p>root@myd-jx8mp:~# echo 139 &gt; /sys/class/gpio/export</p>

<p>导出成功后会在/sys/class/gpio/目录下生成 gpio139 这个目录。</p>

<p>设置/查看 GPIO 方向 设置输出,输入以下命令:</p>

<p>root@myd-jx8mp:~# echo out &gt; /sys/class/gpio/gpio139/direction</p>

<p>或者设置输入:</p>

<p>root@myd-jx8mp:~# echo in &gt; /sys/class/gpio/gpio139/direction</p>

<p>查看 gpio 方向:</p>

<p>root@myd-jx8mp:~# cat /sys/class/gpio/gpio139/direction out</p>

<p>返回 in 表示输入,返回 out 表示输出。</p>

<p>设置/查看 GPIO 的值 设置输出低:</p>

<p>root@myd-jx8mp:~# echo &quot;0&quot; &gt; /sys/class/gpio/gpio139/value</p>

<p>或者设置输出高:</p>

<p>root@myd-jx8mp:~# echo &quot;1&quot; &gt; /sys/class/gpio/gpio139/value</p>

<p>查看 gpio 的值:</p>

<p>root@myd-jx8mp:~# cat /sys/class/gpio/gpio139/value 1</p>

<p>可以看到 GPIO5_IO11 输出高电平,然后可以用万用表测量 J25 扩展 IO 的 ECSPI2_MOSI_3V3 引脚,可以看到电压为 3.3V 左右</p>

<p>&nbsp;</p>

<center><strong>GPIO68各属性文件的用途</strong></center>

<table>
        <thead>
                <tr>
                        <th>文件名</th>
                        <th>路径</th>
                        <th>作用</th>
                </tr>
        </thead>
        <tbody>
                <tr>
                        <td>active_low</td>
                        <td>/sys/class/gpio/gpio139/active_low</td>
                        <td>具有读写属性。用于决定value中的值是否翻转&mdash;&mdash;0不翻转,1翻转。</td>
                </tr>
                <tr>
                        <td>edge</td>
                        <td>/sys/class/gpio/gpio139/edge</td>
                        <td>具有读写属性。设置GPIO中断,或检测中断是否发生。</td>
                </tr>
                <tr>
                        <td>subsystem</td>
                        <td>/sys/class/gpio/gpio139/subsystem</td>
                        <td>符号链接,指向父目录。</td>
                </tr>
                <tr>
                        <td>value</td>
                        <td>/sys/class/gpio/gpio139/value</td>
                        <td>具有读写属性。GPIO的电平状态设置或读取。</td>
                </tr>
                <tr>
                        <td>direction</td>
                        <td>/sys/class/gpio/gpio139/direction</td>
                        <td>具有读写属性。用于查看或设置GPIO输入输出</td>
                </tr>
                <tr>
                        <td>power</td>
                        <td>/sys/class/gpio/gpio139/power</td>
                        <td>设备供电方面的相关信息</td>
                </tr>
                <tr>
                        <td>uevent</td>
                        <td>/sys/class/gpio/gpio139/uevent</td>
                        <td>内核与udev(自动设备发现程序)之间的通信接口</td>
                </tr>
                <tr>
                        <td>device</td>
                        <td>/sys/class/gpio/gpio139/device</td>
                        <td>符号链接,指向父目录。</td>
                </tr>
        </tbody>
</table>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>实际应用中,通过c语言读写linux系统文件的方式对gpio进行操作,示例代码如下:</p>

<p>&nbsp;</p>

<pre>
<code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;termios.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;
#define    DEV_PATH      "/sys/class/gpio/gpio139/value"            // 输入输出电平值设备
#define    EXPORT_PATH      "/sys/class/gpio/export"                  // GPIO设备导出设备
#define    DIRECT_PATH      "/sys/class/gpio/gpio139/direction"      // GPIO输入输出控制设备
#define      OUT            "out"
#define      IN            "in"
#define      GPIO      "139"      //gpio号                              
#define    HIGH_LEVEL      "1"
#define    LOW_LEVEL      "0"
int main(int argc, char ** argv)
{
    static int fd_dev, fd_export, fd_dir, ret;
    char buf, direction;
    fd_export = open(EXPORT_PATH, O_WRONLY);                      // 打开GPIO设备导出设备
    if(fd_export &lt; 0) {
      perror("open export:");
      return -1;
    }
    write(fd_export, GPIO, strlen(GPIO));
    fd_dev = open(DEV_PATH, O_RDWR);                              // 打开输入输出电平值设备
    if(fd_dev &lt; 0) {
      perror("open gpio:");
      return -1;
    }
    fd_dir = open(DIRECT_PATH, O_RDWR);                           // 打开GPIO输入输出控制设备
    if(fd_dir &lt; 0) {
      perror("open direction:");
      return -1;
    }
    ret = read(fd_dir, direction, sizeof(direction));             // 读取GPIO输入输出方向
    if(ret &lt; 0) {
      perror("read direction:");
      close(fd_export);
      close(fd_dir);
      close(fd_dev);
      return -1;
    }
    printf("default direction:%s", direction);
    strcpy(buf, IN);
    ret = write(fd_dir, buf, strlen(IN));
    if(ret &lt; 0) {
      perror("write direction:");
      close(fd_export);
      close(fd_dir);
      close(fd_dev);
      return -1;
    }
    ret = read(fd_dir, direction, sizeof(direction));
    if(ret &lt; 0) {
      perror("read direction:");
      close(fd_export);
      close(fd_dir);
      close(fd_dev);
      return -1;
    }
    ret = read(fd_dev, buf, sizeof(buf));                         // 读取GPIO输入电平值
    if(ret &lt; 0) {
      perror("read gpio:");
      close(fd_export);
      close(fd_dir);
      close(fd_dev);
      return -1;
    }
    printf("current direction:%sinput level:%s", direction, buf);
    close(fd_export);
    close(fd_dir);
    close(fd_dev);
    return 0;
}</code></pre>

<p>&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>

Jacktang 发表于 2022-4-16 21:13

<p>这个用万用表测 量电压例程实用</p>
页: [1]
查看完整版本: 【米尔MYC-JX8MPQ评测】三、gpio应用编程