大家好!
现在正在用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; \ } \ }