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.

[参考译文] TMS320F28379D:帮助解决 F28379D 中的中断嵌套

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1624585/tms320f28379d-help-with-intrerrupt-nesting-in-f28379d

部件号: TMS320F28379D

您好、

我有一个使用新函数方法头文件的工作闭环矢量控制代码。 我正在使用 EPWM1 INT 来计算控制代码、并使用 EPWM6 INT 来更新设置。

我想实现中断嵌套、在这种情况下 EPWM1 INT 可能被称为 Whille EPWM6 INT 正在进行中。

我正在查看样本扩展、其中主要使用基于寄存器的方法、但我在访问 PieCtrlRegs 时遇到了困难。 我收到 PieCtrlRegs 未按预期定义的错误。 我找不到没有任何头文件就可以直接使用的地址、添加基于寄存器的头文件会导致很多错误。

实现此目的的最佳方法是什么? (希望解决与未定义 PieCtrlRegs 相关的错误)

示例代码:(欢迎任何建议或潜在问题)

__ interrupt void epwm6ISR (void)

  //添加了用于中断嵌套的额外代码
  Uint16_t TempPIEIER;
  TempPIEIER=PieCtrlRegs.PIEIER3.all; //error
  IER |= 0x003; //通过调整 IER 设置全局优先级
  IER 且= 0x003;
  PieCtrlRegs.PIEIER3.all &= 0x0001;  //error//通过调整 PIEIER3 来设置组优先级以允许 INT3.1 中断当前 ISR
  PieCtrlRegs.PIEACK.ALL = 0xFFFF;   //error//启用 PIE 中断
  asm(“   NOP“);           //等待一个周期
  EINT;

  //添加了用于中断嵌套的额外代码

  GPIO_writePin (22、1); // GPIO 引脚用于检查代码计算时间


  //更新设置和参数||||稍后移至较慢的函数
   update_allsettings();//更新过滤器设置

   //
  //清除该计时器的 INT 标志
  //
  EPWM_clearEventTriggerInterruptFlag (EPWM6_BASE);

  //
  //确认中断组
  //
  INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP3);

  //device_delay_US (5);

  GPIO_writePin (22、0); // GPIO 引脚用于检查代码计算时间

  //GPIO_togglePin (24);//GPIO 24 引脚 34
  //GPIO_togglePin (16);//GPIO 16 引脚 33

  //添加了用于中断嵌套的额外代码


  //添加了用于中断嵌套的额外代码
  DINT;
  PieCtrlRegs.PIEIER2.all = TempPIEIER;//error
  添加了用于中断嵌套的额外代码

}

 

image.png

 

 

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

    添加了定义和 PIECTRL 头文件:

    #include “UserPiectrl.h"</s>“
    #ifdef _cplusplus
    #pragma DATA_SECTION(“PieCtrlRegsFile")“)
    #else
    #pragma DATA_SECTION (PieCtrlRegs、“PieCtrlRegsFile")“);
    #endif
    易失性结构 PIE_CTRL_REGS PieCtrlRegs;

    修改了工作代码:(EPWM1 INT 嵌套在 EPWM6 INT 中)

    __ interrupt void epwm6ISR (void)

    GPIO_writePin (22、1);// GPIO 引脚用于检查代码计算时间

    EPWM_clearEventTriggerInterruptFlag (EPWM6_BASE);
    //EPWM_clearEventTriggerInterruptFlag (EPWM6_BASE);
    INTERRUPT_CLEARACKGROUP (INTERRUPT_ACK_GROUP3);
    //添加了用于中断嵌套的额外代码

    Uint16_t TempPIEIER;
    TempPIEIER=PieCtrlRegs.PIEIER3.all;

    //tempvecvar[0]= TempPIEIER;
    IER |= 0x004;//通过调整 IER 设置全局优先级
    IER 且= 0x004;
    //tempvecvar[1]=IER;
    //tempvecvar[2]=PieCtrlRegs.PIEIER3.all;
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//通过调整 PIEIER3 来设置组优先级、从而允许 INT3.1 中断当前 ISR
    // Interrupt_enable (INT_EPWM1);
    //tempvecvar[3]=PieCtrlRegs.PIEIER3.all;
    //PieCtrlRegs.PIEACK.all = 0xFFFF;//启用 PIE 中断
    asm(“ NOP“);//等待一个周期
    EINT;//启用用于嵌套的全局中断
    //添加了用于中断嵌套的额外代码


    //更新设置和参数||||稍后移至较慢的函数
    update_allsettings();//更新过滤器设置
    //
    //清除该计时器的 INT 标志
    //

    //添加了用于中断嵌套的额外代码
    dint;//再次禁用全局中断
    PieCtrlRegs.PIEIER3.all = TempPIEIER;
    //添加了用于中断嵌套的额外代码

    GPIO_writePin (22、0);// GPIO 引脚用于检查代码计算时间

    }