打印
[STM32F1]

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

[复制链接]
1962|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金色大元宝|  楼主 | 2018-6-13 08:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

static void TIM2_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_DeInit(TIM2);
   
    /* Time base configuration */
   
    TIM_TimeBaseStructure.TIM_Period = 0xffff;         
    TIM_TimeBaseStructure.TIM_Prescaler = 71;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
   
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
   
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
    //选择输入比较滤波器 0x0 - 0xF
    TIM_ICInitStructure.TIM_ICFilter = 0x8;  //0x8
   
    TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
   
    /* Select the TIM3 Input Trigger: TI2FP2 */
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
   
    /* Select the slave Mode: Reset Mode */
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
   
    /* Enable the Master/Slave Mode */
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   
   
    /* Enable the CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_Update|TIM_IT_CC2, ENABLE);
   
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);   
}


void TIM2_ISR(void)
{
    Uint32 IC2Value;

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

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

                IC2Value += (cnt_TIM2_IT_Update * 0xFFFF);
                cnt_TIM2_IT_Update = 0;  //清零
        }
}
试验结果,不管低频高频,所有的I2CValue值都大于0xFFFF了,是不是每取一次TIM_GetCapture2也会触发更新中断?

沙发
zhuotuzi| | 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;

试验了下,可以用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

81

帖子

3

粉丝