接前一节内容, 前一节内容 通过SYSFS的一些指令来实现 GPIO的简单操作,这一节将通过编程的方式,来调用GPIO 让LED灯自动的闪烁起来
- 此章节内容适用于下列主板
- Lemon ZYNQ (CLG400封装的7020)
- Smart ZYNQ SP / SP2 / SL 版的板子(非标准版)(CLG484封装)
- Smart ZYNQ 标准版(停产) (CLG400封装7010/7020 )
- 本文在 vivado2018.3 以及 Petalinux2018.3 版本上进行演示
本文接前一节的内容继续写 基于Smart Zynq与Lemon Zynq 的Petalinux开发 章节七 GPIO的输入输出实验
一、应用代码的编写
之前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.c文件 也可以直接下载 led下载
二、代码的编译
1 )打开虚拟机上
创建一个 文件夹用于存放我们刚才的led.c文件, 这里直接用图形界面右键创建

2) 复制我们上面的 led.c 到这个目录下 (也可以在ubuntu下使用vim编辑器新建一个led.c文件,在里面输入上述的代码内容)
3) 在led.c 所在文件夹的空白处,右键 open in Terminal 来打开终端

4) 加载petalinux开发环境
source /opt/pkg/petalinux/2018.3/settings.sh
5) 使用arm-linux-gnueabihf-gcc将led.c编译为led可执行文件, 由下图可以看到,文件夹下多出了一个led文件
arm-linux-gnueabihf-gcc led.c -o led

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

三、将代码复制到我们的系统中
- 复制的方法有多种,这里介绍两种方式
- 将带PETALINUX 系统的TF卡用读卡器的方式连接我们的电脑,并完成文件的复制粘贴
- 使用之前章节介绍的SCP功能,通过网络来直接传输我们的文件
这里我们使用TF卡直接复制的方式来完成程序的复制。
1)将带有PETALINUX系统的TF卡插入到读卡器,并连接到我们的电脑(此时如果虚拟机还开着,记得选择系统的控制权,选WINDOWS控制即可) (如果电脑提示要格式化TF卡,千万不要格式化)
2)打开我们TF卡的第一分区(BOOT)分区 (该分区是FAT32格式的),并将我们刚才生成的应用文件复制到这个分区上(分区内另外两个系统文件不要动)

之后正常退出TF卡, 并将卡插入到 我们的主板上
四、上电测试
将板子的启动方式调整成SD启动,如下图所示

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

因为本工程需要用到ctrl+c来中断应用,所以这里用putty这样的专业工具替代串口助手(这样诸如CTRL+C这样的指令就可以用键盘的形式直接发送了,putty官网可以免费下载到)
打开后配置界面如下 模式选择serial ,并设置好串口号(查看设备管理器得到) 和波特率115200就行

设置成SD启动后重新上电,我们就能在putty上看到linux 发出来的命令行了
当系统出现root@localhost:~# 就代表系统已经成功启动了,系统此时停留在等待输入账号密码的状态

此时输入用户名 root 密码 root,之后就正式登录 petalinux 了

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可执行文件, 直接将文件夹目录下的led文件复制到TF卡BOOT分区(FAT32)的根目录下就可启动演示。
本文可执行APP及C文件下载:08_PetaLinuxSystem_gpio_app