Zhouzhou 发表于 2023-9-7 09:15:44

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

配置好定时器后启动实现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 = cnt;
}

/**
* @brief检查某个定时器是否时间到
* @param无
* @retval 无
*/
u8 CheckTimerOut(u8 num)
{
if(0 == LibVarTimer)
{
    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;
                        }

zhp 发表于 2023-9-7 16:09:58

下面的这段代码修改为这就没问题了

void Timer_Multiple_timings(u8 num, u16 cnt)                           
{   
//设置某个定时器的时间
EA = 0;    //关闭中断
LibVarTimer = cnt;    //临界变量需要和中断互斥写,否则会出错
EA = 1;    //使能中断
}

Zhouzhou 发表于 2023-9-8 10:02:48

嗯嗯,虽然不是在这里互斥,但是确实互斥写法是正确的。
页: [1]
查看完整版本: STC8G1K17定时器时间不准 | 已解决