Intel物联网开发者专区
直播中

陈明

11年用户 352经验值
擅长:可编程逻辑 嵌入式技术 处理器/DSP 接口/总线/驱动 控制/MCU RF/无线
私信 关注
[经验]

【Intel Edison试用体验】Mraa库GPIO中断的使用

硬件连接:Grove底板连接上,Grove的botton模块查到D2上。
软件:使用Edison Eclipse开发环境

首先,看下Botton模块的原理图:
QQ截图20160713212957.jpg
可以看出,按键的逻辑是:为按下时为低电平,按下为高电平。在查看原理图可以看到上图D1引脚对应Edison的D2引脚。

下面看下程序,其中gpio2为按键输入,gpio12为底板ds2的LED。我们使用mraa_gpio_isr给gpio2设置了一个上升沿触发的中断,并给它出入中断处理函数。
实验现象是:每按下一次按键,DS2的LED状态反转一次。
  1. #include "mraa.h"

  2. #include
  3. #include

  4. void key_handle(void * parg);

  5. mraa_gpio_context d_pin = NULL;
  6. mraa_gpio_context b_pin = NULL;  //for button
  7. char buf[30] = "Hell Edison!n";

  8. int main() {
  9.   /* Setup your example here, code that should run once
  10.    */
  11.         mraa_platform_t platform = mraa_get_platform_type();

  12.         switch (platform) {
  13.                 case MRAA_INTEL_GALILEO_GEN1:
  14.                         d_pin = mraa_gpio_init_raw(3);
  15.                         break;
  16.                 case MRAA_INTEL_GALILEO_GEN2:
  17.                         d_pin = mraa_gpio_init(13);
  18.                         break ;
  19.                 case MRAA_INTEL_EDISON_FAB_C:
  20.                         d_pin = mraa_gpio_init(13);
  21.                         b_pin = mraa_gpio_init(2);
  22.                         break;
  23.                 default:
  24.                         fprintf(stderr, "Unsupported platform, exiting");
  25.                         return MRAA_ERROR_INVALID_PLATFORM;
  26.         }
  27.         if (d_pin == NULL) {
  28.                 fprintf(stderr, "MRAA couldn't initialize GPIO, exiting");
  29.                 return MRAA_ERROR_UNSPECIFIED;
  30.         }
  31.         if (b_pin == NULL) {
  32.                 fprintf(stderr, "MRAA couldn't initialize GPIO, exiting");
  33.                 return MRAA_ERROR_UNSPECIFIED;
  34.         }
  35.         // set the pin as output
  36.         if (mraa_gpio_dir(d_pin, MRAA_GPIO_OUT) != MRAA_SUCCESS) {
  37.                 fprintf(stderr, "Can't set digital pin as output, exiting");
  38.                 return MRAA_ERROR_UNSPECIFIED;
  39.         };

  40.         if (mraa_gpio_dir(b_pin, MRAA_GPIO_IN) != MRAA_SUCCESS) {
  41.                 fprintf(stderr, "Can't set digital pin as output, exiting");
  42.                 return MRAA_ERROR_UNSPECIFIED;
  43.         };

  44.         if (mraa_gpio_isr(b_pin, MRAA_GPIO_EDGE_RISING, key_handle, (void *)&buf ) != MRAA_SUCCESS) {
  45.                 fprintf(stderr, "Can't set digital pin as output, exiting");
  46.                 return MRAA_ERROR_UNSPECIFIED;
  47.         };


  48.   /* Code in this loop will run repeatedly
  49.    */
  50.   for (;;) {
  51.           sleep(1);
  52.   }

  53.   return MRAA_SUCCESS;
  54. }

  55. void key_handle(void * parg)
  56. {
  57.         static unsigned char i = 0;
  58.         i = ~i;
  59.         fprintf(stdout, (char *)parg);
  60.         if (i) {
  61.                 mraa_gpio_write(d_pin, 1);
  62.         }
  63.         else {
  64.                 mraa_gpio_write(d_pin, 0);
  65.         }
  66. }


更多回帖

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