LAUNCHXL-F280049C: DCL: DCL_runPI_C2运行时程序跑飞,进入了Interrupt_illegalOperationHandler

Part Number: LAUNCHXL-F280049C
Other Parts Discussed in Thread: SFRA

如图所示,上述是我用于测试SFRA的代码,现在对于plant的Bode图已经能正确绘制,然而当我加入闭环控制时,程序却跑飞了。

具体而言,该项目的f28004x_flash_lnk_eabi.cmd是从SFRA的例程example1_stb_f28004x_f32_eabi中直接复制而来,因此它理应运行在Flash上。

根据该cmd文件,dclfuncs应该在初始化阶段被移动到RAM中,查看编译后的.map文件也证明了这一点。

调试时的Memory Allocate也证明了这一点:

当我切换到ClosedLoop_Mode时,程序运行到DCL_runPI_C2函数时,程序立刻跳转到了interrupt_illegalOperationHandler

Fullscreen
1
2
3
4
5
6
7
8
9
10
if (ClosedLoop_Mode == 1)
{
Uref_pu = Uref / U_NOMINAL;
Uref_pu_Inject = SFRA_F32_inject(Uref_pu);
// Duty_pu = DCL_runPI_C1(&Vout_PI, Uref_pu, Uo_pu);
Duty_pu = DCL_runPI_C2(&Vout_PI, Uref_pu_Inject, Uo_pu);
EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A,
(1.f - Duty_pu) * EPWM_getTimeBasePeriod(myEPWM1_BASE));
SFRA_F32_collect(&Duty_pu, &Uo_pu);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我应该如何修改才能使其正常工作?

中断逻辑如下:

ePWM1向上向下计数,频率20kHz, 当CNT达到TBPRD时触发ADCA采样,ADCA的SOC0转换完毕触发控制中断。

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好

    您的中断逻辑有效。 DCL_runPI 不会扰乱任何中断设置、因此我认为问题出在其它地方。

    请确认以下两项、然后再进一步调试:

    1.中断 ISR 是否有__interrupt 说明符来指示编译器的中断?

    2.我看到您正在尝试在启动时为 isrcodefuncs 和 dclfuncs 加载闪存至 ram。 由于您在链接器脚本中未使用可复制表(编译器初始化例程负责可复制的复制)、您是否在程序启动时通过 memcpy 复制? 如下所示:

    Fullscreen
    1
    2
    3
    4
    5
    extern uint32_t __isrcodefuncsLoadStart;
    extern uint32_t __isrcodefuncsRunStart;
    extern uint32_t __isrcodefuncsLoadSize;
    memcpy((void*)& __isrcodefuncsLoadStart,(void*)&__isrcodefuncsRunStart,(uint32_t)__isrcodefuncsLoadSize);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX