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.

TMS320F2800137: ADC与外部中断冲突

Part Number: TMS320F2800137


在进行外设配置时,将ADC和外部中断同时配置,发现外部中断不能被触发,当ADC不使能的时候,外部中断就可以触发,就是按照C2000里面的例程进行结合,不知道啥原因,还希望支持一下,外部中断选择端口34,采样采用9,15,23引脚

  • ADC中断使用的是哪个?外部中断使用的是XINT几?ADC中断的触发频率是多少?外部中断的触发频率是多少?

    退出中断函数的时候有没有清PIEACK?

    例程具体是怎么结合的?

  • 这个好像没法添加压缩包,我截图看一下吧

    GPIO_setDirectionMode(17, GPIO_DIR_MODE_IN); // input
    GPIO_setQualificationMode(17, GPIO_QUAL_SYNC);
    GPIO_setDirectionMode(17, GPIO_DIR_MODE_IN);
    GPIO_setInterruptPin(17, GPIO_INT_XINT1);
    GPIO_setInterruptType(GPIO_INT_XINT1, GPIO_INT_TYPE_FALLING_EDGE);
    GPIO_enableInterrupt(GPIO_INT_XINT1);
    
    EALLOW;
    Adc_GPIO_Init(PVFirstSimpleCurrent_PIN,PVFirstSimpleCurrent_PAD);
    Adc_GPIO_Init(PVFirstSimpleVoltage_PIN,PVFirstSimpleVoltage_PAD);
    Adc_GPIO_Init(InverterSimpleVoltage_PIN,InverterSimpleVoltage_PAD);
    
    // Adc_GPIO_Init(GPIO_231_GPIO231,231);
    // Adc_GPIO_Init(GPIO_232_GPIO232,232);
    // Adc_GPIO_Init(GPIO_224_GPIO224,224);
    EDIS;
    
    
    ASYSCTL_init();
    EALLOW;
    ADC_setOffsetTrimAll(ADC_REFERENCE_INTERNAL,ADC_REFERENCE_3_3V);
    
    ADC_setPrescaler(myADC0_BASE, ADC_CLK_DIV_2_0);
    
    ADC_setInterruptPulseMode(myADC0_BASE, ADC_PULSE_END_OF_CONV);
    
    ADC_enableConverter(myADC0_BASE);
    
    DEVICE_DELAY_US(5000);
    
    ADC_disableBurstMode(myADC0_BASE);
    
    ADC_setSOCPriority(myADC0_BASE, ADC_PRI_ALL_ROUND_ROBIN);
    
    ADC_setupSOC(myADC0_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA, ADC_CH_ADCIN0, 9U);
    ADC_setInterruptSOCTrigger(myADC0_BASE, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE);
    ///PVVoltage
    ADC_setupSOC(myADC0_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA, ADC_CH_ADCIN4, 9U);
    ADC_setInterruptSOCTrigger(myADC0_BASE, ADC_SOC_NUMBER1, ADC_INT_SOC_TRIGGER_NONE);
    //current
    ADC_setupSOC(myADC0_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA, ADC_CH_ADCIN12, 9U);
    ADC_setInterruptSOCTrigger(myADC0_BASE, ADC_SOC_NUMBER2, ADC_INT_SOC_TRIGGER_NONE);
    //inverterVoltage
    ADC_setInterruptSource(myADC0_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER2);
    ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);
    ADC_disableContinuousMode(myADC0_BASE, ADC_INT_NUMBER1);
    ADC_enableInterrupt(myADC0_BASE, ADC_INT_NUMBER1);
    EDIS;
    
    EALLOW;
    Interrupt_register(INT_XINT1, &xint1ISR);
    Interrupt_register(INT_ADCA1, &adcA1ISR);
    Interrupt_enable(INT_XINT1);
    Interrupt_enable(INT_ADCA1);
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
    EDIS;

    上面这部分是初始化的程序

    __interrupt void adcA1ISR(void)
    {
    //
    // Store results
    //
    EINT;
    
    adcAResult0 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
    adcAResult1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);
    adcAResult2 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER2);
    // Clear the interrupt flag
    //
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    
    //
    // Check if overflow has occurred
    //
    if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
    {
    ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    }
    
    //
    // Acknowledge the interrupt
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    
    interrupt void xint1ISR(void)
    {
    // GPIO_writePin(40, 0); // GPIO16 is lowered
    // DisablePWMOut();
    // InverterStop();
    keyenable = 0;
    //
    // Acknowledge this interrupt to get more from group 1
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }

    下面这部分是中断程序

    应该复制到主函数可以直接运行

  • 如果需要上传文件,请点击编辑栏下方的插入--文件:

    再点击upload选择本地文件上传。

    XINT中断无法触发时,有没有检查一下相应的中断标志位?

  • gpio_ex2_toggle.zip源代码已上传,中断标志位怎么看呢