• petalinux之LED应用编程


    这里使用前面搭建的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源文件如下:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #define LED_BASE 1020
    7. #define LED_INDEX 1
    8. #define LED_ADD (LED_BASE + LED_INDEX)
    9. void led_ctl_init(void)
    10. {
    11. int fd;
    12. char data[100];
    13. fd = open("/sys/class/gpio/export",O_WRONLY);
    14. if(fd < 0)
    15. {
    16. printf("open export fail\r\n");
    17. return ;
    18. }
    19. int len = sprintf(data,"%d",LED_ADD);
    20. write(fd,data,len+1);
    21. close(fd);
    22. sprintf(data,"/sys/class/gpio/gpio%d/direction",LED_ADD);
    23. fd = open(data,O_RDWR);
    24. if(fd < 0)
    25. {
    26. printf("open direction fail\r\n");
    27. return ;
    28. }
    29. write(fd,"out",4);
    30. close(fd);
    31. }
    32. void led_ctl_on(bool is_on)
    33. {
    34. int fd;
    35. char data[100];
    36. sprintf(data,"/sys/class/gpio/gpio%d/value",LED_ADD);
    37. fd = open(data,O_RDWR);
    38. if(fd < 0)
    39. {
    40. printf("open value fail\r\n");
    41. return ;
    42. }
    43. if(is_on)
    44. {
    45. write(fd,"1",2);
    46. }
    47. else
    48. {
    49. write(fd,"0",2);
    50. }
    51. close(fd);
    52. }
    53. int main(void)
    54. {
    55. led_ctl_init();
    56. printf("start led\r\n");
    57. while(1)
    58. {
    59. led_ctl_on(true);
    60. sleep(1);
    61. led_ctl_on(false);
    62. sleep(1);
    63. }
    64. return 0;
    65. }

    然后就是编译源程序,需要在交叉编译环境中进行

    ①导出交叉编译环境变量

    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的间隔闪烁。

  • 相关阅读:
    安全防御第三次作业
    【深度学习实践】基于深度学习的车牌识别(python,车牌检测+车牌识别)
    原力计划SpringMVC的请求处理流程及核心组件
    Loguru:Python中强大的日志库
    视频监控/安防监控/AI视频分析/边缘计算EasyCVR平台如何调取登录接口获取token?
    找第k小的数
    蒙特卡洛估计举例
    android7.1 外置SD卡三方应用没有读写权限
    专为程序员量身定制的云 IDE,你用了吗
    this.$set,更新vue视图
  • 原文地址:https://blog.csdn.net/qq_53144843/article/details/126911676