TI中文支持网
TI专业的中文技术问题搜集分享网站

关于F28035 GPIO设置问题

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

Joey Mao:

你是想通过IO口的电平变换触发一个事件么?那你的这条语句EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;是在循环或中断中实时刷新的么?而不是在main函数中只执行一遍

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

liming Liu:

回复 Joey Mao:

这个语句确实没放在循环中,只在主程序里执行了一遍,但我在执行程序以前已经把外部IO口置1了。

现在的情况是当我编译、烧录后第一遍全速跑检测不到外部IO口置1,只有第一次单步或者全速跑一次点击停止,再全速跑一次才能检测到IO口置1,

起初我怀疑是不是全速跑的程序是FLASH里边的,把FLASH重新刷了最新程序还是这种情况,不知道为什么,是不是和CCS有关系呢!

 

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

Joey Mao:

回复 liming Liu:

这个和你的CCS应该没有什么关系,可能和你的程序里的一些初始化,以及运行的逻辑有关系

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

Bruce Wei:

楼主可以试一下driverlib,编程比用寄存器的方式直观和简单。具体例程在controlsuite里面可以找到。

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

liangheng feng:

回复 Bruce Wei:

各位工程师:

        大家好。我想用28035来实现几个GPIO的电平变换来触发一个中断,通过这段代码GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;得到一个gpio对应PIE层的一个中断源,但是看文档给gpio的中断源XINTn只有3个,当我需要多于3个gpio来触发中断需要怎么设置?有没有通过一组gpio触发中断再判断具体gpio的方法?

       谢谢了。

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

liming Liu:

回复 liangheng feng:

可不可以这样,你IO口外部先“与”,然后触发中断,然后在去读各个IO口电平变化,确定具体是哪个IO口~

大家好!

    现在正在用TI的F28035开发套件HVMotorCtrl+PfcKit调试,遇到一个GPIO口设置问题,可能比较初级,请高手帮忙指导一下,问题如下!

我想用F28035的GPIO22引脚检测一个输入电平,来触发一个事件,GPIO设置如下:

GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // 0=GPIO, 1=EQEPS-1, 2=Resv, 3=LINTX-A
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0; // 1=OUTput, 0=INput
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//使能内部上拉
GpioCtrlRegs.GPAQSEL2.bit.GPIO22 =3; // asynch input

main函数如下:

EnableFlag = 0;

EnableFlagTEST = GpioDataRegs.GPADAT.bit.GPIO22;

while (EnableFlag==EnableFlagTEST)
{ BackTicker++;
}

疑问:

1)是不是主程序应该跳出这个while 循环,因为设置了内部上拉(外部也有上拉)GpioDataRegs.GPADAT.bit.GPIO22=1;

但现在是GpioDataRegs.GPADAT.bit.GPIO22=0,程序进入while循环出不来;

)GPAQSEL 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

liming Liu:

回复 Bruce Wei:

“楼主可以试一下driverlib,编程比用寄存器的方式直观和简单”

能详细的讲解一下么,不太懂是什么意思~和我上边的问题怎么联系起来呢?

另外有个问题请教!

我现在在看f2803xhall_gpio.h这个文档,里边有个宏定义 HALL3_DEBOUNCE_MACRO()

里边的函数大概理解,但不是完全明白,有没有方法我把这个宏定义单独在CCS中跑一下,我想看看这个程序到底是如何执行的~

如下代码:

#define HALL3_DEBOUNCE_MACRO(v) \ \ HALL3_DETERMINE_STATE_MACRO(v) /* read HallGpio*/ \ \ if (v.HallGpio == v.HallGpioAccepted) /* GPIO_UNCHANGED: Current GPIO reading == debounced ..*/ \ /*..GPIO reading, no change in state (no edge yet) */ \ { \ if (v.Revolutions <= 0) /* Only create hall map during initial Revolutions*/ \ HALL3_CREATE_MAP(v) \ \ v.StallCount -= 1; /* Decrement stall counter*/ \ if (v.StallCount == 0) \ { \ v.EdgeDebounced = 0x7FFF; /* 0x7FFF If motor has stalled, then user trigger to commutate*/\ v.StallCount = 0xFFFF; /* Reset counter to starting value*/ \ } \ \ v.DebounceCount = 0; \ } \ else /* GPIO_CHANGED: Motor might have moved to a new position.*/ \ { \ if (v.HallGpio == v.HallGpioBuffer) /* Current GPIO reading == previous GPIO reading?*/ \ { \ if (v.DebounceCount >= v.DebounceAmount) /* If equal, is current GPIO reading debounced?*/ \ { \ v.HallGpioAccepted = v.HallGpioBuffer; /* Current GPIO reading is now debounced*/ \ v.EdgeDebounced = 0x7FFF; /*Edge/position debounced, trigger commutation*/\ \ v.StallCount = 0xFFFF; /* On new edge, reset stall counter*/ \ v.CapCounter += 1; /* Increment running edge detection counter*/ \ \ v.DebounceCount = 0; /* Reset debounce counter*/ \ \ if (v.HallMapPointer==0) \ v.Revolutions += 1; /* Increment on every rev (HallMapPointer = 0)*/ \ } \ else /* DEBOUNCE_MORE*/ \ v.DebounceCount += 1; /* Increment debounce counter*/ \ } \ else /* NEW_READING*/ \ { \ v.HallGpioBuffer = v.HallGpio; /* Save new reading and reset debounce counter*/ \ v.DebounceCount = 0; \ } \ }

赞(0)
未经允许不得转载:TI中文支持网 » 关于F28035 GPIO设置问题
分享到: 更多 (0)