创客神器NanoPi
直播中

jinyi7016

12年用户 6608经验值
擅长:处理器/DSP
私信 关注
[经验]

【NanoPi2试用体验】中级(二):LED源码解析---基于Matrix

本帖最后由 jinyi7016 于 2015-12-28 00:58 编辑

上一篇,体验了Matrix的LCD驱动。又有源码,那当然要分析一下了。

一、源码路径:
matrix/demo/matrix-led/Matrix-led.c
二、main函数
打开这个文件后,可以看到,只有一个main函数。
  1. #include

  2. #include

  3. #include "libfahw.h"



  4. #define LED_BLINK_tiMES     10



  5. int main(int argc, char ** argv)

  6. {

  7.     int ledPin = GPIO_PIN(7);

  8.     int i = 0;

  9.     int ret = -1;



  10.     if ((ret = exportGPIOPin(ledPin)) == -1) {

  11.         printf("exportGPIOPin(%d) failedn", ledPin);

  12.     }

  13.     if ((ret = setGPIODirection(ledPin, GPIO_OUT)) == -1) {

  14.         printf("setGPIODirection(%d) failedn", ledPin);

  15.     }



  16.     for (i = 0; i < LED_BLINK_TIMES; i++) {

  17.         if (i % 2) {

  18.             ret = setGPIOValue(ledPin, GPIO_HIGH);

  19.         } else {

  20.             ret = setGPIOValue(ledPin, GPIO_LOW);

  21.         }

  22.         if (ret == -1) {

  23.             printf("setGPIOValue(%d) failedn", ledPin);

  24.         }

  25.         printf("LED blinking times %dn", i);

  26.         sleep(1);

  27.     }

  28.     unexportGPIOPin(ledPin);

  29.     return 0;

  30. }
注意,这里的GPIO_PIN(7)是开发板上排针顺序的第7个引脚,并不是CPU的第7个IO口。
主要函数功能:
exportGPIOPin函数:导出对应GPIO号的GPIO。
setGPIODirection函数:设置GPIO是输出还是输入。
setGPIOValue函数:控制GPIO电平变化。
那么main函数的功能:就是配置好GPIO后,每1秒改变一次GPIO的电平,共10秒。
三、各子函数
1、exportGPIOPin函数
  1. EXPORT int setGPIOValue(int pin, int value)
  2. {
  3.     clearLastError();
  4.     int gpio = pintoGPIO(pin);
  5.     GPIO_FILENAME_DEFINE(gpio, "value")
  6.    
  7.     return writeIntValueToFile(fileName, value);
  8. }
其中GPIO_FILENAME_DEFINE的定义在libfahw-gpio.h

  1. #define GPIO_FILENAME_DEFINE(pin,field) char fileName[255] = {0};
  2.         sprintf(fileName, "/sys/class/gpio/gpio%d/%s", pin, field);
还有
  1. #define GPIO_PIN(x)             (x)


writeIntValueToFile的定义在common.c中。
  1. int writeIntValueToFile(char* fileName, int value) {
  2.     char buff[50];
  3.     sprintf(buff, "%d", value);
  4.     return writeValueToFile(fileName, buff);
  5. }

最终实现的结果与以下命令是一样的。
在开发板上。
# cd /sys/class/gpio/
#echo 60 >export

捕获.PNG
2、setGPIODirection函数

  1. EXPORT int setGPIODirection(int pin, int direction)
  2. {
  3.     clearLastError();
  4.     int gpio = pintoGPIO(pin);
  5.     char directionStr[10];
  6.     GPIO_FILENAME_DEFINE(gpio, "direction")
  7.    
  8.     if (direction == GPIO_IN) {
  9.         strcpy(directionStr, "in");
  10.     } else if (direction == GPIO_OUT) {
  11.         strcpy(directionStr, "out");
  12.     } else {
  13.         setLastError("direction must be 1 or 2,  1->in, 2->out");
  14.         return -1;
  15.     }
  16.     return writeValueToFile(fileName, directionStr);
  17. }

一些函数定义已经可以找到了,其功能与在终端输入以下命令是等效的。
# echo out >direction
捕获.PNG
3、setGPIOValue函数
  1. EXPORT int setGPIOValue(int pin, int value)
  2. {
  3.     clearLastError();
  4.     int gpio = pintoGPIO(pin);
  5.     GPIO_FILENAME_DEFINE(gpio, "value")
  6.    
  7.     return writeIntValueToFile(fileName, value);
  8. }
向value文件写入0或1 ;
写入0,LED灭
#echo 0 >value
写入1 ,LED亮
#echo 1 >value
捕获.PNG

征文活动,多多捧场:https://bbs.elecfans.com/jishu_531047_1_1.html

回帖(2)

xjallen

2015-12-28 18:11:02
GPIO才是这个板子的精华 学习了
举报

张星

2016-3-22 16:11:15
能不能pwm 控制 led亮暗 啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分