接前一节内容, 前一节内容 通过SYSFS的一些指令来实现 GPIO的简单操作,这一节将通过编程的方式,来调用GPIO 让LED灯自动的闪烁起来
本文接前一节的内容继续写, vivado 设置,和Petalinux 镜像编译的过程请参看上一节内容ZYNQ linux开发 章节六 Petalinux 下GPIO(EMIO方式)的输入输出实验一 ——sysfs方式(Tiny FPGA版)
之前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文件 也可以直接下载
a) 打开虚拟机上
创建一个 文件夹用于存放我们刚才的led.c文件, 这里直接用图形界面右键创建
![](http://www.hellofpga.com/wp-content/uploads/2023/01/image-32.png)
b) 复制我们上面的 led.c 到这个目录下 (也可以在ubuntu下使用vim编辑器新建一个led.c文件,在里面输入上述的代码内容)
c) 在led.c 所在文件夹的空白处,右键 open in Terminal 来打开终端
![](http://www.hellofpga.com/wp-content/uploads/2023/01/image-33.png)
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
![](http://www.hellofpga.com/wp-content/uploads/2023/01/image-34.png)
f ) 编译完成后,可以通过file led命令来查看文件类型, 入下图所示,我们生成的可执行文件是32位,arm架构,说明可在arm下运行
![](http://www.hellofpga.com/wp-content/uploads/2023/01/image-35.png)
g ) 拷贝到fat32格式的TF卡中( 也需要拷贝上一节带gpio功能的 petalinux 镜像,入下图所示)
![](http://www.hellofpga.com/wp-content/uploads/2023/01/image-37.png)
之后正常退出TF卡, 并将卡插入到 我们的主板上
上电测试
将跳线位置换回到SD上
![](http://www.hellofpga.com/wp-content/uploads/2022/12/image-97.png)
备注 实际测试过程中会发现 虚拟机 和windows 争抢串口的资源的情况,导致windows 下 无法访问串口,所以这里测试的时候(把串口默认设置连接到windows ) 或者临时挂起虚拟机
![](http://www.hellofpga.com/wp-content/uploads/2022/12/image-98.png)
备注 实际测试过程中会发现 虚拟机 和windows 争抢串口的资源的情况,导致windows 下 无法访问串口,所以这里测试的时候(把串口默认设置连接到windows ) 或者临时挂起虚拟机
![](http://www.hellofpga.com/wp-content/uploads/2022/12/image-98.png)
因为本工程需要用到ctrl+c来中断应用,所以这里用putty这样的专业工具替代串口助手(这样诸如CTRL+C这样的指令就可以用键盘的形式直接发送了,putty官网可以免费下载到)
打开后配置界面如下 模式选择serial ,并设置好串口号(查看设备管理器得到) 和波特率115200就行
![](http://www.hellofpga.com/wp-content/uploads/2023/02/1UN88AEMMOLWOXKZM0.png)
设置成SD启动后重新上电,我们就能在putty上看到linux 发出来的命令行了
![](http://www.hellofpga.com/wp-content/uploads/2023/02/image-40.png)
系统此时停留在等待输入账号密码的状态, 此时输入用户名 root 输入密码 root (不同的串口助手有些需要带回车)
之后就正式登录 petalinux 了
![](http://www.hellofpga.com/wp-content/uploads/2023/02/image-41.png)
之后就可以进行linux 的操作了
a) 我们先用 df -h来查看 TF卡的挂载位置
df -h
由下图知道,我们的TF卡路径是 /run/media/mmcblk0p1
![](http://www.hellofpga.com/wp-content/uploads/2023/02/image-42.png)
b ) cd 进入我们的tf卡 /run/media/mmcblk0p1 (putty下 cd 的时候 路径下按TAP键 也会和Ubuntu 下一样有提醒的)
cd /run/media/mmcblk0p1
![](http://www.hellofpga.com/wp-content/uploads/2023/02/image-43.png)
e) 用ls 指令查看 mmcblk0p1下的文件, 可以看到 系统检索到我们之前放进去的led 可执行文件了,用./led 来运行我们的led程序
./led
![](http://www.hellofpga.com/wp-content/uploads/2023/01/image-42.png)
我们板子上的LED灯开始闪烁,闪烁间隔是1秒钟, 证明我们的LED可执行程序工作正常
如果想要程序停止运行,则在putty命令行窗口下 同时按下”ctrl” 和 “c” 键 (普通的串口助手不能实现这个功能)
![](http://www.hellofpga.com/wp-content/uploads/2023/02/image-44.png)
这样程序就被中断了,控制权又回到了命令行上。
以下是编译好的LED可执行文件(包含上一章节中的petalinux 系统), 直接复制到FAT32格式的TF卡根目录下就可启动演示