现在的位置: 首页 > 综合 > 正文

ARM2440板GPIO输入实验

2013年10月11日 ⁄ 综合 ⁄ 共 2370字 ⁄ 字号 评论关闭

因为考试周开始了,板子又没动大概1周时间,哎。。

 

今天连跑马灯一并复习了吧。。

 

LED的电路原理图在2440开发板底板的原理图能够找得着,如下

灯是低电平亮,接上限流电阻后是与ENT4—ENT7相连,但EINT4—ENT7指得又是哪几个引脚呢?

打开2440核心板的原理图

 

看到EINT4—EINT7其实对应的就是I/O口的F端口中的GPF4—GPF7,而在2440中F口有三个寄存器,分别是控制寄存器GPFCON,数据寄存器GPFDAT,以及上拉电阻寄存器GPFUP,这里用到的是前两个。

 

然后既然是I/O实验,除了LED灯输出外就还得有输入控制。在板子上,一共有K1—K6六个开关,按手边的书(写的是2410的)里头的意思是,K1-K4对应的是G口,因此需要对G口进行配置。书上的配置如下(程序片段)

  1. #define KEY1    (1<<3)          
  2. #define KEY2    (1<<7)
  3. #define KEY3    (1<<8)
  4. #define KEY4    (1<<11)
  5. //配置语句
  6. rGPGCON=rGPGCON&(~((03<<6)|(3<<14)|(3<<16)|(3<<22)))
  7. //判断语句有
  8.         if(rGPGDAT&KEY1)
  9.         {
  10.             rGPFDAT|=LED1;     
  11.         }
  12.         else
  13.         {
  14.             rGPFDAT&=~LED1;    //GPGDAT相应位置为0,有输入,灯亮
  15.         }
  16.         if (rGPGDAT&KEY2)
  17.         {
  18.             rGPFDAT|=LED2;
  19.         }
  20.         else
  21.         {
  22.             rGPFDAT&=~LED2;
  23.         }
  24.         if (rGPGDAT&KEY3)
  25.         {
  26.             rGPFDAT|=LED3;
  27.         }
  28.         else
  29.         {
  30.             rGPFDAT&=~LED3;
  31.         }
  32.         if (rGPGDAT&KEY4)
  33.         {
  34.             rGPFDAT|=LED4;
  35.         }
  36.         else
  37.         {
  38.             rGPFDAT&=~LED4;
  39.         }
  40.     }
  41. }

我按书上的程序照敲进去,结果调试时发现灯并没有按预想的亮灭。觉得不对头,于是打开底板原理图找到开关的电路原理图如下

 

可以看到4个开关分别与EINT0—EINT3相连,而EINT0—EINT3对应的就是之前图里出现过的F端口,原来是这样!

修改程序如下,灯随开关切换亮灭,成功。

总结:这次实验,虽然很简单,但让我获益不少,至少让我觉得某件事之所以没有达到理论的值,肯定有某些错误的因素在干扰,绝对不是偶然的,不能随便就忽略。其实因为接触没多久,看到PC机上的程序能使开发板有反应(尽管不是预期的反应)就已经很是兴奋了,这样是不行的!

今天的探索,让我学到了碰到这样的问题就应该继续探索,直到达到预期目的或者可以用理论解释。这个实验使得我懂得遇到问题应该看看以及怎么看数据手册,自己进行一些分析。哈哈!!加油加油!!

以下是改后的程序:

  1. #include "2410addr.h"
  2. #define KEY1    (1<<0)          
  3. #define KEY2    (1<<1)
  4. #define KEY3    (1<<2)
  5. #define KEY4    (1<<3)
  6. #define LED1    (1<<4)
  7. #define LED2    (1<<5)
  8. #define LED3    (1<<6)
  9. #define LED4    (1<<7)
  10. void Main(void
  11. {
  12.     rGPFCON=(rGPFCON&0x0000)|0x5500;                        //F口后四位作输入LED,前四位做为开关
  13.     //rGPGCON=rGPGCON&(~((03<<6)|(3<<14)|(3<<16)|(3<<22)));   //G口作输入开关
  14.     while(1)
  15.     {
  16.         if(rGPFDAT&KEY1)
  17.         {
  18.             rGPFDAT|=LED1;     //GPGDAT相应位为1表示没有输入,灯灭
  19.         }
  20.         else
  21.         {
  22.             rGPFDAT&=~LED1;    //GPGDAT相应位置为0,有输入,灯亮
  23.         }
  24.         if (rGPFDAT&KEY2)
  25.         {
  26.             rGPFDAT|=LED2;
  27.         }
  28.         else
  29.         {
  30.             rGPFDAT&=~LED2;
  31.         }
  32.         if (rGPFDAT&KEY3)
  33.         {
  34.             rGPFDAT|=LED3;
  35.         }
  36.         else
  37.         {
  38.             rGPFDAT&=~LED3;
  39.         }
  40.         if (rGPFDAT&KEY4)
  41.         {
  42.             rGPFDAT|=LED4;
  43.         }
  44.         else
  45.         {
  46.             rGPFDAT&=~LED4;
  47.         }
  48.     }
  49. }
【上篇】
【下篇】

抱歉!评论已关闭.