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.

TMS320F2800157-Q1: AGPIO initial problem

Part Number: TMS320F2800157-Q1

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main(void)
{
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
InitFlash();
//
// Initialize device clock and peripherals
//
InitSysCtrl();
//
// Initialize GPIO and configure the GPIO pin as a push-pull output
InitGpio();
EALLOW;
GpioCtrlRegs.GPHAMSEL.bit.GPIO230=0;
GpioCtrlRegs.GPHGMUX1.bit.GPIO230=0;
GpioCtrlRegs.GPHMUX1.bit.GPIO230=0;
GpioCtrlRegs.GPHDIR.bit.GPIO230=0;
GpioCtrlRegs.GPHPUD.bit.GPIO230=0;
// AnalogSubsysRegs.AGPIOCTRLH.bit.GPIO230=0;
// GpioCtrlRegs.GPHLOCK.bit.GPIO230=1;
//
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

When I initialize AGPIO pins 224, 227, and 230, especially when initializing the AMSEL register, PWM interrupts cannot enter, but the input status of the relevant pins can be identified. When I only block the AMSEL register and everything else remains unchanged, PWM interrupts can enter normally, but the input status on AGPIO cannot be read.

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    interrupt void MainISR(void)
    {
    EMF_U_STATUS=GpioDataRegs.GPHDAT.bit.GPIO230;
    EMF_V_STATUS=GpioDataRegs.GPHDAT.bit.GPIO227;
    EMF_W_STATUS=GpioDataRegs.GPHDAT.bit.GPIO224;
    //io
    Queue_UStatus= Queue_UStatus << 1;//
    Queue_VStatus= Queue_VStatus << 1;
    Queue_WStatus= Queue_WStatus << 1;
    Queue_UStatus |= EMF_U_STATUS; //
    Queue_VStatus |= EMF_V_STATUS;
    Queue_WStatus |= EMF_W_STATUS;
    //
    status_h = Queue_UStatus & FilterNums;
    if(status_h == FilterNums) Filter_U_Status = 1;
    else if(status_h == 0x0) Filter_U_Status = 0;
    else return;
    status_h = Queue_VStatus & FilterNums;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    您好,我已解决此问题。此问题的原因在于中断内部函数的处理,跟GPIO没有任何关系。可以看我中断内部的代码,里面的else return。当GPIO被初始化后,会执行到else return 这条语句。编译器直接认为是退出中断,所以体现出来的现象是中断进不去。其实中断一直在进,只不过被强制返回了而已。当GPIO没有正确初始化时,这部分语句应该是直接被编译器优化掉了,所以中断可以正常进行。