[讨论] 各位前辈,向您们求助!!C2000按键检测实验响应不正常

zhangleiat185   2013-8-14 17:40 楼主
俺是菜鸟,最近在学习C2000 launchpad 在学习按键检测时遇到如下问题:
先贴代码:
#include
#include
void main(void)
{
   InitSysCtrl();   //系统控制初始化
   //InitGpio();
   DINT;      //禁止全局中断
   InitPieCtrl();
   IER = 0x0000;  //禁止CPU中断
   IFR = 0x0000;  //清楚CPU所有中断标志
   InitPieVectTable();//位向量表中的所有中断向量配置对应的入口地址
   EALLOW;    //允许访问受保护的空间
   GpioCtrlRegs.GPADIR.bit.GPIO0=1; //配置I/O口为输出
   GpioCtrlRegs.GPADIR.bit.GPIO1=1;
   GpioCtrlRegs.GPADIR.bit.GPIO2=1;
   GpioCtrlRegs.GPADIR.bit.GPIO3=1;
   GpioCtrlRegs.GPADIR.bit.GPIO12=0;
   EDIS;      //禁止访问受保护的空间
   GpioDataRegs.GPASET.bit.GPIO12 == 0;
   for(;;)
        {
     GpioDataRegs.GPASET.bit.GPIO2 &= 0;
     GpioDataRegs.GPASET.bit.GPIO0 &= 0;
     GpioDataRegs.GPASET.bit.GPIO3 &= 0;
     GpioDataRegs.GPATOGGLE.bit.GPIO1=1;
    if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
        {
         DELAY_US(10L);
         if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
         {
          GpioDataRegs.GPASET.bit.GPIO0 |= 1;
          GpioDataRegs.GPASET.bit.GPIO1 |= 1;
          DELAY_US(100000L);
         }
        }
        }
}

设置GPIO12为输入模式,GPIO管脚在没有按下按键时是1.18V左右,按下按键后,管脚电压为3.3V能够进入if语句,LED1和LED2熄灭,但是在按着按键和停止按下按键两种情况下,在程序GpioDataRegs.GPATOGGLE.bit.GPIO1=1;处设置断点,发现GPIO0连接的LED无法点亮,管脚电压3.3V而与GPIO1连接的LED可以正常闪烁,请问给位前辈,这是什么原因啊??
  • 按键电路
  • LED电路

回复评论 (15)

怎么没有人回答啊??!!
点赞  2013-8-14 19:35
if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
        {
         DELAY_US(10L);
         if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
         {
          GpioDataRegs.GPASET.bit.GPIO0 |= 1;
          GpioDataRegs.GPASET.bit.GPIO1 |= 1;
          DELAY_US(100000L);
         }
        }
这样写的理由是??
点赞  2013-8-14 20:39
两个if延时消抖,中间是现象的改变,最后的延时是为了方便观察。开始写的程序没有交替点亮的灯,由于发现两个灯都不亮才让一个交替点亮,改了之后GPIO1的LED可以交替点亮,但是GPIO0的LED还是不亮,设置断点也不亮,第一次按完按键后GPIO12管脚电压恢复1.17V左右,但程序还是能够进入if语句。将GPIO12与GND连接一下之后,程序就不会进入if语句了,但是GPIO0管脚的LED还是不亮,测得都是3.3V左右,好像这一句GpioDataRegs.GPASET.bit.GPIO0 &= 0;就没有执行
点赞  2013-8-14 21:53

回复 板凳newofcortexm3 的帖子

两个if延时消抖,中间是现象的改变,最后的延时是为了方便观察。开始写的程序没有交替点亮的灯,由于发现两个灯都不亮才让一个交替点亮,改了之后GPIO1的LED可以交替点亮,但是GPIO0的LED还是不亮,设置断点也不亮,第一次按完按键后GPIO12管脚电压恢复1.17V左右,但程序还是能够进入if语句。将GPIO12与GND连接一下之后,程序就不会进入if语句了,但是GPIO0管脚的LED还是不亮,测得都是3.3V左右,好像这一句GpioDataRegs.GPASET.bit.GPIO0 &= 0;就没有执行

版主帮我看看吧
点赞  2013-8-14 21:53
GpioDataRegs.GPASET.bit.GPIO0 |= 1;中的“|”去掉

同样
GpioDataRegs.GPASET.bit.GPIO2 &= 0; 中的“&“去掉。,
再者
GpioDataRegs.GPASET.bit.GPIO2 &= 0;这句是没用的。

你可以看一下《TMS320F2802x/TMS320F2802xx Piccolo System
Control and Interrupts Reference Guide》这篇文档
点赞  2013-8-14 22:54
建议楼主:
1、研究TI的例程。controlSuite里什么例程都有。
2、看看它各模块的 文档,
点赞  2013-8-14 23:01

回复 7楼dontium 的帖子

好的,谢谢版主,我在试试
点赞  2013-8-14 23:57

回复 6楼dontium 的帖子

但是LED可以熄灭,但是无法再次点亮,这个是什么原因??
点赞  2013-8-14 23:58
是因为你用了没有作用的那一句,如六楼指出的。

GpioDataRegs.GPxSET.bit.GPIOx = 1才行

