OpenEdv-开源电子网

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

请教stm32f4怎么判断定时器中断结束

[复制链接]

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
发表于 2016-1-30 00:36:11 | 显示全部楼层 |阅读模式
5金钱
怎么判断定时器定时中断结束?求高手!
思路是两个定时器产生两个任意定时时间的中断,要求是当一个定时器定时结束时,马上启动另一个定时器,也就是两个定时器轮流工作。
程序如下:

void TIM2_Int_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  

   TIM_TimeBaseInitStructure.TIM_Period = 849;  
   TIM_TimeBaseInitStructure.TIM_Prescaler=49;  //此值会在主程序中更改
   TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
   TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化TIM3

   TIM_ClearFlag(TIM2, TIM_FLAG_Update);
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

   NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;
   NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
   NVIC_Init(&NVIC_InitStructure);
}

TIM3定时器设置和TIM2一样。

void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中断
   {
      TIM2_EN = true;
      TIM_Cmd(TIM2, DISABLE);
   }
  TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
   {
      TIM3_EN = true;
     TIM_Cmd(TIM3, DISABLE);
   }
  TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}

在主程序中
TIM_Cmd(TIM2, ENABLE);
while(TIM2_EN)TIM_Cmd(TIM3, ENABLE),TIM2_EN = false,TIM2->ARR=xx;
while(TIM3_EN)TIM_Cmd(TIM2, ENABLE),TIM3_EN = false,TIM3->ARR=xx;

可是不成功!好象定时器没启动。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2016-1-30 00:37:30 | 显示全部楼层
定时器单个运行正常。
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3340
金钱
3340
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-1-30 02:25:23 | 显示全部楼层
我觉得你这个问题有点不好回答, 首先定时器中断后, 会进入中断函数, 你清中断标志退出后, 中断就结速了呀, 但是如果你不清中断标志,且你中断里需要处理的事大于一次定时器的时间,当前会一直从复中断了。

要实现你这个问题也不难, 先开打开一个定时器, 在第一个先开的中断里处理完你要做的事后,置第二个定时器起动,并关闭第一个定时器, 然后退出第一个定时中断函数,
等第二个定时器中断后, 然然与第一个定时器一样, 退出时关闭自已使能别人, 不就行了吗
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2016-1-30 08:39:06 | 显示全部楼层
我应该理解你的意思,我要实现的功能是关闭一个定时器立马启动另一个定时器,定时时长是不定的,所以不好算出多长时间去启动第二个定时器,我这个程序是控制步进电机的,多个脉冲情况下,8个定时器控制8个步进电机在设定脉冲数的情况下都正常运行,但是我想要知道哪个电机运行结束后,再进行下一个电机动作。脉冲数是主程序中根据文件来设定的,不是固定的。
回复

使用道具 举报

14

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-1-14
在线时间
18 小时
 楼主| 发表于 2016-1-30 08:49:08 | 显示全部楼层
刚试了下程序,原来是while打断了定时器中断,就是不知道定时寄存器中的哪个参数是代表定时器结束的。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-1-30
在线时间
10 小时
发表于 2016-1-30 22:37:55 | 显示全部楼层
一个电机结束做一个标志。。。试试吧。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-31 15:51:15 | 显示全部楼层
中断服务函数的最后一句话作为启动另外一个定时器的语句即可。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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