原文再续,书接上一回,
话说已经可以通过 shell + sysfs 文件系统 控制 LED 亮灭, 现在就通过C语言来重现控制步骤。
先上最终效果视频,有兴趣就往下看。
首先用 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 Outputn", port, pin );
- }
- else
- {
- write( fd_IO, "in", strlen("in") );
- printf( "GPIO %d.%d Inputn", 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;
- }
复制代码
主函数, 首先初始化 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
复制代码
0
|
|
|
|