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.

关于ccs软件使用的问题

Other Parts Discussed in Thread: TMS320F28035

最近工程中用到了tms320f28035的adc,我用controlsuit里面的实例进行了修改,编译下载运行,始终只能进入一次中断,而把实例原封不动的拷贝过来却一切正常。(我只是之前增加了几路adc采样,把epwm触发改成了定时器触发,定时器触发一切ok,现在改回来就不对了,而且和实例一模一样也还是不行。)

我把不同的两个版本函数粘贴在下面,希望各路大神指点迷津。

css版本是5.5.0.00077

下载器是xsd100v2

芯片是:tms320f28035

  • void InitSetAdc(void) //库里面的函数(部分)
    {
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;  // This is needed to write to EALLOW protected register
       PieVectTable.ADCINT1 = &adc_isr;
       EDIS;    // This is needed to disable write to EALLOW protected registers

    // Step 4. Initialize all the Device Peripherals:
       InitAdc();  // For this example, init the ADC
       AdcOffsetSelfCal();

    // Step 5. User specific code, enable interrupts:

    // Enable ADCINT1 in PIE
       PieCtrlRegs.PIEIER1.bit.INTx1 = 1;    // Enable INT 1.1 in the PIE
       IER |= M_INT1;                         // Enable CPU Interrupt 1
       EINT;                                  // Enable Global interrupt INTM
       ERTM;                                  // Enable Global realtime interrupt DBGM

    // Configure ADC
    // Note: Channel ADCINA4  will be double sampled to workaround the ADC 1st sample issue for rev0 silicon errata

       EALLOW;
       AdcRegs.ADCCTL1.bit.INTPULSEPOS    = 1;    //ADCINT1 trips after AdcResults latch
       AdcRegs.INTSEL1N2.bit.INT1E      = 1;    //Enabled ADCINT1
       AdcRegs.INTSEL1N2.bit.INT1CONT   = 0;    //Disable ADCINT1 Continuous mode
       AdcRegs.INTSEL1N2.bit.INT1SEL    = 2;    //setup EOC2 to trigger ADCINT1 to fire
       AdcRegs.ADCSOC0CTL.bit.CHSEL     = 4;    //set SOC0 channel select to ADCINA4(dummy sample for rev0 errata workaround)
       AdcRegs.ADCSOC1CTL.bit.CHSEL     = 4;    //set SOC1 channel select to ADCINA4
       AdcRegs.ADCSOC2CTL.bit.CHSEL     = 2;    //set SOC2 channel select to ADCINA2
       AdcRegs.ADCSOC0CTL.bit.TRIGSEL     = 5;    //set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
       AdcRegs.ADCSOC1CTL.bit.TRIGSEL     = 5;    //set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
       AdcRegs.ADCSOC2CTL.bit.TRIGSEL     = 5;    //set SOC2 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
       AdcRegs.ADCSOC0CTL.bit.ACQPS     = 6;    //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
       AdcRegs.ADCSOC1CTL.bit.ACQPS     = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
       AdcRegs.ADCSOC2CTL.bit.ACQPS     = 6;    //set SOC2 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
       EDIS;

    // Assumes ePWM1 clock is already enabled in InitSysCtrl();
       EPwm1Regs.ETSEL.bit.SOCAEN    = 1;        // Enable SOC on A group
       EPwm1Regs.ETSEL.bit.SOCASEL    = 4;        // Select SOC from from CPMA on upcount
       EPwm1Regs.ETPS.bit.SOCAPRD     = 1;        // Generate pulse on 1st event
       EPwm1Regs.CMPA.half.CMPA     = 0x0080;    // Set compare A value
       EPwm1Regs.TBPRD                 = 0xFFFF;    // Set period for ePWM1
       EPwm1Regs.TBCTL.bit.CTRMODE     = 0;        // count up and start
    }
    void InitSetAdc(void)//修改过的函数
    {
    //     Interrupts that are used in this example are re-mapped to
    //     ISR functions found within this file.
        EALLOW;  // This is needed to write to EALLOW protected register
        PieVectTable.ADCINT1 = &adc_isr;
        EDIS;    // This is needed to disable write to EALLOW protected registers

    //     Step 4. Initialize all the Device Peripherals:
        InitAdc();  // For this example, init the ADC
        AdcOffsetSelfCal();

    //     Step 5. User specific code, enable interrupts:

    //     Enable ADCINT1 in PIE
        PieCtrlRegs.PIEIER1.bit.INTx1 = 1;    // Enable INT 1.1 in the PIE
        IER |= M_INT1;                         // Enable CPU Interrupt 1
        EINT;                                  // Enable Global interrupt INTM
        ERTM;                                  // Enable Global realtime interrupt DBGM

        EALLOW;
        AdcRegs.ADCCTL1.bit.INTPULSEPOS    = 1;    //ADCINT1 trips after AdcResults latch
        AdcRegs.INTSEL1N2.bit.INT1E      = 1;    //Enabled ADCINT1
        AdcRegs.INTSEL1N2.bit.INT1CONT   = 0;    //Disable ADCINT1 Continuous mode
        AdcRegs.INTSEL1N2.bit.INT1SEL    = 2;    //setup EOC2 to trigger ADCINT1 to fire
        AdcRegs.ADCSOC0CTL.bit.CHSEL     = 4;    //set SOC0 channel select to ADCINA4(dummy sample for rev0 errata workaround)
        AdcRegs.ADCSOC1CTL.bit.CHSEL     = 4;    //set SOC1 channel select to ADCINA4
        AdcRegs.ADCSOC2CTL.bit.CHSEL     = 2;    //set SOC2 channel select to ADCINA2
        AdcRegs.ADCSOC0CTL.bit.TRIGSEL     = 5;    //set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
        AdcRegs.ADCSOC1CTL.bit.TRIGSEL     = 5;    //set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
        AdcRegs.ADCSOC2CTL.bit.TRIGSEL     = 5;    //set SOC2 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1, then SOC2
        AdcRegs.ADCSOC0CTL.bit.ACQPS     = 6;    //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
        AdcRegs.ADCSOC1CTL.bit.ACQPS     = 6;    //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
        AdcRegs.ADCSOC2CTL.bit.ACQPS     = 6;    //set SOC2 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
        EDIS;
        /*
        InitCpuTimers();   // For this example, only initialize the Cpu Timers
     // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
     // 60MHz CPU Freq, 50 millisecond Period (in uSeconds)
        ConfigCpuTimer(&CpuTimer0, 20, 500);
        CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction
                                        // to set TSS bit = 0
                                         *
                                         */
    // Assumes ePWM1 clock is already enabled in InitSysCtrl();
       EPwm1Regs.ETSEL.bit.SOCAEN    = 1;        // Enable SOC on A group
       EPwm1Regs.ETSEL.bit.SOCASEL    = 4;        // Select SOC from from CPMA on upcount
       EPwm1Regs.ETPS.bit.SOCAPRD     = 1;        // Generate pulse on 1st event
       EPwm1Regs.CMPA.half.CMPA     = 0x0080;    // Set compare A value
       EPwm1Regs.TBPRD                 = 0xFFFF;    // Set period for ePWM1
    }

  • 请问能否用高亮或者颜色标出两个函数不同的地方吗?我看得有些头大
  • 这两个函数未注释部分一模一样,没有差别。就是替换以后运行效果截然不同,
  • 请问您之前用的是哪个例程?您的意思是有两者情况

    1 在controlsuit打开相关例程直接修改,只能进入一次中断

    2 将controlsuit相关例程内的函数直接拷到您自己的工程,就可以正常工作

    我的理解对吗?
  • 你确定一模一样?

    上面的程序最后一句 EPwm1Regs.TBCTL.bit.CTRMODE     = 0;        // count up and start

    是来启动PWM的,下面的程序遗失了这句,PWM没启动。

  • 楼上说的没错,你没启动PWM,肯定程序会出错,在检查一下程序是不是有bug