F28335在程序中开了2个中断,定时中断1和定时中断2,中断1对寄存器A执行写操作,中断2对寄存器A执行读操作,实际运行时会发现100-1000次之间至少会有一次中断1中对寄存器A的写操作 写入失败,这个是什么原因造成的?寄存器B只有中断1写操作,中断2不操作,则不会出现写失败的情况
中断频率大致在20kHz左右;虽然发现写失败后在主程序补写一次A,可以避免出错,但由于主程序扫描周期较长,还是会影响实际功能应用
希望Ti工程师帮看看到底是什么原因造成的?
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.
F28335在程序中开了2个中断,定时中断1和定时中断2,中断1对寄存器A执行写操作,中断2对寄存器A执行读操作,实际运行时会发现100-1000次之间至少会有一次中断1中对寄存器A的写操作 写入失败,这个是什么原因造成的?寄存器B只有中断1写操作,中断2不操作,则不会出现写失败的情况
中断频率大致在20kHz左右;虽然发现写失败后在主程序补写一次A,可以避免出错,但由于主程序扫描周期较长,还是会影响实际功能应用
希望Ti工程师帮看看到底是什么原因造成的?
if( RunData.Data.AdCH[0] > SetData.Data.StartLoad + RunData.Data.ZeroPoint )
{
if( RunData.Data.Mode.PressEn==0 )
{
AxisX_Move.Axis_Data.Status.StopMode = 2;
RunData.Data.Mode.PressEn = 1;
}
}
出错的就是这一段,在DMA中断中,“RunData.Data.Mode.PressEn = 1”这一句写成功了,“AxisX_Move.Axis_Data.Status.StopMode = 2”这一句写失败
可以确定其他地方没有对AxisX_Move.Axis_Data.Status.StopMode这个寄存器写操作,只有在另一个中断中有对这个寄存器读的操作
中断中完整的程序如下,检测 AxisX_Move.Axis_Data.Status.StopMode 写2是否成功,确实是成功了,但是不知道主程序为什么又变成了0;
if( RunData.Data.AutoStep == STEPEP )
{
if( RunData.Data.AdCH[0] > SetData.Data.StartLoad + RunData.Data.ZeroPoint )
{
if( RunData.Data.Mode.PressEn==0 )
{
AxisX_Move.Axis_Data.Status.StopMode = 2;
AxisX_Move.Axis_Data.Status.StopMode = 2;
if( AxisX_Move.Axis_Data.Status.StopMode != 2 )
ESTOP0;
RunData.Data.Mode.PressEn = 1;
}
}
}
在所有程序中针对AxisX_Move.Axis_Data.Status.StopMode写0的地方,设置断点,没有出现;
主程序设置如下程序,程序会停止,感觉有点像写2成功了,莫名又变成了0(仿真器读到是0), AxisX_Move.Axis_Data.Status.StopMode定义的是一个Uint32的位7,8;会不会与位操作有关;其他地方检查了好多遍,确定是没有问题
if( RunData.Data.Mode.PressEn )
{
if( AxisX_Move.Axis_Data.Status.StopMode != 2 )
{
TestData[7]++;
ESTOP0;
}
}