ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F1] STM32输入捕获低频时寄存器溢出问题,频繁进入更新中断。

[复制链接]
227|3
 楼主 | 2018-6-13 08:20 | 显示全部楼层 |阅读模式

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

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

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

  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也会触发更新中断?

| 2018-6-13 14:57 | 显示全部楼层
嗯,可能是这样的
| 2018-6-13 16:37 | 显示全部楼层
每取一次TIM_GetCapture2是不会触发更新中断的。
不过,你现在是主从触发,开启计数器时产生一次更新操作,你可能就多计算这一次更新数据所对应的0xffff,应该减去这一次。
你不妨验证下。
 楼主 | 2018-6-14 08:16 | 显示全部楼层
香水城 发表于 2018-6-13 16:37
每取一次TIM_GetCapture2是不会触发更新中断的。
不过,你现在是主从触发,开启计数器时产生一次更新操作 ...

减去也不对,不过我用了个笨办法实现了。就是再开个TIM6的普通时基,和TIM2捕获时钟同频。

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

试验了下,可以用
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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