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.

TMS320F28377D: EPWM中断增加函数或内联函数,都会导致系统运行异常 _system_post_cinit() 0x1F2106 (an error occurred: failed to parse the previous frame FP) ,可也能导致系统频繁复位

Part Number: TMS320F28377D

使用CPU作为一个变流器主控,EPWM1作为主中断,频率为20K,配置了freerto系统   工程兼容了库函数和寄存器两种模式

CMD 文件如下:

MEMORY
{
/* BEGIN is used for the "boot to Flash" bootloader mode */

BOOT_RSVD : origin = 0x000002, length = 0x000121 /* Part of M0, BOOT rom will use this for stack */
RAMM0 : origin = 0x000123, length = 0x0002DD
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */


RAMLS03 : origin = 0x008000, length = 0x004000
// RAMLS45 : origin = 0x00A000, length = 0x001000
// RAMD01 : origin = 0x00B000, length = 0x001000
/*
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMLS5 : origin = 0x00A800, length = 0x000800
RAMD0 : origin = 0x00B000, length = 0x000800
RAMD1 : origin = 0x00B800, length = 0x000800
*/
RAMGS05 : origin = 0x00C000, length = 0x006000
RAMGS610 : origin = 0x012000, length = 0x005000
RAMGS1115 : origin = 0x017000, length = 0x005000
/*
RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x018000, length = 0x001000
RAMGS13 : origin = 0x019000, length = 0x001000
RAMGS14 : origin = 0x01A000, length = 0x001000
RAMGS15 : origin = 0x01B000, length = 0x001000
*/
PROGRAM_BOOT : origin = 0x080000, length = 0x008000 //bootload
APP_VER : origin = 0x088000, length = 0x000010
BEGIN : origin = 0x088010, length = 0x000004
PROGRAM_A : origin = 0x088020, length = 0x00FFE0
PROGRAM_B : origin = 0x098000, length = 0x010000
PROGRAM_C : origin = 0x0A8000, length = 0x008000
PROGRAM_D : origin = 0x0B0000, length = 0x008000
PROGRAM_REV : origin = 0x0B8000, length = 0x006000
APP_CHECK : origin = 0x0BE000, length = 0x000004 //Section N
/*
FLASH0 : origin = 0x080002, length = 0x001FFE
FLASH1 : origin = 0x082000, length = 0x002000
FLASH2 : origin = 0x084000, length = 0x002000
FLASH3 : origin = 0x086000, length = 0x002000
FLASH4 : origin = 0x088000, length = 0x008000
FLASH5 : origin = 0x090000, length = 0x008000
FLASH6 : origin = 0x098000, length = 0x008000
FLASH7 : origin = 0x0A0000, length = 0x008000
FLASH8 : origin = 0x0A8000, length = 0x008000
FLASH9 : origin = 0x0B0000, length = 0x008000
FLASH10 : origin = 0x0B8000, length = 0x002000
FLASH11 : origin = 0x0BA000, length = 0x002000
FLASH12 : origin = 0x0BC000, length = 0x002000
FLASH13 : origin = 0x0BE000, length = 0x001FF0
*/

CANA_MSG_RAM : origin = 0x049000, length = 0x000800
CANB_MSG_RAM : origin = 0x04B000, length = 0x000800

CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400

RESET : origin = 0x3FFFC0, length = 0x000002
}

SECTIONS
{
codestart : > BEGIN, ALIGN(4)
.text : >> PROGRAM_B | PROGRAM_C , ALIGN(4)
.cinit : > PROGRAM_A, ALIGN(4)
.switch : > PROGRAM_A, ALIGN(4)
.reset : > RESET, TYPE = DSECT /* not used, */
.stack : > RAMLS03
/* IMPORTANT: The FreeRTOS statically allocated stack should be allocated to this section only */
.freertosStaticStack : > RAMGS1115
/* IMPORTANT: The FreeRTOS heap should be allocated to this section only as the C28x stack
memory can be allocated in the lower 64k RAM memory only. */
.freertosHeap : > RAMGS1115

.init_array : > PROGRAM_A, ALIGN(4)
.bss : > RAMGS05
.bss:output : > RAMGS05
.bss:cio : > RAMGS05
.data : > RAMGS05
.sysmem : > RAMGS610
/* Initalized sections go in Flash */
.const : > PROGRAM_D, ALIGN(4)

// SHARERAMGS0 : > RAMGS1115
// SHARERAMGS1 : > RAMGS1115
// SHARERAMGS2 : > RAMGS1115
ramm0 : > RAMM0, type=NOINIT
ramm1 : > RAMM1, type=NOINIT

MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT
MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT

AppVer : > APP_VER
AppCheck : > APP_CHECK

.TI.ramfunc : {} LOAD = PROGRAM_B,
RUN = RAMGS1115,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)

}
/*
//===========================================================================
// End of file.
//===========================================================================
*/

