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;
} 下面的这段代码修改为这就没问题了
void Timer_Multiple_timings(u8 num, u16 cnt)
{
//设置某个定时器的时间
EA = 0; //关闭中断
LibVarTimer = cnt; //临界变量需要和中断互斥写,否则会出错
EA = 1; //使能中断
}
嗯嗯,虽然不是在这里互斥,但是确实互斥写法是正确的。
页:
[1]