This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于F28035 GPIO设置问题

Other Parts Discussed in Thread: 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 这个寄存器是什么意思,能帮我解答一下么?

谢谢大家!

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

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

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

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

     

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

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

  • 各位工程师:

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

           谢谢了。

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

  • “楼主可以试一下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; \
    } \
    }