打印
[资料分享与下载]

使用sysfs文件系统 控制IED(2) C 控制 4 LED产生流水灯效果

[复制链接]
657|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Tennasi|  楼主 | 2015-9-11 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先用 C 实现一个 GPIO 初始化的 子函数。
int GPIO_Init( char port, char pin, char direc )
{
        int fd_export;
        int fd_IO;

        fd_export = open( GPIO_EXPORT_PATH, O_WRONLY );
        if( fd_export )
        {
                snprintf( buf, sizeof( buf ), "%d", port * 32 + pin );
                if( -1 == write( fd_export, buf, strlen( buf ) ) )
                {
                        snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d", port * 32 + pin );
                        if( opendir( &buf ) )
                        {
                                printf( "GPIO %d.%d Already Exist..\n", port, pin  );
                        }
                        else
                        {
                                close( fd_export );
                                printf( "GPIO %d.%d Exprot Fail..\n", port, pin  );
                                return -1;
                        }
                }

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

                if( fd_IO = open( buf, O_WRONLY ) )
                {
                        if( direc == 0 )
                        {
                                write( fd_IO, "out", strlen("out") );
                                printf( "GPIO %d.%d Output\n", port, pin );
                        }
                        else
                        {
                                write( fd_IO, "in", strlen("in") );
                                printf( "GPIO %d.%d Input\n", port, pin );
                        }
                }
                close( fd_IO );
                printf( "GPIO %d.%d Init Success..\n", port, pin  );
                return 0;
        }
        else
        {
                close( fd_export );
                printf( "GPIO %d.%d Init Fail..\n", port, pin  );
                return -1;
        }

}
再实现一个改变GPIO值的子函数。 即控制输出 高电平 / 低电平。
int GPIO_SetValue( char port, char pin, char value )
{
        int fd;
        snprintf( buf, sizeof( buf ), "/sys/class/gpio/gpio%d/value", port * 32 + pin );
        fd = open( buf, O_WRONLY );
        if( 1==value )
        {
                write( fd, "1" , 1 );
        }
        else if( 0 == value )
        {
                write( fd, "0" , 1 );
        }
        close( fd );

        return 0;

}


相关帖子

沙发
Tennasi|  楼主 | 2015-9-11 21:37 | 只看该作者
主函数, 首先初始化 4个LED GPIO, 方向设置为输出。然后 每200ms 点亮/熄灭 一个LED。

int main( void )
{
        if( GPIO_Init( 3, 26 , 0) )
                return 0;

        if( GPIO_Init( 3, 22 , 0) )
                return 0;

        if( GPIO_Init( 3, 20 , 0) )
                return 0;

        if( GPIO_Init( 2, 7 , 0) )
                return 0;

        GPIO_SetValue( 3, 26, 1 );
        GPIO_SetValue( 3, 22, 1 );
        GPIO_SetValue( 3, 20, 1 );
        GPIO_SetValue( 2, 7, 1 );

        while( 1 )
        {
                GPIO_SetValue( 3, 26, 0 );
                usleep( 200000 );

                GPIO_SetValue( 3, 22, 0 );
                usleep( 200000 );

                GPIO_SetValue( 3, 20, 0 );
                usleep( 200000 );

                GPIO_SetValue( 2, 7, 0 );
                usleep( 200000 );

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

                GPIO_SetValue( 3, 22, 1 );
                usleep( 200000 );

                GPIO_SetValue( 3, 20, 1 );
                usleep( 200000 );

                GPIO_SetValue( 2, 7, 1 );
                usleep( 200000 );
        }

        return 0;

}


编译程序。然后执行 LED 文件即可实现LED流水灯效果
arm-fsl-linux-gnueabi-gcc LED.c -o LED

使用特权

评论回复
板凳
FSL_TICS_ZJJ| | 2015-9-14 09:20 | 只看该作者
楼主发帖,请注意在标题以及一楼中加上你所使用的产品型号,便于大家参考。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

169

帖子

1

粉丝