我用dsPIC33FJ64MC706+C30调试一个变频电源,不知道为什么总是进地址错误陷阱?查了芯片手册说:"所有字访问必须按偶地址对齐。不支持不对齐的字数据
取操作, 所以在混合字节和字操作时, 或者从8位MCU代码移植时,必须要小心。如果试图进行不对齐的读或写操作,将产生地址错误陷阱。如果在读操作时产生错误,正在执行的指令将完成;而如果在写操作时产生错误, 指令仍将执行, 但不会进行写入。无论是哪种情况,都会产生陷阱,从而系统和 / 或用户能够检查地址错误发生之前的机器状态。"
我不知道用C30编程为什么会发生不对齐的字数据取操作,你们在使用过程中碰到过这种情况吗?怎么解决呢?
以下是两个中断服务程序:
//IC4捕捉中断(捕捉时基来自T2)用于测定外部市电信号周期
void __attribute__((interrupt, shadow, auto_psv)) _IC4Interrupt(void)
{
uint tmp1;
while(IC4CONbits.ICBNE) tmp1=IC4BUF; //取第二次捕捉值
//section=0; //同步相位
//phasepoint=0;
Tac=65536-oldIC4+tmp1;
if (tmp1<oldIC4) Tac+=65536;
if (Tac>108000 || Tac<72000) Tac=90000;
oldIC4=tmp1; //保存本次捕捉值
_IC4IF=0;
}
void __attribute__((interrupt, shadow, auto_psv)) _PWMInterrupt(void) //PWM周期匹配中断
{
ulong tmp_point;
uint tabpoint;
uint Tmin,Tmid,Tmax;
uint t1,t2;
_IC4IE=0;
if (LightTime) LightTime--;
//计算t1,t2
tabpoint=phasepoint>>24;
t1=((unsigned long long)Amp*PWMTOP*sintab[tabpoint])>>31; //t1渐增
t2=((unsigned long long)Amp*PWMTOP*sintab[256-tabpoint])>>31; //t2渐减
Tmin=(2*PWMTOP-t1-t2)>>1;
if (section%2==0)
{
Tmid=Tmin+t1;
Tmax=Tmid+t2;
}
else
{
Tmid=Tmin+t2;
Tmax=Tmid+t1;
}
if (section==0) //K4渐小,K6渐大,Tmid渐增
{
PDC1=Tmax;
PDC2=Tmid;
PDC3=Tmin;
}
else if(section==1) //K6渐小,K2渐大,Tmid渐减
{
PDC1=Tmid;
PDC2=Tmax;
PDC3=Tmin;
}
else if(section==2)//K2渐小,K3渐大,Tmid渐增
{
PDC1=Tmin;
PDC2=Tmax;
PDC3=Tmid;
}
else if(section==3)//K3渐小,K1渐大,Tmid渐减
{
PDC1=Tmin;
PDC2=Tmid;
PDC3=Tmax;
}
else if(section==4)//K1渐小,K5渐大,Tmid渐增
{
PDC1=Tmid;
PDC2=Tmin;
PDC3=Tmax;
}
else if(section==5)//K5渐小,K4渐大,Tmid渐减
{
PDC1=Tmax;
PDC2=Tmin;
PDC3=Tmid;
}
tmp_point=phasepoint+delta_phase;
if (tmp_point<phasepoint) //自然溢出
{
section++;
if (section>=6) section=0;
}
phasepoint=tmp_point;
_IC4IE=1;
_PWMIF=0;
}
我关闭了IC4中断,就不会进地址错误陷阱,但是我必须用IC4捕捉输出波型的周期.
(原文件名:无标题.jpg)
一周热门 更多>