找回密码
 立即注册
查看: 1197|回复: 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;
                        }
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 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, 2025-5-2 02:43 , Processed in 0.126005 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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