[ 本帖最后由 dontium 于 2013-8-15 00:15 编辑 ]
点赞  2013-8-15 00:13
如dontium所说,对寄存器GPxSET,GPxCLEAR,GPxTOFFLE都是只写寄存器,写0都是无效的。
把这些语句
GpioDataRegs.GPASET.bit.GPIO2 &= 0;
GpioDataRegs.GPASET.bit.GPIO0 &= 0;
GpioDataRegs.GPASET.bit.GPIO3 &= 0;
替换成:
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;
GpioDataRegs.GPACLEAR.bit.GPIO3 =1;
试试。
点赞  2013-8-15 09:39

回复 6楼dontium 的帖子

#include
#include
void main(void)
{
   InitSysCtrl();   //系统控制初始化
   //InitGpio();
   DINT;      //禁止全局中断
   InitPieCtrl();
   IER = 0x0000;  //禁止CPU中断
   IFR = 0x0000;  //清楚CPU所有中断标志
   InitPieVectTable();//位向量表中的所有中断向量配置对应的入口地址

   EALLOW;    //允许访问受保护的空间
   GpioCtrlRegs.GPADIR.bit.GPIO0=1; //配置I/O口为输出
   GpioCtrlRegs.GPADIR.bit.GPIO1=1;
   GpioCtrlRegs.GPADIR.bit.GPIO2=1;
   GpioCtrlRegs.GPADIR.bit.GPIO3=1;
   GpioCtrlRegs.GPADIR.bit.GPIO12=0;
   EDIS;      //禁止访问受保护的空间

   GpioDataRegs.GPASET.bit.GPIO12 == 0;
   for(;;)
        {
           if(GpioDataRegs.GPADAT.bit.GPIO12 == 0)
           {
                   GpioDataRegs.GPASET.bit.GPIO2 = 0;
                   GpioDataRegs.GPASET.bit.GPIO0 = 0;
                   GpioDataRegs.GPASET.bit.GPIO3 = 0;
                   GpioDataRegs.GPATOGGLE.bit.GPIO1=1;
                   DELAY_US(100000L);
           }
           if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
               {
                DELAY_US(10L);
                if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
                {
                 GpioDataRegs.GPASET.bit.GPIO0 = 1;
                 GpioDataRegs.GPASET.bit.GPIO1 = 1;
                 DELAY_US(100000L);
                }
               }
        }
}

改成这样依然不亮
点赞  2013-8-15 22:21

回复 11楼newofcortexm3 的帖子

#include
#include
void main(void)
{
   InitSysCtrl();   //系统控制初始化
   //InitGpio();
   DINT;      //禁止全局中断
   InitPieCtrl();
   IER = 0x0000;  //禁止CPU中断
   IFR = 0x0000;  //清楚CPU所有中断标志
   InitPieVectTable();//位向量表中的所有中断向量配置对应的入口地址

   EALLOW;    //允许访问受保护的空间
   GpioCtrlRegs.GPADIR.bit.GPIO0=1; //配置I/O口为输出
   GpioCtrlRegs.GPADIR.bit.GPIO1=1;
   GpioCtrlRegs.GPADIR.bit.GPIO2=1;
   GpioCtrlRegs.GPADIR.bit.GPIO3=1;
   GpioCtrlRegs.GPADIR.bit.GPIO12=0;
   EDIS;      //禁止访问受保护的空间

   GpioDataRegs.GPASET.bit.GPIO12 == 0;
   for(;;)
        {
           if(GpioDataRegs.GPADAT.bit.GPIO12 == 0)
           {
                   GpioDataRegs.GPASET.bit.GPIO2 = 0;
                   GpioDataRegs.GPASET.bit.GPIO0 = 0;
                   GpioDataRegs.GPASET.bit.GPIO3 = 0;
                   GpioDataRegs.GPATOGGLE.bit.GPIO1=1;
                   DELAY_US(100000L);
           }
           if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
               {
                DELAY_US(10L);
                if(GpioDataRegs.GPADAT.bit.GPIO12 == 1)
                {
                 GpioDataRegs.GPASET.bit.GPIO0 = 1;
                 GpioDataRegs.GPASET.bit.GPIO1 = 1;
                 DELAY_US(100000L);
                }
               }
        }
}

改成这样依然不亮
点赞  2013-8-15 22:21


自己再看看为什么不亮好吗?

以前给你的回复你是否认真看一下,别只问。好吗?
点赞  2013-8-15 22:43
我知道原因了 GPxSET.bit=1,将管脚设置为输出并将管脚拉高,写GPxSET.bit=0对管脚没有影响;GPxCLEAR.bit=1,将管脚设置为输出并将管脚拉低,写GPxCLEAR.bit=0对管脚没有影响。所以个人认为在论坛上点亮LED的那个帖子里,最好写成GPxCLEAR.bit=1。


谢谢各位前辈帮我 ,麻烦了哈
点赞  2013-8-15 22:50

回复 14楼dontium 的帖子

我会了,谢谢前辈哈,之前看论坛点亮LED的帖子,以为只修改GPxSET就行了,麻烦前辈了
点赞  2013-8-15 22:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复