野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17775|回复: 8

输入捕获模式下能否开启溢出中断

[复制链接]
发表于 2013-8-13 08:49:11 | 显示全部楼层 |阅读模式
STM32   在TIM的输入捕获模式下能否同时开启事件更新中断(比如计数器向上/向下溢出)和 输入捕获的中断呢
回复

使用道具 举报

 楼主| 发表于 2013-8-13 10:27:44 | 显示全部楼层
是我的问题太幼稚 还是太难了   怎么没人回答呢
回复 支持 反对

使用道具 举报

发表于 2013-8-13 10:53:07 | 显示全部楼层
onev 发表于 2013-8-13 10:27
是我的问题太幼稚 还是太难了   怎么没人回答呢

问了没多久,而且还是早上问,所以没人答很正常,这个我也不会
回复 支持 反对

使用道具 举报

发表于 2013-8-13 19:01:04 | 显示全部楼层
可以的,使能了这两个中断之后,它们都会进入同样的中断服务函数,然后在中断服务函数读取标志位来区分这两个中断源
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-13 20:23:34 | 显示全部楼层
flyleaf 发表于 2013-8-13 19:01
可以的,使能了这两个中断之后,它们都会进入同样的中断服务函数,然后在中断服务函数读取标志位来区分这两 ...

······
/* TIM enable counter */
   TIM_Cmd(TIM4, ENABLE);

   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
   
   /* Enable the CC3/4 Interrupt Request */
   TIM_ITConfig(TIM4, TIM_IT_CC3, ENABLE);
   TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE);
加上这一句TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
后,程序输入捕获不能正常工作,删了就正常了,这是什么问题呢?
回复 支持 反对

使用道具 举报

发表于 2013-8-13 21:53:44 | 显示全部楼层
onev 发表于 2013-8-13 20:23
······
/* TIM enable counter */
   TIM_Cmd(TIM4, ENABLE);

你说的程序不正常是什么现象?要具体点,这样别人很难帮你找到答案。要找具体的原因,你有没有试过在线调试看看它有没有进入到中断?进入了中断有没有看看相应的状态寄存器标志位是不是置位了?   这就是我平时调程序的思路,楼主可以试试~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-14 12:44:28 | 显示全部楼层
随风 发表于 2013-8-13 21:53
你说的程序不正常是什么现象?要具体点,这样别人很难帮你找到答案。要找具体的原因,你有没有试过在线调 ...

嗯  你说的对  问题已解决  谢谢你的提醒          我是在用输入捕获时看到了3.5库例程 库例程能直接算输入的频率  但我发现  它这个也有问题 即如果输入的频率变化很大 那么用它的方法就是有问题的 它的思想是来一个脉冲 记下计数器值 再来一个 再记下计数器值 两值相减 就是脉冲间时间(当然还需要考虑计数器的预分频等,这里略)  如果两个脉冲之间隔得时间太久  计数器已经更新好几遍了  那么这样计算出来的输入脉冲频率当然是不正确的   所以我就想改进一下  我可以让计时器溢出时在溢出中断里定义一个变量加一 有了这个值这样就可以解决这个问题了 当然 也可以加大总计数时间         我有这种思想其实不是一开始想计算脉冲频率而是想计算脉冲个数  思想是在一个固定时间里计脉冲数 为了充分利资源 比如用TIM4的输入捕获 那么产生这个固定时间的任务也可以交给TIM4来完成  所以我就想能不能同时开输入捕获中断和溢出中断  但手册上好像又没写  实验了很久也不行  于是怀疑自己是不是错了  就问了上面的问题  不过现在经过进一步实验发现是可以的            谢谢大侠的不吝赐教
回复 支持 反对

使用道具 举报

发表于 2013-8-14 20:01:35 | 显示全部楼层
onev 发表于 2013-8-14 12:44
嗯  你说的对  问题已解决  谢谢你的提醒          我是在用输入捕获时看到了3.5库例程 库例程能直接算输 ...

这样的学习精神很好~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-19 11:06:00 | 显示全部楼层
本帖最后由 onev 于 2013-8-19 11:10 编辑
flyleaf 发表于 2013-8-14 20:01
这样的学习精神很好~

再次请教:
产生PWM的(TIM3)基时配置:此处产生的PWM频率是(1/1000)M =1000Hz   没错吧?
/* Time base configuration */                 
  TIM_TimeBaseStructure.TIM_Period = 999;      
  TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;            
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;           
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

用(TIM4)输入捕获(非PWM输入捕获)进行如下配置:
/* Time base configuration */                 
   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;      
   TIM_TimeBaseStructure.TIM_Prescaler = 72;               
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;         
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

以上其他配置略!

计算PWM频率的中断函数采用ST官方库例程:(思想很简单,在前面我已经说过)
void TIM4_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM4, TIM_IT_CC3) == SET)
  {
     /* Clear TIM4 Capture compare interrupt pending bit */
     TIM_ClearITPendingBit(TIM4, TIM_IT_CC3);
     if(CaptureNumber1 == 0)
     {
       /* Get the Input Capture value */
       IC4ReadValue1 = TIM_GetCapture3(TIM4);
       CaptureNumber1 = 1;
     }
     else if(CaptureNumber1 == 1)
     {
       /* Get the Input Capture value */
       IC4ReadValue2 = TIM_GetCapture3(TIM4);
      
       /* Capture computation */
       if (IC4ReadValue2 > IC4ReadValue1)
       {
         Capture1 = (IC4ReadValue2 - IC4ReadValue1);
       }
       else
       {
         Capture1 = ((0xFFFF - IC4ReadValue1) + IC4ReadValue2);
       }
       /* Frequency computation */
       TIM3Freq = (uint32_t) SystemCoreClock / Capture1/72;除了在这里需要除以72外,中断函数中其他与库同
       CaptureNumber1 = 0;
     }
   }
}
以上用到的数据类型:__IO uint32_t

问题:当我输出这个频率的时候,是1014.而不是1000.如果TIM_TimeBaseStructure.TIM_Period = 99;结果就更离谱了:输出0;进行了其他实验改变各种配置 也都没有得到正确数据。上次说的用输入捕获电平跳变个数是正确的!这里的就不正确不知道我的理解是否有错误?!或者上面的配置是错误的,能否帮我解答一下?!

回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-24 04:56 , Processed in 0.028275 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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