如何在满足一定条件下启动定时器中断

2019-07-20 23:05发布

由于想在延时程序(以下程序)执行的时候同时执行其他程序,想把以下程序改成定时器中断,在满足AutoStartCollect==1如何让定时器开始以及停止,请大家指点以下,谢谢
if(AutoStartCollect==1)
{

                for(j=0;j<=20;j++)//间隔采集
                                {
                                        delay_ms(1000);
                                }       
                                StartCollect=1;
                                AutoStartCollect=0;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
warship
1楼-- · 2019-07-21 00:13
本帖最后由 warship 于 2019-5-19 20:01 编辑

//配置TIM2为1s产生一次中断,用于定时器使用
void Timer2_Init(void)
{                                         
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseInitTypeStruct;        
        NVIC_InitTypeDef    NVIC_InitTypeStruct;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        //72000000/7200=10000=10K
        //10Khz的计数频率,每次为1/10K=0.1ms=100us, 计数到10000为1s  
        TIM_TimeBaseInitTypeStruct.TIM_Prescaler = 7199;//tim2预分频值72000000,即时钟为100us
        TIM_TimeBaseInitTypeStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
        TIM_TimeBaseInitTypeStruct.TIM_Period =        9999+1;        //10000*100us=1s溢出一次                                                         
        TIM_TimeBaseInitTypeStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct);                 

        NVIC_InitTypeStruct.NVIC_IRQChannel = TIM2_IRQn;                     //配置定时器中断优先级
        NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority =        1;
        NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitTypeStruct);        

        TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);         //允许溢出中断           
        TIM_Cmd(TIM2,DISABLE);
}

void StopMyTimer2(void)
{
        TIM_Cmd(TIM2,DISABLE );         //失能定时器2
        TIM_ITConfig( TIM2,TIM_IT_Update, DISABLE); //关闭TIM2超时溢出中断        
}


void StartMyTimer2(void)
{
        TIM_Cmd(TIM2,ENABLE );         //使能定时器2
        TIM_ITConfig( TIM2,TIM_IT_Update, ENABLE); //允许TIM2超时溢出中断        
}
        

/******************  以下为TIM2 的中断服务程序 ******************/

volatile u16 My_Delay_s;

//定时器2中断服务: 每1s中断一次
void TIM2_IRQHandler(void)
{

        if(TIM_GetITStatus(TIM2, TIM_IT_Update))  //1秒超时溢出
        {
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update);    //清超时标志
               
            if(My_Delay_s) My_Delay_s--;            else AutoStartCollect=1;

           TIM_ClearITPendingBit(TIM2, TIM_IT_Update);    //清超时标志

           TIM_Cmd(TIM2,ENABLE);
        }
}

warship
2楼-- · 2019-07-21 04:55
定时器本来就是你想开就开,
想停就停的。
通过控制你所用定时器TIMx的CR寄存器的CEN位就可以了。
七彩旋风
3楼-- · 2019-07-21 06:08
 精彩回答 2  元偷偷看……
warship
4楼-- · 2019-07-21 10:48
本帖最后由 warship 于 2019-5-19 20:07 编辑

main(void)
{
Timer2_Init();
while(1)
{
  My_Delay_s=20;
  StartMyTimer2();;;//干其它的工作
  if(AutoStartCollect==1)
  {
   StopMyTimer2();
   AutoStartCollect=0;
   StartCollect=1;
    ;//采集一次
   }

}


//大致如此,只是给你演示一下如何控制定时器的开关,其实不用开关也可以的。
yzm168
5楼-- · 2019-07-21 12:22
 精彩回答 2  元偷偷看……

一周热门 更多>