[讨论]
各位前辈,向您们求助!!C2000按键检测实验响应不正常
俺是菜鸟,最近在学习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可以正常闪烁,请问给位前辈,这是什么原因啊??
-
-
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);
}
}
这样写的理由是??
两个if延时消抖,中间是现象的改变,最后的延时是为了方便观察。开始写的程序没有交替点亮的灯,由于发现两个灯都不亮才让一个交替点亮,改了之后GPIO1的LED可以交替点亮,但是GPIO0的LED还是不亮,设置断点也不亮,第一次按完按键后GPIO12管脚电压恢复1.17V左右,但程序还是能够进入if语句。将GPIO12与GND连接一下之后,程序就不会进入if语句了,但是GPIO0管脚的LED还是不亮,测得都是3.3V左右,好像这一句GpioDataRegs.GPASET.bit.GPIO0 &= 0;就没有执行
回复 板凳newofcortexm3 的帖子
两个if延时消抖,中间是现象的改变,最后的延时是为了方便观察。开始写的程序没有交替点亮的灯,由于发现两个灯都不亮才让一个交替点亮,改了之后GPIO1的LED可以交替点亮,但是GPIO0的LED还是不亮,设置断点也不亮,第一次按完按键后GPIO12管脚电压恢复1.17V左右,但程序还是能够进入if语句。将GPIO12与GND连接一下之后,程序就不会进入if语句了,但是GPIO0管脚的LED还是不亮,测得都是3.3V左右,好像这一句GpioDataRegs.GPASET.bit.GPIO0 &= 0;就没有执行
版主帮我看看吧
GpioDataRegs.GPASET.bit.GPIO0 |= 1;中的“|”去掉
同样
GpioDataRegs.GPASET.bit.GPIO2 &= 0; 中的“&“去掉。,
再者
GpioDataRegs.GPASET.bit.GPIO2 &= 0;这句是没用的。
你可以看一下《TMS320F2802x/TMS320F2802xx Piccolo System
Control and Interrupts Reference Guide》这篇文档
建议楼主:
1、研究TI的例程。controlSuite里什么例程都有。
2、看看它各模块的 文档,
回复 7楼dontium 的帖子
好的,谢谢版主,我在试试
回复 6楼dontium 的帖子
但是LED可以熄灭,但是无法再次点亮,这个是什么原因??
是因为你用了没有作用的那一句,如六楼指出的。
GpioDataRegs.GPxSET.bit.GPIOx = 1才行
[ 本帖最后由 dontium 于 2013-8-15 00:15 编辑 ]
如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;
试试。
回复 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);
}
}
}
}
改成这样依然不亮
回复 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);
}
}
}
}
改成这样依然不亮
自己再看看为什么不亮好吗?
以前给你的回复你是否认真看一下,别只问。好吗?
我知道原因了
GPxSET.bit=1,将管脚设置为输出并将管脚拉高,写GPxSET.bit=0对管脚没有影响;GPxCLEAR.bit=1,将管脚设置为输出并将管脚拉低,写GPxCLEAR.bit=0对管脚没有影响。所以个人认为在论坛上点亮LED的那个帖子里,最好写成GPxCLEAR.bit=1。
谢谢各位前辈帮我
,麻烦了哈
回复 14楼dontium 的帖子
我会了,谢谢前辈哈,之前看论坛点亮LED的帖子,以为只修改GPxSET就行了,麻烦前辈了