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两个中断和主程序同时操作寄存器,中断写寄存器偶尔不成功?是什么原因



F28335在程序中开了2个中断,定时中断1和定时中断2,中断1对寄存器A执行写操作,中断2对寄存器A执行读操作,实际运行时会发现100-1000次之间至少会有一次中断1中对寄存器A的写操作 写入失败,这个是什么原因造成的?寄存器B只有中断1写操作,中断2不操作,则不会出现写失败的情况

中断频率大致在20kHz左右;虽然发现写失败后在主程序补写一次A,可以避免出错,但由于主程序扫描周期较长,还是会影响实际功能应用

希望Ti工程师帮看看到底是什么原因造成的?

  • 中断中的程序都搬到RAM中在运行,主程序在Flash中运行

  • 你是对哪个寄存器进行读写?Timer1和2的中断频率都是20KHz吗?

  • Timer1和Timer2中断频率不相等,一个是27kHz,一个20kHz左右;

    寄存器A在Timer1中断中进行写,Timer2中断中读;寄存器B只在Timer1中断中写;主程序都有对寄存器A,B的读写操作

    偶尔写失败的是Timer1中断中的A寄存器;B寄存器没有出现

  • 寄存器为定义的变量,Uint16 A,B;

    仿真时可以看到分配的地址在0x0000C100

  • 你A变量写的速度是27K,我理解就是每27K的速度写一个新的值,而读是20K的速度,所有读会比写快,那很有可能某几次读的时候还没写新的值。

  • 不是这样的,27k中断里面基本上是1秒钟才会写一次;而20k中断确实是每次都读;知道写出错是因为控制外部器件100-1000次确实会至少有一次失控了,是属于在主程序补上去的情况。

    主要是想搞清楚在什么样的情况下F28335会出现写内部SRAM数据失败的情况。顺着这个思路应该可以找到我的这个程序问题的原因

  • 会出现写失败吗?还是因为中断的临界状态?

  • 我觉得是丢中断了,也就是因为20K中断ISR执行期间,27K发生了2次中断,后来的把先来的掩盖了。具体是不是,还要看你的程序细节。

  • 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;
                    }

    }