STM32输入捕获低频时寄存器溢出问题请教

2019-12-14 13:22发布

一个老项目,以前是测试固定频率,没考虑溢出问题,运行良好,

现在偶尔会有低频,所以得兼顾,但是加入更新中断后,频繁进入中断,是哪里出问题了?

输入捕获从模式复位,更新中断进行计数累加,记录溢出。

  1. static void TIM2_Mode_Config(void)
  2. {
  3.     TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  4.     TIM_ICInitTypeDef  TIM_ICInitStructure;
  5.     TIM_DeInit(TIM2);
  6.    
  7.     /* Time base configuration */
  8.    
  9.     TIM_TimeBaseStructure.TIM_Period = 0xffff;         
  10.     TIM_TimeBaseStructure.TIM_Prescaler = 71;
  11.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  12.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  13.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  14.    
  15.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  16.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  17.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  18.    
  19.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
  20.     //选择输入比较滤波器 0x0 - 0xF
  21.     TIM_ICInitStructure.TIM_ICFilter = 0x8;  //0x8
  22.    
  23.     TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
  24.    
  25.     /* Select the TIM3 Input Trigger: TI2FP2 */
  26.     TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
  27.    
  28.     /* Select the slave Mode: Reset Mode */
  29.     TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
  30.    
  31.     /* Enable the Master/Slave Mode */
  32.     TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   
  33.    
  34.     /* Enable the CC2 Interrupt Request */
  35.     TIM_ITConfig(TIM2, TIM_IT_Update|TIM_IT_CC2, ENABLE);
  36.    
  37.     /* TIM enable counter */
  38.     TIM_Cmd(TIM2, ENABLE);   
  39. }


  40. void TIM2_ISR(void)
  41. {
  42.     Uint32 IC2Value;

  43.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  44.         {
  45.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除溢出中断标志位
  46.                 cnt_TIM2_IT_Update ++;
  47.         }

  48.         if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  49.         {
  50.                 IC2Value = TIM_GetCapture2(TIM2);
  51.                 TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除捕获中断标志位

  52.                 IC2Value += (cnt_TIM2_IT_Update * 0xFFFF);
  53.                 cnt_TIM2_IT_Update = 0;  //清零
  54.         }
  55. }
复制代码


试验结果,不管低频高频,所有的I2CValue值都大于0xFFFF了,是不是每取一次TIM_GetCapture2也会触发更新中断?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
金色大元宝
1楼-- · 2019-12-14 14:38
 精彩回答 2  元偷偷看……
金色大元宝
2楼-- · 2019-12-14 18:17
貌似就是这个问题,每次捕获都会产生更新中断,后来想了个笨办法,利用空闲的TIM6时基来做溢出计时器,和捕获时钟同频率,

然后在TIM6更新中断里自增, 在TIM2捕获中断里TIM6->CNT = 0;

试验了下,可以用。

如果前辈们有更好更简便的方法,请不吝赐教。
bolizhicheng204
3楼-- · 2019-12-14 22:15
金 {MOD}大元宝 发表于 2018-6-13 14:09
貌似就是这个问题,每次捕获都会产生更新中断,后来想了个笨办法,利用空闲的TIM6时基来做溢出计时器,和捕 ...

设计一个变量统计更新中断的次数,第一次捕获记录这个次数,第二次捕获再记录下这个更新中断的次数,相减就是两次捕获之间的更新中断次数了,这样不需要别的定时器参与

一周热门 更多>