搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2018-6-13 08:15:55 | 显示全部楼层 |阅读模式
一个老项目,以前是测试固定频率,没考虑溢出问题,运行良好,

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2018-6-13 09:48:38 | 显示全部楼层
网上搜索出来有一种说法,主从复位模式,每次复位也会产生更新中断,但是STM32中文手册上好像没找到。

出0入0汤圆

 楼主| 发表于 2018-6-13 14:09:30 | 显示全部楼层
貌似就是这个问题,每次捕获都会产生更新中断,后来想了个笨办法,利用空闲的TIM6时基来做溢出计时器,和捕获时钟同频率,

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

试验了下,可以用。

如果前辈们有更好更简便的方法,请不吝赐教。

出0入4汤圆

发表于 2018-12-7 10:18:13 | 显示全部楼层
金色大元宝 发表于 2018-6-13 14:09
貌似就是这个问题,每次捕获都会产生更新中断,后来想了个笨办法,利用空闲的TIM6时基来做溢出计时器,和捕 ...

设计一个变量统计更新中断的次数,第一次捕获记录这个次数,第二次捕获再记录下这个更新中断的次数,相减就是两次捕获之间的更新中断次数了,这样不需要别的定时器参与
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-24 20:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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