NXP

WinCE下使用GPIO中断功能

2019-07-12 13:15发布

By Toradex 秦海 1). 简介 GPIO的中断功能对于嵌入式设备是一个基本功能,本文就基于WinCE系统演示GPIO中断功能使用,所采用的嵌入式系统为Toradex Colibri iMX6S ARM计算机模块配合Colibri Eva Board开发载板。   2). 准备 a). Toradex Colibri iMX6S (基于NXP iMX6 Solo SoC) 计算机模块配合Colibri Eva Board开发载板。 b). WinCE 使用Toradex发布的最新版WEC7镜像V1.1Beta4版本。 c). 调试中断及GPIO所需的Library使用Toradex官方发布的CE iMX6 library 版本。 d). 测试所使用的基准GPIO demo来自于上述library文件中的libdemo目录。 e). 测试所使用的基准Interrupt demo请从这里下载。   3). 通过按键测试中断应用 a). 首先通过按键输入测试中断,按照Interrupt demo配置,还需要一个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驱动,然后保存注册表并重启模块。 ----------------------------      [HKLMDriversBuiltInSDBusDriver]      “Dll” = “_SDBus.dll ---------------------------- d). 在VS2008中打开Interrupt demo程序,如下修改“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);        ///< Set output pin(SODIMM 135) to high               pinLevel = TRUE;                 }                 intCounter = intCounter++;                                    ///< count interrupt triggered numbers                 printf(" Interrupt counter : %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也会变换状态。   4). 通过PWM输入测试中断输入 a). 在上面测试的基础上,选择SODIMM Pin 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++) { Gpio_SetLevel       (hGpio, io1, ioHigh); Sleep(20);     Gpio_SetLevel       (hGpio, io1, ioLow); Sleep(20); } … ---------------------------- c). 编译部署gpio demo到imx6核心板,先运行上面的interrupt demo,然后运行gpio demo,可以看到如下结果捕获了20次中断。