这里使用前面搭建的Linux系统平台,vivado中了包含关于led灯的硬件配置,这里好像不用也行,使用GPIO控制LED闪烁。
通过sysfs方式控制开发板上的 GPIO 引脚(LED),控制开发板上的某一个LED 输出高、低不同的电平状态,完成LED灯的闪烁。关于sysfs控制GPIO相关操作参考前一篇笔记:GPIO
在之前是使用的vitis搭建的Linux应用程序,这里使用vim直接编写相应的应用程序。但是在编译的时候,需要在交叉编译的环境进行,不然生成的可以执行文件开发板使用不了。
对GPIO(LED)的操作分为三步:
①导出IO:/sys/class/gpio/export
echo 1021 > export
②配置IO:/sys/class/gpio/direction
echo out > direction # 输出
echo in > direction # 输入
③控制IO:/sys/class/gpio/value
echo 1 > value #输出高电平
echo 0 > value #输出低电平
在开发板系统中是在相应的文件使用echo命令进行输出重定向,所以在相应的应用程序中也要操作相应的文件,对此文件进行读写即可。
可以看到gpiochip1020这组GPIO刚好有4个GPIO,从1020到1023对应着LED1到LED3。应该是vivado下配置的PL的4个LED吧。这里使用LED2, 其余几个LED也是同样的操作。
led源文件如下:
#include
#include
#include
#include
#include
#define LED_BASE 1020
#define LED_INDEX 1
#define LED_ADD (LED_BASE + LED_INDEX)
void led_ctl_init(void)
{
int fd;
char data[100];
fd = open("/sys/class/gpio/export",O_WRONLY);
if(fd < 0)
{
printf("open export fail\r\n");
return ;
}
int len = sprintf(data,"%d",LED_ADD);
write(fd,data,len+1);
close(fd);
sprintf(data,"/sys/class/gpio/gpio%d/direction",LED_ADD);
fd = open(data,O_RDWR);
if(fd < 0)
{
printf("open direction fail\r\n");
return ;
}
write(fd,"out",4);
close(fd);
}
void led_ctl_on(bool is_on)
{
int fd;
char data[100];
sprintf(data,"/sys/class/gpio/gpio%d/value",LED_ADD);
fd = open(data,O_RDWR);
if(fd < 0)
{
printf("open value fail\r\n");
return ;
}
if(is_on)
{
write(fd,"1",2);
}
else
{
write(fd,"0",2);
}
close(fd);
}
int main(void)
{
led_ctl_init();
printf("start led\r\n");
while(1)
{
led_ctl_on(true);
sleep(1);
led_ctl_on(false);
sleep(1);
}
return 0;
}
然后就是编译源程序,需要在交叉编译环境中进行
①导出交叉编译环境变量
source /opt/Xilinx/Vivado/2020.2/settings64.sh
②交叉编译
arm-linux-gnueabihf-gcc -o led ./led.c
arm-linux-gnueabihf-gcc就是开发板使用的交叉编译器
编译完成后,查看led文件类型:32位,arm架构,说明交叉编译成功,可在arm下运行。
拷贝到sd卡中并运行
可以看到led2以1s的间隔闪烁。