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.

[参考译文] TMS320F280039C:BIOS 系统下异常最高优先级 ePWM 中断

Guru**** 2549160 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1560138/tms320f280039c-abnormal-highest-priority-epwm-interrupt-under-bios-system

器件型号:TMS320F280039C
主题中讨论的其他器件:SYSBIOS

工具/软件:

BIOS 系统的代码如下所示。 图 1 显示了 EPWM 波形(蓝色)和中断波形(黄色,每次进入 EPWM 中断时切换一次)。 如图所示、中断的切换位置不会在 ePWM 波形的中点(即 PRD 位置)发生。 此外、在固定的间隔 (1ms) 下会发生中断异常。

BIOS.cpufreq.lo = 120000000;

load.hwiEnabled = true;
load.swiEnabled = true;

Var task0Params = new Task.Params ();
task0Params.instance.name =“task0";“;
task0Params.priority = 12;
TASK0Params.STACKSIZE = 512;
program.global.task0 = Task.create(“&TaskParameterInit",“,task0Params、task0Params);
Var task1Params =新建 Task.Params ();
task1Params.instance.name =“Task1";“;
task1Params.priority = 8;
TASK1Params.STACKSIZE = 512;
program.global.task1 = Task.create(“&TaskBasicControl",“,task1Params、task1Params);
//任务 2
Var task2Params =新建 Task.Params ();
task2Params.instance.name =“task2";“;
task2Params.priority = 7;
TASK2Params.STACKSIZE = 768;
program.global.task2 = Task.create(“&TaskMonitorControl",“,task2Params、task2Params);

var ti_sysbios_hal_Hwi0Params = new ti_sysbios_hal_hwi.Params ();
ti_sysbios_hal_Hwi0Params.instance.name =“hwi_pwm";“;
TI_SYSBIOS_Hal_Hwi0Params.priority = 15;
TI_SYSBIOS_Hal_Hwi0Params.EventID =–1;
program.global.hwi_pwm = ti_sysbios_hal_hwi.create (52、“&HwiPwmISR",“,ti_sysbios_hal_Hwi0Params、ti_sysbios_hal_Hwi0Params);
// hwi1
var ti_sysbios_hal_hwi1Params = new ti_sysbios_hal_hwi.Params ();
ti_sysbios_hal_Hwi1Params.instance.name =“hwi_sciarx";“;
TI_SYSBIOS_Hal_Hwi1Params.priority = 9;
program.global.hwi_sciarx = ti_sysbios_hal_Hwi.create (96、“&HwiSciaRX",“,ti_sysbios_hal_Hwi1Params、ti_sysbios_hal_Hwi1Params);
// hwi2
var ti_sysbios_hal_Hwi2Params = new ti_sysbios_hal_hwi.Params ();
ti_sysbios_hal_Hwi2Params.instance.name =“hwi_sciatx";“;
TI_SYSBIOS_Hal_Hwi2Params.priority = 8;
program.global.hwi_sciatx = ti_sysbios_hal_Hwi.create (97、“&HwiSciaTX",“,ti_sysbios_hal_Hwi2Params、ti_sysbios_hal_Hwi2Params);

void EPWM5_Init (void)

EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;//开启EPWM1时钟 μ s
EDIS;
// EALLOW;
//EPwm5Regs.TZSEL.BIT.OSHT4 = 1;//使能单次触发(单次触发)保护 μ s
//EPwm5Regs.TZEINT.bit.OST = 1;
//EDIS;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO0 (EPWM1A) 上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 1;//禁用 GPIO1 上的上拉电阻 (EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1;//将 GPIO0 配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1;//将 GPIO1 配置为 EPWM1B
EDIS;
EPwm5Regs.TBCTL.BIT.PHSEN = TB_ENABLE;//相位加载使能 μ s
EPwm5Regs.TBPHS.bit.TBPHS = 0;相位值为0 μ s
EPwm5Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1;//高速预分频 μ s
EPwm5Regs.TBCTL.BIT.CLKDIV = TB_DIV1;//时基预分频 DIV1意思不分频 μ s
EPwm5Regs.TBPRD = 1000;//设置周期值(决定PWM频率)μ s
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPdown;//向上 μ 向下计数模式 μ s
EPwm5Regs.TBCTL.BIT.PRDLD = TB_SHADOW;//影子寄存器模式 μ s
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;// CMPA使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;// CMPB使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.LOADAMODE = 2;//重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPCTL.bit.LOADBMODE = 2;重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPA.bit.CMPA = 0;////初始化CMPA值 μ s
EPwm5Regs.CMPB.bit.CMPB = 1000;//初始化CMPA值 μ s
EPwm5Regs.AQCTLA.bit.CAU = AQCLEAR;//当计数器 μ 比较值A且计数方向向上(μ s 向上)时、清除PWM1A(拉低)μ s
EPwm5Regs.AQCTLA.bit.cad = AQ_SET;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.AQCTLB.bit.CBU = AQ_SET;//当计数器 μ 比较值A且计数方向向上(μ s)时、清除PWM1A(拉低)μ s 向上计数
EPwm5Regs.AQCTLB.bit.CBD = AQCLEAR;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;
EPwm5Regs.ETSEL.bit.intEn = 1;//使能ePWM1中断 μ s
EPwm5Regs.ETPS.bit.INTPRD = 1;//每个事件都触发中断(无分频)μ s
}

void HwiPwmISR (void)

LED16_TOGGLE;
LED17_toggle;
EPwm5Regs.ETCLR.bit.INT = 1;
}


非 BIOS 系统的代码如下所示。 图 2 显示了 EPWM(蓝色)波形和中断(黄色,每次进入 EPWM 中断时切换一次)波形。 从图中可以看出、中断切换恰好在 EPWM 波形的中点发生、并保持稳定、不会出现任何异常。

void EPWM5_Init (void)

EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM5 = 1;//开启EPWM1时钟 μ s
EDIS;
EALLOW;
PieVectTable.EPWM5_INT =&epwm1_timer_ISR;提供中断服务程序入口 μ s
EDIS;
// EALLOW;
// EPwm5Regs.TZSEL.bit.OSHT4 = 1;//使能单次触发(单次)保护 μ s
//EPwm5Regs.TZEINT.bit.OST = 1;
//EDIS;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO0 (EPWM1A) 上的上拉
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 1;//禁用 GPIO1 上的上拉电阻 (EPWM1B)
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 1;//将 GPIO0 配置为 EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 1;//将 GPIO1 配置为 EPWM1B
EDIS;
EPwm5Regs.TBCTL.BIT.PHSEN = TB_ENABLE;//相位加载使能 μ s
EPwm5Regs.TBPHS.bit.TBPHS =0;//相位值为0 μ s
EPwm5Regs.TBCTL.BIT.HSPCLKDIV=TB_DIV1;//高速预分频 μ s
EPwm5Regs.TBCTL.BITS.CLKDIV=TB_DIV1;//时基预分频 DIV1意思不分频 μ s
EPwm5Regs.TBPRD = 1000;//设置周期值(决定PWM频率)μ s
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPdown;//向上 μ 向下计数模式 μ s
EPwm5Regs.TBCTL.BIT.PRDLD = TB_SHADOW;//影子寄存器模式 μ s
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;// CMPA使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;// CMPB使用影子寄存器 μ s
EPwm5Regs.CMPCTL.bit.LOADAMODE = 2;//重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPCTL.bit.LOADBMODE = 2;重要、关乎合适加载占空比 μ s
EPwm5Regs.CMPA.bit.CMPA = 500;//初始化CMPA值 μ s
EPwm5Regs.CMPB.bit.CMPB = 500;//初始化CMPA值 μ s
EPwm5Regs.AQCTLA.bit.CAU = AQclear;//当计数器 μ 比较值A且计数方向向上(μ s)时、清除PWM1A(拉低)μ s 向上计数
EPwm5Regs.AQCTLA.bit.cad = AQ_SET;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.AQCTLB.bit.CBU = AQ_SET;//当计数器 μ 比较值A且计数方向向上(μ s 向上)时、清除PWM1A(拉低)μ s
EPwm5Regs.AQCTLB.bit.CBD = AQCLEAR;//当计数器=比较值A且计数方向向下(μ s 向下)时、置位PWM1A(拉高)μ s
EPwm5Regs.ETSEL.bit.INTSEL =ET_CTR_PRD;
EPwm5Regs.ETSEL.bit.intEn = 1;//使能ePWM1中断 μ s
EPwm5Regs.ETPS.bit.INTPRD = 1;//每个事件都触发中断(无分频)μ s
EALLOW;
PieCtrlRegs.PIEIER3.bit.INTx5 = 1;// EPWM1中断 μ s
IER |= M_INT3;使能CPU中断3 μ s
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//同步启动所有ePWM时基计数器 μ s
EDIS;
EINT;//开启全局中
ERTM;//允许实时调试中断
}

__ interrupt void epwm1_timer_isr (void)

LED16_TOGGLE;
LED17_toggle;
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}

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

    您好:

    动作限定器设置的变化可能会导致脉冲跳跃、您是否在代码过程中更改了 AQ?

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

    在程序执行期间、AQ、CMP 和 TBPRD 保持不变、ePWM 波形(图 1 中的蓝色波形)没有异常。 但是、进入中断的时序(由图中的黄色波形表示,每次触发 EPWM 中断时都会切换该波形)是不正确的。

    图 1 和图 2 的初始化配置本质上是相同的、不同之处在于图 1 中的系统在基于 BIOS 的系统上运行、其中 EPWM 中断在.cfg 文件中配置、如以下代码所示。
    var ti_sysbios_hal_hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var ti_sysbios_hal_Hwi0Params = new ti_sysbios_hal_hwi.Params ();
    ti_sysbios_hal_Hwi0Params.instance.name =“hwi_pwm";“;
    TI_SYSBIOS_Hal_Hwi0Params.priority = 15;
    TI_SYSBIOS_Hal_Hwi0Params.EventID =–1;
    program.global.hwi_pwm = ti_sysbios_hal_hwi.create (52、“&HwiPwmISR",“,ti_sysbios_hal_Hwi0Params、ti_sysbios_hal_Hwi0Params);

    相比之下、图 2 在非 BIOS 系统上运行、在初始化期间配置中断、进入中断的时序(由黄色波形表示,每次触发 EPWM 中断时都会切换)是正常的、如以下代码所示。
    EALLOW;
    PieVectTable.EPWM5_INT =&epwm1_timer_ISR;
    EDIS;
    EPwm5Regs.ETSEL.bit.INTSEL =ET_CTR_PRD;
    EPwm5Regs.ETSEL.bit.intEn = 1;
    EPwm5Regs.ETPS.bit.INTPRD = 1;
    EALLOW;
    PieCtrlRegs.PIEIER3.bit.INTx5 = 1;
    IER |= M_INT3;
    EDIS;

    我想知道这个问题是否是由 BIOS 系统中的调度引起的、这会导致进入 ePWM 中断的异常时序。 如果是、如何优化和改进它?

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

    在程序执行期间、AQ、CMP 和 TBPRD 保持不变、ePWM 波形(图 1 中的蓝色波形)没有异常。 但是、进入中断的时序(由图中的黄色波形表示,每次触发 EPWM 中断时都会切换该波形)是不正确的。

    图 1 和图 2 的初始化配置本质上是相同的、不同之处在于图 1 中的系统在基于 BIOS 的系统上运行、其中 EPWM 中断在.cfg 文件中配置、如以下代码所示。
    var ti_sysbios_hal_hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var ti_sysbios_hal_Hwi0Params = new ti_sysbios_hal_hwi.Params ();
    ti_sysbios_hal_Hwi0Params.instance.name =“hwi_pwm";“;
    TI_SYSBIOS_Hal_Hwi0Params.priority = 15;
    TI_SYSBIOS_Hal_Hwi0Params.EventID =–1;
    program.global.hwi_pwm = ti_sysbios_hal_hwi.create (52、“&HwiPwmISR",“,ti_sysbios_hal_Hwi0Params、ti_sysbios_hal_Hwi0Params);

    相比之下、图 2 在非 BIOS 系统上运行、在初始化期间配置中断、进入中断的时序(由黄色波形表示,每次触发 EPWM 中断时都会切换)是正常的、如以下代码所示。
    EALLOW;
    PieVectTable.EPWM5_INT =&epwm1_timer_ISR;
    EDIS;
    EPwm5Regs.ETSEL.bit.INTSEL =ET_CTR_PRD;
    EPwm5Regs.ETSEL.bit.intEn = 1;
    EPwm5Regs.ETPS.bit.INTPRD = 1;
    EALLOW;
    PieCtrlRegs.PIEIER3.bit.INTx5 = 1;
    IER |= M_INT3;
    EDIS;

    我想知道这个问题是否是由 BIOS 系统中的调度引起的、这会导致进入 ePWM 中断的异常时序。 如果是、如何优化和改进它?

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

    您好、感谢您的耐心。 是否仍遇到此问题? 默认情况下不会嵌套中断、因此如果在 EPWM 中断触发之前不久偶尔触发一些其他中断、这可能会阻止中断运行、直到先前的中断完成。 您是否在此系统中启用了其他中断? 至少、默认情况下、SYSBIOS 时钟模块会为器件上的其中一个计时器中断设置 Hwi、因此这可能是一个因素。

    另请记住、使用 SYSBIOS 时、由于运行 Hwi 调度器所需的时间、到达 Hwi 功能的延迟比常规的非 BIOS 中断更长。 请在此处查看时序基准测试:

    https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/bios/sysbios/6_83_00_18/exports/bios_6_83_00_18/packages/ti/sysbios/benchmarks/doc-files/benchmarks.html

    下面的线程中有一些关于嵌套和使用“零延迟“中断(如果需要)的提示:

     【常见问题解答】是否有任何特定于 C28 器件的 TI-RTOS (SYS/BIOS) 项? 

    请注意、不再支持 SYS/BIOS。 我可以提出一些想法、但支持有限。 如果您仍然能够这样做、我建议迁移到 FreeRTOS 等另一个选项。

    Whitney