《电子技术应用》
您所在的位置:首页 > 模拟设计 > 业界动态 > WinCE下使用GPIO中断功能

WinCE下使用GPIO中断功能

2017-05-17
关键词: interrupt WinCE GPIO

  1). 简介

  GPIO的中断功能对于嵌入式设备是一个基本功能,本文就基于WinCE系统演示GPIO中断功能使用,所采用的嵌入式系统为Toradex Colibri iMX6S ARM计算机模块配合Colibri EvaBoard开发载板。

  2). 准备

  a). Toradex ColibriiMX6S (基于NXP iMX6 Solo SoC) 计算机模块配合ColibriEva Board开发载板。

  b). WinCE 使用Toradex发布的最新版WEC7镜像V1.1Beta4版本。

  c). 调试中断及GPIO所需的Library使用Toradex官方发布的CEiMX6 library 版本。

  d). 测试所使用的基准GPIO demo来自于上述library文件中的libdemo目录。

  e). 测试所使用的基准Interruptdemo请从这里下载。

  3). 通过按键测试中断应用

  a). 首先通过按键输入测试中断,按照Interruptdemo配置,还需要一个GPIO输出在接收到中断后改变其所驱动的LED等状态。在选择GPIO的时候,请配合Colibri iMX6 手册来选定未被系统默认功能占用的引脚,如果一定要一些被CE占用但对于产品并未使用功能的引脚,需要现在WinCE注册表中禁止该功能驱动来释放对应管脚,否则会产生冲突,而是中断程序获取中断统计异常,或者GPIO输出被干扰。这里为了演示,就选择模块SODIMM Pin 49和43两个管脚,默认被SD/MMC接口占用,49管脚作为中断输入,43管脚作为GPIO输出驱动LED。

  b). 硬件连接,将Colibri Eva载板X10连接器 SODIMM_49和X21连接器SW6连接,并去掉对应的X11 跳线帽;将X10连接器 SODIMM_43和X21连接器LED1连接,并去掉对应的X11 跳线帽。

  c). iMX6 WEC7系统中如下方式在注册表中关闭SD驱动,然后保存注册表并重启模块。

  ----------------------------

  [HKLM\Drivers\BuiltIn\SDBusDriver]

  “Dll”= “_SDBus.dll

  ----------------------------

  d). 在VS2008中打开Interruptdemo程序,如下修改“interruptdemo.c”文件,中断方式保持上升沿方式,只添加按键抖动过滤以及中断次数统计代码。同时由于下载的demo中自带的库版本较老,请使用最新版本的库文件替换”inc”和”libs“目录的文件。

  ----------------------------

  #define INTERRUPT_PIN  49                 ///<constant interrupt pin

  #define OUTPUT_PIN 43                 ///<constant output pin

  …

  BOOL pinLevelint =FALSE;                               ///< Variable to get irq pin current level

  int intCounter = 0;                                     ///< Variable to count irq numbers

  …

  if (retVal ==WAIT_OBJECT_0)

  {

  Sleep(10);                                                       ///< eliminate button jitter

  pinLevelint= Gpio_GetLevel(hGpio, interruptPin);

  if(pinLevelint == TRUE)

  {

  if(pinLevel == TRUE)

  {

  Gpio_SetLevel(hGpio, outputPin,ioLow);               ///< Set output pin(SODIMM 135) to low

  pinLevel = FALSE;

  }

  else

  {

  Gpio_SetLevel(hGpio, outputPin,ioHigh);        ///< Setoutput pin(SODIMM 135) to high

  pinLevel = TRUE;

  }

  intCounter = intCounter++;                                    ///< count interrupt triggered numbers

  printf("\nInterruptcounter : %d", intCounter);

  Int_InterruptDone(hIntr,systemInterrupt);

  }

  else

  /*if(MessageBox(NULL, L"Interrupt Event Detected, continue Waiting?",L"Interrupt", MB_YESNO) == IDNO)

  {

  break;

  }*/

  {

  Int_InterruptDone(hIntr,systemInterrupt);

  }

  …

  ----------------------------

  e). 编译并部署程序并执行,结果如下,每按键一次SW6,会记录并打印一次中断,同时LED1也会变换状态。

  20170112165609949_w.jpg

  4). 通过PWM输入测试中断输入

  a). 在上面测试的基础上,选择SODIMMPin 133作为PWM输出GPIO,在Colibri Eva载板上面通过X10连接器将SODIMM_133和SODIMM_49互连。

  b). 在VS2008中打开Gpio demo程序,修改Gpio_Demo.c,设置pin为133,同时做周期为40ms的PWM波输出。

  ----------------------------

  …

  uIo io1 = {133, ioColibriPin};

  …

  for(int i=0;i<20;i++)< span="">

  {

  Gpio_SetLevel      (hGpio, io1, ioHigh);

  Sleep(20);

  Gpio_SetLevel       (hGpio, io1, ioLow);

  Sleep(20);

  }

  …

  ----------------------------

  c). 编译部署gpio demo到imx6核心板,先运行上面的interruptdemo,然后运行gpiodemo,可以看到如下结果捕获了20次中断。

  20170112165610340_w.jpg

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。