找回密码
 立即注册
查看: 445|回复: 2

STC8G1K17定时器时间不准 | 已解决

[复制链接]

该用户从未签到

10

主题

31

回帖

142

积分

注册会员

积分
142
发表于 2023-9-7 09:15:44 | 显示全部楼层 |阅读模式
配置好定时器后启动实现LED灯1秒闪烁,出现问题:闪烁偶尔出现错乱,LED灯1秒内快闪2次
/**
* @brief  初始化定时器0,1ms
* @param  无
* @retval 无
*/
void Timer0_Init(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                    //结构定义
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;  //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;         //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;              //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);   //初值,
        TIM_InitStructure.TIM_Run       = ENABLE;               //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);               //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer0_Init(ENABLE,Priority_0);                    //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}
/**
* @brief  基本定时器中断函数
* @param  无
* @retval 无
*/
void BASIC_TIM_ISR(void)
{
  u8 i;


  for(i=0;i<TIMER_TOTAL;i++)
  {
    if( LibVarTimer > 0)
    {
      LibVarTimer--;
    }
  }                 
}

/**
* @brief  设置某个定时器定时时间
* @param  无
* @retval NUM : 定时器号
          cnt : 定时器定时时间
          Mode: 定时器中断时间
          1  =  1ms
*/
void Timer_Multiple_timings(u8 num, u16 cnt)                           
{     
  //设置某个定时器的时间
  LibVarTimer[num] = cnt;
}

/**
* @brief  检查某个定时器是否时间到
* @param  无
* @retval 无
*/
u8 CheckTimerOut(u8 num)
{
  if(0 == LibVarTimer[num])
  {
    return 0;
  }
  return 0xaa;
}

//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{
  BASIC_TIM_ISR();
}




                        //运行状态1秒闪烁显示-正常        
                        if( CheckTimerOut(MCU_OPRATESTATE_NO) == 0 )
                        {
                                Timer_Multiple_timings(MCU_OPRATESTATE_NO,500);
                                LED = !LED;
                        }
回复 送花

使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    724

    回帖

    2578

    积分

    超级版主

    积分
    2578
    发表于 2023-9-7 16:09:58 | 显示全部楼层
    下面的这段代码修改为这就没问题了

    1. void Timer_Multiple_timings(u8 num, u16 cnt)                           
    2. {     
    3.   //设置某个定时器的时间
    4.   EA = 0;    //关闭中断
    5.   LibVarTimer[num] = cnt;    //临界变量需要和中断互斥写,否则会出错
    6.   EA = 1;    //使能中断
    7. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    10

    主题

    31

    回帖

    142

    积分

    注册会员

    积分
    142
     楼主| 发表于 2023-9-8 10:02:48 | 显示全部楼层
    嗯嗯,虽然不是在这里互斥,但是确实互斥写法是正确的。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-18 07:45 , Processed in 0.059084 second(s), 36 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表