我有一个工程,功能很简单,定义了两个中断:
一个40us的定时器中断,目前没有重定义rtiNotification函数,库中自带week函数;
另一个是500us的het pwm中断,重定义pwmNotification函数,在此函数中调用一个算法函数ArthmetricTask();
还定义了两个结构体,fcrParamDef fcrCtrlParamStu,fcrCtrlParamStu结构体作为参数传递进函数使用,没有想到,程序执行完计算后,这个结构体的内容被篡改了。
更诡异的是,这个结构体的第一个元素的值变成了ExcUIPIDCtrlStu这个结构体的地址,
有MAP文件为证:
void pwmNotification(hetBASE_t * hetREG,uint32 pwm, uint32 notification)
{
/* enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (35) */
if((pwm == 1U) && (notification == pwmEND_OF_PERIOD))
{
ArthmetricTask();
}
fcrCtrlParamStu2.f32IfKB = 1.0;
/********************/
/* USER CODE END */
}
void ArthmetricTask(void)
{
float32_t f32DataU=0.0F,f32DataI=0.0F;
float32_t f32DataU2=0.0F,f32DataI2=0.0F;
uint8_t u8norDataCnt=0U;
float32_t f32three_vec_sum=0.0f;
ExcAdjustPID(0,0,0,0,&ExcUIPIDCtrlStu,&fcrCtrlParamStu);
}
void ExcAdjustPID(uint32_t u32Exc_on_cmd,float32_t f32Ug_rel,float32_t f32If_rel,fcrCtrlDef *fcrCtrl,ExcPIDCtrlDef *ExcUIPIDCtrl,fcrParamDef *fcrCtrlParam)
{
float32_t f32Result=0.0F,f32DataTemp=0.0F;
float32_t f32IfLb1=0.0F,f32IfLb2=0.0F,f32IfLb=0.0F;
float32_t f32avr_uc=0.0F,f32AvrUcTmp=0.0F;
float32_t f32Va2=0.0F;
f32Result = DealteU_DeltaT_Reset(f32Ug_rel,f32If_rel,fcrCtrlParam->f32If_up_limit,&IIR1_Deltau_tStu,&IIR1_Deltau_tParamStu);
}
ToffDef ToffDeltau_tStu={
.u32TmrNum=6000U,
.u32Delay=0U,
.u32Out=0U
};
ExcPIDCtrlDef ExcUIPIDCtrlStu={
.f32avr_setp = 1.0F,
.f32If_ExiSetp_en = 0U,
.u32navr_avr_uc_sel=0U,
};
float32_t DealteU_DeltaT_Reset(float32_t f32Ug_rel,float32_t f32If_rel,float32_t f32up_limt,IIRFormIIDef *iirInfor,IIR1ParamDef *iir1Param)
{
uint32_t u32CtrlBit=0U;
float32_t f32uplim=0.0F;
float32_t f32Res=0.0F;
Filter_IIR1_FormII(f32Ug_rel,iirInfor,iir1Param);
if(iirInfor->f32Result < -0.5F)
{
u32CtrlBit = bTrue;
}
Toff(u32CtrlBit,&ToffDeltau_tStu);
if(ToffDeltau_tStu.u32Out == bTrue)
{
f32uplim = 0.5F*f32up_limt;
}
else
{
f32uplim = 1.5F*f32up_limt;
}
f32Res = f32If_rel;
if(f32Res > f32uplim)
{
f32Res = f32uplim;
}
if(f32Res < -1000.0F)
{
f32Res = -1000.0F;
}
return f32Res;
}
void Toff(uint32_t u32In,ToffDef *ToffInfor)
{
uint32_t u32Temp=0U;
if(u32In == 0U)
{
ToffInfor->u32Delay++;
}
else
{
ToffInfor->u32Delay = 0U;
}
if(ToffInfor->u32Delay >= 65530U)
{
ToffInfor->u32Delay = 65530U;
}
if(ToffInfor->u32Delay > ToffInfor->u32TmrNum)
{
u32Temp = bTrue;
}
ToffInfor->u32Out = ~u32Temp;
}
主函数
uint32_t u32system_start_flg=0U;
/* USER CODE END */
int main(void)
{
/* USER CODE BEGIN (3) */
hetInit();
rtiInit(); /*compare1 40us*/
rtiEnableNotification(rtiNOTIFICATION_COMPARE1);
rtiStartCounter(rtiCOUNTER_BLOCK1);
_enable_interrupt_();
u32system_start_flg = bTrue;
while(1)
{
}
/* USER CODE END */
return 0;
}
/¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥/
最奇怪的是,如果我注释掉main函数中的定时器的初始化,或者将rti的中断改为compare0,程序功能就会恢复正常
(1)第一种恢复正常的修改
(2)第二种恢复正常的修改
求大神指点,我一度怀疑是不是这个CPU的compare1有bug
这是完整工程的压缩包