用STM32F103C8T6作的控制器,一个全局变量,数据有时自动变0

2019-07-21 00:45发布

int time, SetTime;//使用时间与设定时间
int mode;
_Bool Run_bit;
int BackTime = 0;//反馈时间
int BackMode;//反馈模式
char BackBit;
char key;
Bit_TypeDef  Temp[8] = {SET, SET, SET, SET, SET, SET, 0, 0};

void DIC200_Init(void);//控制器初始化
void Read_24c02_data(void);//读取数据
void Find_ID(void);///检测96位唯一ID
void err_in_out(void);
void Factory_Mode(void);//工厂模式
/**********工作模式**************/
void Tog_Mode(void);//点动
void Time_Mode(void);//时间模式
void Jop_Mode(void);//点动模式

int main(void)
{

DIC200_Init();
  while (1)
{
  
  IWDG_ReloadCounter();//最大间隔时间为1.86S 所以2S内必须喂狗

  if ((!SW_UP0 || !SW_UP1 || !SW_UP2 || !SW_UP3 || !SW_DOWN0 || !SW_DOWN1 || !SW_DOWN2 || !SW_DOWN3) && VAR)//有一个修改参数的键按下并且电磁阀没有运行
  {
   delay_ms(10);
   if ((!SW_UP0 || !SW_UP1 || !SW_UP2 || !SW_UP3 || !SW_DOWN0 || !SW_DOWN1 || !SW_DOWN2 || !SW_DOWN3) && VAR)
   {
    //EXTI->IMR &= ~(0x01 << 3);//关闭外部中断3
    key = 1;
    Key_Intput(&SetTime);//
   }
  }
  
   if (Falling_Edge_Detection(SW_TIME, &Temp[0], 20) && !Run_bit)//按下切换模式
   {
    switch (mode)
    {
     case 0: TIME_LED = RESET;//如果之前是点动模式,那么就变为时间模式
         mode = 1;
         break;
     case 1: TIME_LED = SET;
         mode = 0;
         break;
     default: TIME_LED = SET;
          mode = 0;
          break;
    }
    Stor_Idata(mode, 22, 6);//保存当前模式
   }
  
   if (mode)
   {
   
    if (!SW_BACK) //间隔时间开启
    {
     BackTime = VR_GetData();//开始转换ADC的值
     //printf("%d ", BackTime);
     Tog_Mode();
    }
    else
     Time_Mode();
     
   }
   else
    Jop_Mode();
  
}
}
这是部分代码。就是SetTime这个变量在一天工作当中会有一到两次自动变为0(客户没有按按键,断电会从24C02读取上次的值),修改这个值的地方只有Key_Intput()这个函数,客户现在设定的值是30。不知道是什么原因造成的,望大神指导下方向。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
HXYDJ
1楼-- · 2019-07-21 06:21
重要的变量一般不要直接操作,可以给SetTime设置一个备份变量。每次直接操作备份变量,备份变量操作完成后,如果备份变量的值合法,再将备份的值赋给SetTime。这样就能确保SetTime的值每次改变时都是可控的。
edmund1234
2楼-- · 2019-07-21 07:43
在中断调用过SetTime没有?
dc8421
3楼-- · 2019-07-21 10:01
edmund1234 发表于 2019-5-24 18:02
在中断调用过SetTime没有?

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
        if (TIM3->SR & TIM_IT_Update )  //检查TIM3更新中断
                {
                         
                        time++;
                        if (mode == 1)//时间模式
                        {
                                if (time >= SetTime)
                                {
                                        TIM3->CR1 &= (uint16_t)0xfffe;//停用计时器
                                        SHOT_LED = SET;
                                        Run_bit = RESET;
                                }
                        }
                        TIM3->SR = (uint16_t)0xfffe;  //清除TIMx更新中断标志
                }
}
中断里面只用来作比较
dc8421
4楼-- · 2019-07-21 15:29
另外PCB板在自己公司以0.3S的速度测试了24小时,没出现SetTime变0的情况。以前有台控制器在汽车生产线上工作时数码管显示器乱码(控制器旁边有个很大的电磁铁),控制器是铁外壳,干扰应该是从信号线进去的,后来输入信号加了继电器隔离,控制器电源输入加了滤波器,就没出现乱码了。不知道这是不是干扰造成的。

一周热门 更多>