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/TMS320F28379D:ISR 中断/修剪程序

Guru**** 2601915 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/676546/ccs-tms320f28379d-isr-interrupt-murger-programs

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

您好,

我正在使用 CCs7、C2000 V3和最新版本的编译器。

我遇到了两个正在工作的项目的问题。

该程序是 ADC_SoC_software_cpu01.c (由 controlSUITE 提供)和一个有关 PWM 的个人程序。 PWM 不使用中断。

当我  第一次添加具有 PWM 的程序 ADC 时、程序会工作。 程序第二次进入此部分并停止: (在 F2837xD_DefaultISR.c 中)


中断空 Timer1_ISR (空)

   //
   //在此处插入 ISR 代码
   //

   //
   //接下来的两行仅用于调试,以在此处停止处理器
   //插入 ISR 代码后删除
   //
   ASM ("     ESTOP0");
   for (;;);

我搜索阻止程序的内容,我认为它是关于主程序的初始化,提取:

//******** 我的程序

/***初始化 du Systeme et des PERIPHERIQUES***** /

   InitSysCtrl();
   InitGpio();

   InitPeripheralClocks();//初始化 DES 时钟
   InitFlash();//Initialize la RAM。
   FlashOff ();//Desactive la RAM。
   ServiceDoG();//初始化 DES Dog。
   InitEPwm1Gpio();//Initialize les GPIO pour generer un PWM sur la sortie 1.
   InitEPwm2Gpio();//Initialize les GPIO pour generer un PWM sur la sortie 2.
   InitAPwm1Gpio();//初始化 les GP IOS 覆铜生成器、而不是 PWM sur la sortie 5.
   Dint;// ajout pour ADC
   InitPieCtrl();
   //ajout pour ADC
   //
   //禁用 CPU 中断并清除所有 CPU 中断标志:
   //
       IER = 0x0000;
       IFR = 0x0000;
    // fin ajout
   InitPieVectTable();


   InitSysPll (INT_OSC2、IMULT_35、FULT_0、PLLCLK_By_1);

   EALLOW;
   ClkCfgRegs.PERCLKDIVSEL.BIT.EPWMCLKDIV = 0;//CLKDIV 会使频率下降
   EDIS;

   //config adc
       //
       //启用全局中断和更高优先级的实时调试事件:
       //
           EINT;  //启用全局中断 INTM
           ERTM;  //启用全局实时中断 DBGM

       //
       //配置 ADC 并为其加电
       //
           ConfigureADC();

       //
       //设置用于软件转换的 ADC
       //
           SetupADCSoftware();

   //Fin 配置 ADC

//结束程序

请帮帮我!

提前思考

此致、

JJ.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    JJ、您好!

    您能否提供有关 PWM 程序的更多详细信息? 我会在您的代码中看到一些与闪存相关的 API。 我想您已经正确地按照步骤将程序配置为从闪存运行。

    谢谢
    Vasudha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vasudha、您好!  

    请思考您的答案。

    我的代码是:

    /* cpu1.c -创建日期:1个服务器。 2018 -作者:Haris */

    //包含
    #include "F28x_Project.h"
    #include "driverlib.h"
    #include "math.h"

    void PWM1 (float duty1、int 分辨率);
    void HRPWM (float duty2);
    //__interrupt void epwm1_ISR (void);
    //__interrupt void epwm2_ISR (void);
    //void APWM1 (void);

    //变量 jj
    int resolution = 700;
    float I = 0;
    float Val_max_Duty =700;
    浮点 VAL_MIN_DUTY = 0;
    float val=0;
    void ConfigureADC (void);
    void SetupADCSoftware (void);
    uint16 AdcaResult0;
    uint16 AdcaResult1;
    uint16 AdcbResult0;
    uint16 AdcbResult1;

    int main (空)

       /***初始化 du Systeme et des PERIPHERIQUES***** /

       InitSysCtrl();
       InitGpio();

       InitPeripheralClocks();//初始化 DES 时钟
       InitFlash();//Initialize la RAM。
       FlashOff ();//Desactive la RAM。
       ServiceDoG();//初始化 DES Dog。
       InitEPwm1Gpio();//Initialize les GPIO pour generer un PWM sur la sortie 1.
       InitEPwm2Gpio();//Initialize les GPIO pour generer un PWM sur la sortie 2.
       InitAPwm1Gpio();//初始化 les GP IOS 覆铜生成器、而不是 PWM sur la sortie 5.
       Dint;// ajout pour ADC
       InitPieCtrl();
       //ajout pour ADC
       //
       //禁用 CPU 中断并清除所有 CPU 中断标志:
       //
           IER = 0x0000;
           IFR = 0x0000;
        // fin ajout
       InitPieVectTable();


       InitSysPll (INT_OSC2、IMULT_35、FULT_0、PLLCLK_By_1);
       //时钟源的频率调节器(在 Notre cas INT_OSC1 = 2.5MHz 范围内)。 Regarder doc pour chocisir clock。
       //INT_OSC2=>10MHz (= fOSCCLK)
       //fPLLSYSCLK = fOSCCLK *(SYSPLLMULT.IMULT + SYSPLLMULT.FAULT)/SYSCLKDIVSEL.PLLSYSCLKDIV
       //IMULT_X:乘法器 de r é quence (reglage de base 35)
       //FMULT_X:多路复用器(*0/*0.25/*0.5/*0.75)
       //PLLCLK_BY_X:PLLSYSCLKDIV:频率(最小1)


       //IER = 0x0000;
       //IFR = 0x0000;

       EALLOW;
       ClkCfgRegs.PERCLKDIVSEL.BIT.EPWMCLKDIV = 0;//CLKDIV 会使频率下降
    //   PieVectTable.EPWM1_INT =&epwm1_ISR;
    //   PieVectTable.EPWM2_INT =&epwm2_ISR;
       EDIS;

       //config adc
           //
           //启用全局中断和更高优先级的实时调试事件:
           //
               EINT;  //启用全局中断 INTM
               ERTM;  //启用全局实时中断 DBGM

           //
           //配置 ADC 并为其加电
           //
               ConfigureADC();

           //
           //设置用于软件转换的 ADC
           //
               SetupADCSoftware();

       //Fin 配置 ADC




       while (1){//i = 0;
           /*
           //convert、等待完成并存储结果
           //通过软件 ADCA 立即开始转换
           //
           AdcaRegs.ADCSOCFRC1.ALL = 0x0003;//SOC0和 SOC1

           //
           //通过软件 ADCB 立即开始转换
           //
           AdcbRegs.ADCSOCFRC1.ALL = 0x0003;//SOC0和 SOC1

           //
           //等待 ADCA 完成,然后等待确认标志
           //
           while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0);
           AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

           //
           //等待 ADCB 完成,然后确认标志
           //
           while (AdcbRegs.ADCINTFlG.bit.ADCINT1 = 0);
           AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

           //
           //存储结果
           //
           AdcaResult0 = AdcaResultRegs.ADCRESULT0;
           AdcaResult1 = AdcaResultRegs.ADCRESULT1;
           AdcbResult0 = AdcbResultRegs.ADCRESULT0;
           AdcbResult1 = AdcbResultRegs.ADCRESULT1;

           //
           //此时,转换结果存储在中
           //AdcResult0、AdcResult1、AdcbResult0和 AdcbResult1
           //
            ***/

           Val =((float) Val_max_Duty/3000);

           对于(i=Val 最小占空比;<Val_max_duty;i++){
                   PWM1 (I、分辨率);
                   DELAY_US (10000);
           }





     // PWM1 (5);//报告 Haris
     // HRPWM (2500);//reglage Haris
    //   APWM1();
      // HRPWM (200);
      // PWM1 (1400);

       返回0;


    //__interrupt void epwm1_ISR (void)
    //{

    //}

    //__interrupt void epwm2_ISR (void)
    //{

    //}

    void PWM1 (float duty1、int 分辨率)

       浮点 Rapport;
      // Rapport = 1750 - duty1;// Reglage Haris
       rapport = resolution - duty1;

       /***定义 GPIO a utilizer **/

       GPIO_SetupPinOptions (0、1、GPIO_PULLUP);

       /**CARACTERISTIQUE DE LA PWM***** /
    //ePWM_base selectionne quelle PWM on veut、第1条
     //  ePWM_setTimeBasePeriod (EPWM1_base、1749);//<--分辨率
       ePWM_setTimeBasePeriod (EPWM1_base、(resolution -1));//分辨率-1个婚前成分1 est (vraivile utile?) (程序)
       ePWM_setPhaseShift (EPWM1_base、0U);
       ePWM_setTimeBaseCounter (EPWM1_base、0U);//初始化 DU 计数器。

       ePWM_setCounterCompareValue (EPWM1_BASE、
                                   ePWM_COUNTER_COMPARE_A、
                                   友好关系);//<--- 环流环流环流环流环流环流环流环流环流环流环流环流环流

       ePWM_setTimeBaseCounterMode (EPWM1_base、
                                   ePWM_COUNTER_MODE_UP);
       ePWM_DisablePhaseShiftLoad (EPWM1_base);
       ePWM_setClockPrescaler (EPWM1_base、
                              ePWM_CLOCK 分频器_1、
                              ePWM_HSCLOCK_DEVIDER_1);

       EPWM_setCounterCompareShadowImage LoadMode (EPWM1_BASE、
                                            ePWM_COUNTER_COMPARE_A、
                                            ePWM_COMP_LOAD_ON_CNTR_ZERO);

       ePWM_setActionQualifierAction (EPWM1_base、
                                     ePWM_AQ_OUTPUT A、
                                     ePWM_AQ_OUTPUT 高电平、
                                     ePWM_AQ_output_on_timebase_up_CMPA);
       ePWM_setActionQualifierAction (EPWM1_base、
                                     ePWM_AQ_OUTPUT A、
                                     ePWM_AQ_OUTPUT 低电平、
                                     ePWM_AQ_output_on_timebase_period);



    空 HRPWM (浮点型2)

       浮点 Rapport;
       rapport = 3500 - duty2;

       /***定义 GPIO a utilizer **/

       GPIO_SetupPinOptions (2、1、GPIO_PULLUP);

       /**CARACTERISTIQUE DE LA PWM***** /

       HRPWM_setTimeBasePeriod (EPWM2_base、3499);//<--分辨率
       HRPWM_setPhaseShift (EPWM2_base、0U);
       HRPWM_setTimeBaseCounter (EPWM2_base、0U);//初始化 DU 计数器。

       HRPWM_setCounterCompareValue (EPWM2_base、
                                   HRPWM_COUNTER_COMPARE_A、
                                   友好关系);//<--- 环流环流环流环流环流环流环流环流环流环流环流环流环流

       HRPWM_setTimeBaseCounterMode (EPWM2_base、
                                   ePWM_COUNTER_MODE_UP);
       HRPWM_DisablePhaseShiftLoad (EPWM2_base);
       HRPWM_setClockPrescaler (EPWM2_base、
                              ePWM_CLOCK 分频器_1、
                              ePWM_HSCLOCK_DIVIDER_1);//Modifiedateur de frequencence de la clock PLL (PA recommander de changer d'apres Experience)。

       HRPWM_setCounterCompareShadowImage LoadMode (EPWM2_base、
                                            ePWM_COUNTER_COMPARE_A、
                                            ePWM_COMP_LOAD_ON_CNTR_ZERO);

       HRPWM_setActionQualifierAction (EPWM2_base、ePWM_AQ_output_A、
                                                 ePWM_AQ_OUTPUT 高电平、
                                                 ePWM_AQ_output_on_timebase_up_CMPA);//前单次态 du PWM。
       HRPWM_setActionQualifierAction (EPWM2_base、ePWM_AQ_output_A、
                                                 ePWM_AQ_OUTPUT 低电平、
                                                 ePWM_AQ_output_on_timebase_zero);//前后代 du PWM。

    空配置 ADC (空)

       EALLOW;

       //
       //写入配置
       //
       AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
       AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
       AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
       AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

       //
       //将脉冲位置设置为晚期
       //
       AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
       AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

       //
       //为 ADC 加电
       //
       AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
       AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

       //
       //延迟1ms 以允许 ADC 加电时间
       //
       DELAY_US (1000);

       EDIS;


    //
    // SetupADCSoftware -设置 ADC 通道和采集窗口
    //
    空 SetupADCSoftware (空)

       uint16 acqps;

       //
       //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
       //
       if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
       {
           acqps = 14;//75ns
       }
       否则、//分辨率为16位
       {
           acqps = 63;//320ns
       }

       //
       //选择要转换的通道和转换结束标志
       //ADCA
       //
       EALLOW;
       AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 A0
       AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                              //1个 SYSCLK 周期
       AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1将转换引脚 A1
       AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                              //1个 SYSCLK 周期
       AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1结束将设置 INT1标志
       AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;  //启用 INT1标志
       AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
       //ADCB
       AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 B0
       AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                              //1个 SYSCLK 周期
       AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1将转换引脚 B1
       AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
                                              //1个 SYSCLK 周期
       AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1的末尾将设置 INT1标志
       AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;  //启用 INT1标志
       AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
       EDIS;

    //void APWM1 (void)
    //{
    //   ECAP_enableAPWMMode (ECAP1_BASE);
    //   ECAP_setAPWMPeriod (ECAP1_base、100);
    //   ECAP_setAPWMPolarity (ECAP1_base、ECAP_APWM_ACTIVE_LOW);
    //   ECAP_setPhaseShiftCount (ECAP1_base、50);
    //   ECAP_enableLoadCounter (ECAP1_BASE);
    //   ECAP_loadCounter (ECAP1_BASE);
    //   ECAP_STOPCounter (ECAP1_BASE);
    //   ECAP_startCounter (ECAP1_base);
    //   ECAP_setAPWMCompare (ECAP1_BASE、25);
    //   ECAP_setAPWMShadowImage Compare (ECAP1_base、15);
    //}


    提前思考、

    JJ.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些程序在今天的3小时内有效、并且在发生同样的错误后会出现。 现在、我还没有成功启动该计划...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    JJ、您好!
    我将对此进行研究。 一旦我了解问题、我将再次发布。
    谢谢
    Vasudha
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vasudha、您好!
    我已经解决了我的问题。 我出错了。
    我有:
    InitSysPll (INT_OSC2、IMULT_35、FULT_0、PLLCLK_By_1);
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;

    因此、我要求 CPU 频率为350MHz。 使用该 CPU 是不可能的。 (如果我了解数据表。)
    因此,我更改了:
    InitSysPll (INT_OSC2、IMULT_20、FULT_0、PLLCLK_By_1);
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;

    InitSysPll (INT_OSC2、IMULT_35、FULT_0、PLLCLK_By_1);
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;

    很抱歉、我的愚蠢错误和您同意的时间。

    如果我理解正确,您能不能说我:
    InitSysPll (INT_OSC2、IMULT_20、FULT_0、PLLCLK_By_1);
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0;

    =>INT_OSC2提供10MHz
    => PLL 提供200MHz (10MHz*20)
    对吗?


    InitSysPll (INT_OSC2、IMULT_35、FULT_0、PLLCLK_By_1);
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;

    => PLL 提供175Mhz

    Tkinks 非常适合您的时间。

    此致

    JJ.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JJ、您好!

     此器件的最大 SYSCLK 频率可为200MHz、最大 EPWMCLK 频率可为100MHz。 此外、对于频率高于100MHz 的 SYSCLK、EPWMCLK 必须是 SYSCLK 的一半。
    下面的片段将 SYSCLK 设置为200MHz 和 ePWM
    InitSysPll (INT_OSC2、IMULT_20、FMULT_0、PLLCLK_By_1);//将 SYSCLK 设置为200MHz
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0; //这将设置 EPWMCLK = SYSCLK = 200MHz (这是不正确的)

    相似
    InitSysPll (INT_OSC2、IMULT_35、FMMULT_0、PLLCLK_by_1);//将 SYSCLK 设置为350MHz (不正确)
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;//设置 EPWMCLK = SYSCLK/2 = 175MHz (不正确)

    可能的配置之一可以是:
    InitSysPll (INT_OSC2、IMULT_20、FMULT_0、PLLCLK_By_1);//将 SYSCLK 设置为200MHz
    ClkCfgRegs.PERCLKDIVSEL.BIT.EPWMCLKDIV = 1; //这将设置 EPWMCLK = SYSCLK/2 = 100MHz

    谢谢
    Vasudha