OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2157|回复: 5

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

[复制链接]

14

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-4-10
在线时间
30 小时
发表于 2019-5-19 10:46:39 | 显示全部楼层 |阅读模式
5金钱
由于想在延时程序(以下程序)执行的时候同时执行其他程序,想把以下程序改成定时器中断,在满足AutoStartCollect==1如何让定时器开始以及停止,请大家指点以下,谢谢
if(AutoStartCollect==1)
{

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

最佳答案

查看完整内容[请看2#楼]

//配置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, 计数到10 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4519
金钱
4519
注册时间
2018-5-11
在线时间
946 小时
发表于 2019-5-19 10:46:40 | 显示全部楼层
本帖最后由 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);
        }
}

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4519
金钱
4519
注册时间
2018-5-11
在线时间
946 小时
发表于 2019-5-19 12:22:12 | 显示全部楼层
定时器本来就是你想开就开,
想停就停的。
通过控制你所用定时器TIMx的CR寄存器的CEN位就可以了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

14

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-4-10
在线时间
30 小时
 楼主| 发表于 2019-5-19 12:44:12 | 显示全部楼层
warship 发表于 2019-5-19 12:22
定时器本来就是你想开就开,
想停就停的。
通过控制你所用定时器TIMx的CR寄存器的CEN位就可以了。

刚开始接触,理解的不是特别好,能不能麻烦您说的在仔细点
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4519
金钱
4519
注册时间
2018-5-11
在线时间
946 小时
发表于 2019-5-19 19:52:06 | 显示全部楼层
本帖最后由 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;
    ;//采集一次
   }

}


//大致如此,只是给你演示一下如何控制定时器的开关,其实不用开关也可以的。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-9-6
在线时间
34 小时
发表于 2019-7-8 15:19:12 | 显示全部楼层
warship 发表于 2019-5-19 19:52
main(void)
{
Timer2_Init();

定时器貌似不能关闭
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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