ZYNQ linux开发 章节七 Petalinux 下GPIO(EMIO方式)的输入输出实验二——通过编写应用程序来调用(Smart ZYNQ SP&SL 版)

接前一节内容, 前一节内容 通过SYSFS的一些指令来实现 GPIO的简单操作,这一节将通过编程的方式,来调用GPIO 让LED灯自动的闪烁起来

(备注 此章节内容适用于 Smart ZYNQ SP和SL 版的板子,如果是Smart ZYNQ 标准版请看对应板子目录)

本文接前一节的内容继续写, vivado 设置,和Petalinux 镜像编译的过程请参看上一节内容ZYNQ linux开发 章节六 Petalinux 下GPIO(EMIO方式)的输入输出实验一 ——sysfs方式(Smart ZYNQ SP&SL 版)

之前sysfs的流程如下,实际编程去调用的时候 也是按照下列流程来进行的

①导入IO到用户空间:/sys/class/gpio/export

echo    960  >  export

②配置IO:/sys/class/gpio/direction

echo     out    >   direction     # 输出

echo     in    >   direction       # 输入

③控制IO:/sys/class/gpio/value

echo     1   > value        #输出高电平

echo     0   > value        #输出低电平

完整程序如下,很好理解 ,其实操作流程和上一节的相同, 也同样是对direction和value进行操作,来实现IO口输入输出和高低电平的定义 (led_init负责led的初始化,设置输入输出模式, led_ctr负责控制led灯的开和关, main函数的主循环则反复循环这个开关的过程,从而达到LED灯闪烁的效果, sleep(1) 起到1秒钟休眠的作用)

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdbool.h>

 
void led_init(void)
{
    int fd;
 
    fd = open("/sys/class/gpio/export",O_WRONLY);
    if(fd < 0)
    {
        printf("open export fail\r\n");
        return ;
    }
    write(fd,"960",4);
    close(fd);
 
    fd = open("/sys/class/gpio/gpio960/direction",O_RDWR);
    if(fd < 0)
    {
        printf("open direction fail\r\n");
        return ;
    }
    write(fd,"out",4);
    close(fd);
}
 
void led_ctl(bool on_off)
{
    int fd;
 
    fd = open("/sys/class/gpio/gpio960/value",O_RDWR);
    if(fd < 0)
    {
        printf("open value fail\r\n");
        return ;
    }
    if(on_off==true)
    {
        write(fd,"1",2);
    }
    else
    {
        write(fd,"0",2);
    }
    close(fd);
}
 
int main(void)
{
    led_init();
 
    while(1)
    {
        led_ctl(true);
        sleep(1);
 
        led_ctl(false);
        sleep(1);
    }
    return 0;
}

led下载

完成的led.c文件 也可以直接下载

a) 打开虚拟机上

创建一个 文件夹用于存放我们刚才的led.c文件, 这里直接用图形界面右键创建

b) 复制我们上面的 led.c 到这个目录下 (也可以在ubuntu下使用vim编辑器新建一个led.c文件,在里面输入上述的代码内容)

c) 在led.c 所在文件夹的空白处,右键 open in Terminal 来打开终端

d ) 加载petalinux开发环境

source /opt/pkg/petalinux/2018.3/settings.sh

e ) 使用arm-linux-gnueabihf-gcc将led.c编译为led可执行文件, 由下图可以看到,文件夹下多出了一个led文件

 arm-linux-gnueabihf-gcc led.c -o led

f ) 编译完成后,可以通过file led命令来查看文件类型, 入下图所示,我们生成的可执行文件是32位,arm架构,说明可在arm下运行

g ) 拷贝到fat32格式的TF卡中( 也需要拷贝上一节带gpio功能的 petalinux 镜像,入下图所示)

之后正常退出TF卡, 并将卡插入到 我们的主板上

上电测试

将跳线位置换回到SD上

备注 实际测试过程中会发现 虚拟机 和windows 争抢串口的资源的情况,导致windows 下 无法访问串口,所以这里测试的时候(把串口默认设置连接到windows ) 或者临时挂起虚拟机

因为本工程需要用到ctrl+c来中断应用,所以这里用putty这样的专业工具替代串口助手(这样诸如CTRL+C这样的指令就可以用键盘的形式直接发送了,putty官网可以免费下载到)

打开后配置界面如下 模式选择serial ,并设置好串口号(查看设备管理器得到) 和波特率115200就行

设置成SD启动后重新上电,我们就能在putty上看到linux 发出来的命令行了

系统此时停留在等待输入账号密码的状态, 此时输入用户名 root 输入密码 root (不同的串口助手有些需要带回车)

之后就正式登录 petalinux 了

之后就可以进行linux 的操作了

a) 我们先用 df -h来查看 TF卡的挂载位置

df -h

由下图知道,我们的TF卡路径是 /run/media/mmcblk0p1

b ) cd 进入我们的tf卡 /run/media/mmcblk0p1 (putty下 cd 的时候 路径下按TAP键 也会和Ubuntu 下一样有提醒的)

cd  /run/media/mmcblk0p1

e) 用ls 指令查看 mmcblk0p1下的文件, 可以看到 系统检索到我们之前放进去的led 可执行文件了,用./led 来运行我们的led程序

./led

我们板子上的LED灯开始闪烁,闪烁间隔是1秒钟, 证明我们的LED可执行程序工作正常

如果想要程序停止运行,则在putty命令行窗口下 同时按下”ctrl” 和 “c” 键 (普通的串口助手不能实现这个功能)

这样程序就被中断了,控制权又回到了命令行上。

以下是编译好的LED可执行文件(包含上一章节中的petalinux 系统镜像), 直接将images目录下的文件复制到FAT32格式的TF卡根目录下就可启动演示

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注