在中断服务函数中调用以下函数,必定导致系统异常,不调用就正常

{
volatile float32_t fModuAf, fModuBt; //common referenc vector for all sector
volatile float32_t fModuAfTemp,fModuBtTemp,fSqrt3ModuAfTemp,fSqrt3ModuBtTemp;
volatile float32_t fTemp,fTemp1,fTemp2,fTemp3,fTemp4;
volatile float32_t fFactor1,fFactor2;
volatile float32_t fIo1,fIo2;
volatile float32_t fTa,fTb,fTc;
volatile float32_t fTaQ1,fTaQ2,fTbQ1,fTbQ2,fTcQ1,fTcQ2;
volatile float32_t fPwmTaQ1,fPwmTaQ2,fPwmTbQ1,fPwmTbQ2,fPwmTcQ1,fPwmTcQ2;
volatile uint16_t usSector = 0,usRegion = 0;
volatile float32_t fSvIa;
volatile float32_t fSvIb;
volatile float32_t fSvIc;

fSvIa = vInv_dq0.a;
fSvIb = vInv_dq0.b;
fSvIc = vInv_dq0.c;

fModuAfTemp = fSine;
fModuBtTemp = fCose;
fSqrt3ModuAfTemp = SQRT3 * fModuAfTemp;
fSqrt3ModuBtTemp = SQRT3 * fModuBtTemp;

fTemp1 = fModuBtTemp;
fTemp2 = fModuBtTemp - fSqrt3ModuAfTemp;
fTemp3 = fModuBtTemp + fSqrt3ModuAfTemp;

fFactor1 = 0.5f + 0.0f;
fFactor2 = 0.5f - 0.0f;


if(fTemp1>=0)
{
if(fTemp2<=0)
{
usSector=1;
}
else
{
if(fTemp3<=0)
{
usSector=3;
}
else
{
usSector=2;
}
}
}
if(fTemp1<0)
{
if(fTemp2>=0)
{
usSector=4;
}
else
{
if(fTemp3>=0)
{
usSector=6;
}
else
{
usSector=5;
}
}
}

fTemp1= fSqrt3ModuBtTemp * 0.5f; // Ubeta*sqrt3/2
fTemp2= fSqrt3ModuAfTemp * 0.5f; // Ualfa*sqrt3/2

switch (usSector)
{
case 1:
fIo1 = -fSvIa; //for B,D,F Region
fIo2 = fSvIc; //for A,C,E Region
fModuAf = fModuAfTemp;
fModuBt = fModuBtTemp;
break;

case 2:
fIo1 = -fSvIc; // wModuAfTemp,wModuBtTemp
fIo2 = fSvIb; //
fModuAf = fModuAfTemp*0.5f+fTemp1; // Ucos(theta-60) = Ualfa/2 + Ubeta*sqrt(3)/2
fModuBt = fModuBtTemp*0.5f-fTemp2; // Usin(theta-60) = Ubeta/2 - Ualfa*sqrt(3)/2
break;

case 3:
fIo1 = -fSvIb; //
fIo2 = fSvIa; // //
fModuAf = -fModuAfTemp*0.5f+fTemp1; // Ucos(theta-120) = -Ualfa/2 + Ubeta*sqrt(3)/2
fModuBt = -fModuBtTemp*0.5f-fTemp2; // Usin(theta-120) = -Ubeta/2 - Ualfa*sqrt(3)/2
break;

case 4:
fIo1 = -fSvIa; //
fIo2 = fSvIc; //
fModuAf = -fModuAfTemp; // Ucos(theta-180) = -Ualfa
fModuBt = -fModuBtTemp; // Usin(theta-180) = -Ubeta
break;

case 5:
fIo1 = -fSvIc; //
fIo2 = fSvIb; //
fModuAf = -fModuAfTemp*0.5f-fTemp1; //
fModuBt = -fModuBtTemp*0.5f+fTemp2; //
break;

case 6:
fIo1 = -fSvIb;
fIo2 = fSvIa;
fModuAf = fModuAfTemp*0.5f-fTemp1;
fModuBt = fModuBtTemp*0.5f+fTemp2;
break;

default:
fIo1 = fSvIa;
fIo2 = fSvIc;
fModuAf = fModuAfTemp;
fModuBt = fModuBtTemp;
break;
}

fTemp = fModuAf*SQRT3; // | ** 3* * |
fTemp1 = fTemp + fModuBt - 1.0f; //sqrt3*Ualfa + Ubeta - 0x3fff ; // | **---2---** |
fTemp2 = fTemp - fModuBt - 1.0f; //sqrt3*Ualfa - Ubeta - 0x3fff ; // | **----*----** |
fTemp3 = fModuBt - 0.5f; //Ubeta - 0x2000 ; // | **1*********4** |

if(fTemp1<=0) //(AB)
{
usRegion = 1;
}
else if(fTemp3>=0)//E
{
usRegion = 3;
}

else if(fTemp2>=0) // F
{
usRegion = 4;
}
else
{
usRegion = 2; //CD
}

fTemp4 = fModuAf*SQRT3DIV3-fModuBt;
fTemp1 = fTemp - fModuBt; //sqrt3*Ualfa-Ubeta;
fTemp2 = fTemp + fModuBt; //sqrt3*Ualfa+Ubeta;
fTemp3 = fModuBt*2.0f; //2*Ubeta

switch (usRegion)
{
case 1:
//break;
case 2:
if (fTemp4 > 0) //<30 degree C
{
fTa = 2.0f-fTemp2; //按第4小扇区处理 D 载波马鞍波头有一个小尖,为了去掉所以在这里处理
fTb = fTemp3;
fTc = fTemp1-1.0f;

}
else //>30 degree
{
fTa = fTemp3-1.0f; //按第3小扇区处理
fTb = fTemp1;
fTc = 2.0f-fTemp2;
}
break;
case 3:
fTa = fTemp3-1.0f;
fTb = fTemp1;
fTc = 2.0f-fTemp2;
break;

case 4:
fTa = 2.0f-fTemp2;
fTb = fTemp3;
fTc = fTemp1-1.0f;
break;

default:
fTa = fTemp1;
fTb = 2.0f-fTemp2;
fTc = fTemp3;
break;
}

fTemp1 = fModuAf*SQRT3DIV3-fModuBt;

switch (usRegion)
{
case 1:
//break;
case 2:
if(fTemp1>0)
{
if(fIo1<0)
{
fTemp = fFactor1;
fFactor1 = fFactor2;
fFactor2 = fTemp;
}
fTaQ1 = fTa*fFactor1+fTb+fTc;
fTaQ2 = 1.0f;
fTbQ1 = 0.0f;
fTbQ2 = fTa*fFactor1+fTb;
fTcQ1 = 0.0f;
fTcQ2 = fTa*fFactor1;
}
else
{
if(fIo2<0)
{
fTemp = fFactor1;
fFactor1 = fFactor2;
fFactor2 = fTemp;
}
fTaQ1 = fTc*fFactor1+fTa+fTb;
fTaQ2 = 1.0f;
fTbQ1 = fTc*fFactor1+fTa;
fTbQ2 = 1.0f;
fTcQ1 = 0.0f;
fTcQ2 = fTc*fFactor1;
}
break;
case 3:
if(fIo2<0)
{
fTemp = fFactor1;
fFactor1 = fFactor2;
fFactor2 = fTemp;
}
fTaQ1 = fTc*fFactor1+fTa+fTb;
fTaQ2 = 1.0f;
fTbQ1 = fTc*fFactor1+fTa;
fTbQ2 = 1.0f;
fTcQ1 = 0.0f;
fTcQ2 = fTc*fFactor1;
break;
case 4:
if(fIo1<0)
{
fTemp = fFactor1;
fFactor1 = fFactor2;
fFactor2 = fTemp;
}
fTaQ1 = fTa*fFactor1+fTb+fTc; //
fTaQ2 = 1.0f;
fTbQ1 = 0.0f;
fTbQ2 = fTa*fFactor1+fTb;//
fTcQ1 = 0.0f;
fTcQ2 = fTa*fFactor1;
break;
default:
fTaQ1 =fTc*0.5f+fTa*0.5f+fTb;
fTaQ2 = 1.0f;
fTbQ1 = fTc*0.5f;
fTbQ2 = 1-fTa*0.5f;
fTcQ1 = 0.0f;
fTcQ2 = 1-fTc*0.5f-fTa*0.5f;
break;
}

switch(usSector)
{
case 1:
fPwmTaQ1 = fTaQ1;
fPwmTaQ2 = fTaQ2;
fPwmTbQ1 = fTbQ1;
fPwmTbQ2 = fTbQ2;
fPwmTcQ1 = fTcQ1;
fPwmTcQ2 = fTcQ2;
break;
case 2:
fPwmTaQ1 = 1.0f-fTbQ2;
fPwmTaQ2 = 1.0f-fTbQ1;
fPwmTbQ1 = 1.0f-fTcQ2;
fPwmTbQ2 = 1.0f-fTcQ1;
fPwmTcQ1 = 1.0f-fTaQ2;
fPwmTcQ2 = 1.0f-fTaQ1;
break;
case 3:
fPwmTaQ1 = fTcQ1;
fPwmTaQ2 = fTcQ2;
fPwmTbQ1 = fTaQ1;
fPwmTbQ2 = fTaQ2;
fPwmTcQ1 = fTbQ1;
fPwmTcQ2 = fTbQ2;
break;
case 4:
fPwmTaQ1 = 1.0f-fTaQ2;
fPwmTaQ2 = 1.0f-fTaQ1;
fPwmTbQ1 = 1.0f-fTbQ2;
fPwmTbQ2 = 1.0f-fTbQ1;
fPwmTcQ1 = 1.0f-fTcQ2;
fPwmTcQ2 = 1.0f-fTcQ1;
break;
case 5:
fPwmTaQ1 = fTbQ1;
fPwmTaQ2 = fTbQ2;
fPwmTbQ1 = fTcQ1;
fPwmTbQ2 = fTcQ2;
fPwmTcQ1 = fTaQ1;
fPwmTcQ2 = fTaQ2;
break;
case 6:
fPwmTaQ1 = 1.0f-fTcQ2;
fPwmTaQ2 = 1.0f-fTcQ1;
fPwmTbQ1 = 1.0f-fTaQ2;
fPwmTbQ2 = 1.0f-fTaQ1;
fPwmTcQ1 = 1.0f-fTbQ2;
fPwmTcQ2 = 1.0f-fTbQ1;
break;
default:
fPwmTaQ1 = fTaQ1;
fPwmTaQ2 = fTaQ2;
fPwmTbQ1 = fTbQ1;
fPwmTbQ2 = fTbQ2;
fPwmTcQ1 = fTcQ1;
fPwmTcQ2 = fTcQ2;
break;
}

//converte the duty of Q2 (switch 2) to the duty of Q4(switch 4). there are Q1,Q2,Q3,Q4 switchs in every bridge branch
fPwmTaQ2 = 1.0f - fPwmTaQ2;
fPwmTbQ2 = 1.0f - fPwmTbQ2;
fPwmTcQ2 = 1.0f - fPwmTcQ2;


////Limiter of max PWM and min PWM
fTemp = fPwmTaQ1 + fPwmTaQ2 - 1.0f;
if(fTemp > 0)
{
fPwmTaQ1 = fPwmTaQ1 - fTemp*0.5f;
fPwmTaQ2 = fPwmTaQ2 - fTemp*0.5f;
}

fTemp = fPwmTbQ1 + fPwmTbQ2 - 1.0f;
if(fTemp > 0)
{
fPwmTbQ1 = fPwmTbQ1 - fTemp*0.5f;
fPwmTbQ2 = fPwmTbQ2 - fTemp*0.5f;
}

fTemp =fPwmTcQ1 + fPwmTcQ2 - 1.0f;
if(fTemp > 0)
{
fPwmTcQ1 = fPwmTcQ1 - fTemp*0.5f;
fPwmTcQ2 = fPwmTcQ2 - fTemp*0.5f;
}

//Limiter of max PWM and min PWM
if(fPwmTaQ1>1.0f)
{
fPwmTaQ1 = 1.0f;
}
if(fPwmTaQ1<cMinPwm)
{
fPwmTaQ1 = 0;
}

if(fPwmTaQ2>cMaxPwm)
{
fPwmTaQ2 = cMaxPwm;
}
if(fPwmTaQ2<cMinPwm)
{
fPwmTaQ2 = 0;
}

if(fPwmTbQ1>cMaxPwm)
{
fPwmTbQ1 = cMaxPwm;
}
if(fPwmTbQ1<cMinPwm)
{
fPwmTbQ1 = 0;
}
if(fPwmTbQ2>cMaxPwm)
{
fPwmTbQ2 = cMaxPwm;
}
if(fPwmTbQ2<cMinPwm)
{
fPwmTbQ2 = 0;
}

if(fPwmTcQ1>cMaxPwm)
{
fPwmTcQ1 = cMaxPwm;
}
if(fPwmTcQ1<cMinPwm)
{
fPwmTcQ1 = 0;
}

if(fPwmTcQ2>cMaxPwm)
{
fPwmTcQ2 = cMaxPwm;
}
if(fPwmTcQ2<cMinPwm)
{
fPwmTcQ2 = 0;
}

PWM_duty_A= fPwmTaQ1;
PWM_duty_A2 = fPwmTaQ2;
PWM_duty_B = fPwmTbQ1;
PWM_duty_B2 = fPwmTbQ2;
PWM_duty_C = fPwmTcQ1;
PWM_duty_C2 = fPwmTcQ2;

}

中断函数如下:

prj_f2837x_demo.map