[资料分享与下载] 使用sysfs文件系统 控制IED(2) C 控制 4 LED产生流水灯效果

[复制链接]
 楼主| Tennasi 发表于 2015-9-11 21:36 | 显示全部楼层 |阅读模式
首先用 C 实现一个 GPIO 初始化的 子函数。
  1. int GPIO_Init( char port, char pin, char direc )
  2. {
  3.         int fd_export;
  4.         int fd_IO;

  5.         fd_export = open( GPIO_EXPORT_PATH, O_WRONLY );
  6.         if( fd_export )
  7.         {
  8.                 snprintf( buf, sizeof( buf ), "%d", port * 32 + pin );
  9.                 if( -1 == write( fd_export, buf, strlen( buf ) ) )
  10.                 {
  11.                         snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d", port * 32 + pin );
  12.                         if( opendir( &buf ) )
  13.                         {
  14.                                 printf( "GPIO %d.%d Already Exist..\n", port, pin  );
  15.                         }
  16.                         else
  17.                         {
  18.                                 close( fd_export );
  19.                                 printf( "GPIO %d.%d Exprot Fail..\n", port, pin  );
  20.                                 return -1;
  21.                         }
  22.                 }

  23.                 close( fd_export );
  24.                 snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/direction", port * 32 + pin );

  25.                 if( fd_IO = open( buf, O_WRONLY ) )
  26.                 {
  27.                         if( direc == 0 )
  28.                         {
  29.                                 write( fd_IO, "out", strlen("out") );
  30.                                 printf( "GPIO %d.%d Output\n", port, pin );
  31.                         }
  32.                         else
  33.                         {
  34.                                 write( fd_IO, "in", strlen("in") );
  35.                                 printf( "GPIO %d.%d Input\n", port, pin );
  36.                         }
  37.                 }
  38.                 close( fd_IO );
  39.                 printf( "GPIO %d.%d Init Success..\n", port, pin  );
  40.                 return 0;
  41.         }
  42.         else
  43.         {
  44.                 close( fd_export );
  45.                 printf( "GPIO %d.%d Init Fail..\n", port, pin  );
  46.                 return -1;
  47.         }

  48. }
再实现一个改变GPIO值的子函数。 即控制输出 高电平 / 低电平。
  1. int GPIO_SetValue( char port, char pin, char value )
  2. {
  3.         int fd;
  4.         snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/value", port * 32 + pin );
  5.         fd = open( buf, O_WRONLY );
  6.         if( 1==value )
  7.         {
  8.                 write( fd, "1" , 1 );
  9.         }
  10.         else if( 0 == value )
  11.         {
  12.                 write( fd, "0" , 1 );
  13.         }
  14.         close( fd );

  15.         return 0;

  16. }


 楼主| Tennasi 发表于 2015-9-11 21:37 | 显示全部楼层
主函数, 首先初始化 4个LED GPIO, 方向设置为输出。然后 每200ms 点亮/熄灭 一个LED。

  1. int main( void )
  2. {
  3.         if( GPIO_Init( 3, 26 , 0) )
  4.                 return 0;

  5.         if( GPIO_Init( 3, 22 , 0) )
  6.                 return 0;

  7.         if( GPIO_Init( 3, 20 , 0) )
  8.                 return 0;

  9.         if( GPIO_Init( 2, 7 , 0) )
  10.                 return 0;

  11.         GPIO_SetValue( 3, 26, 1 );
  12.         GPIO_SetValue( 3, 22, 1 );
  13.         GPIO_SetValue( 3, 20, 1 );
  14.         GPIO_SetValue( 2, 7, 1 );

  15.         while( 1 )
  16.         {
  17.                 GPIO_SetValue( 3, 26, 0 );
  18.                 usleep( 200000 );

  19.                 GPIO_SetValue( 3, 22, 0 );
  20.                 usleep( 200000 );

  21.                 GPIO_SetValue( 3, 20, 0 );
  22.                 usleep( 200000 );

  23.                 GPIO_SetValue( 2, 7, 0 );
  24.                 usleep( 200000 );

  25.                 GPIO_SetValue( 3, 26, 1 );
  26.                 usleep( 200000 );

  27.                 GPIO_SetValue( 3, 22, 1 );
  28.                 usleep( 200000 );

  29.                 GPIO_SetValue( 3, 20, 1 );
  30.                 usleep( 200000 );

  31.                 GPIO_SetValue( 2, 7, 1 );
  32.                 usleep( 200000 );
  33.         }

  34.         return 0;

  35. }


编译程序。然后执行 LED 文件即可实现LED流水灯效果
  1. arm-fsl-linux-gnueabi-gcc LED.c -o LED
FSL_TICS_ZJJ 发表于 2015-9-14 09:20 | 显示全部楼层
楼主发帖,请注意在标题以及一楼中加上你所使用的产品型号,便于大家参考。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

169

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部