打印
[STM32F1]

寄存器溢出问题

[复制链接]
450|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yufe|  楼主 | 2020-1-1 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以前是测试固定频率,没考虑溢出问题,运行良好,

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

使用特权

评论回复
沙发
jlyuan| | 2020-1-1 11:49 | 只看该作者

楼主详细说说怎么回事啊,这么说太笼统了

使用特权

评论回复
板凳
wyjie| | 2020-1-1 11:54 | 只看该作者
输入捕获从模式复位,更新中断进行计数累加,记录溢出。

使用特权

评论回复
地板
heweibig| | 2020-1-1 12:01 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
yufe|  楼主 | 2020-1-1 12:04 | 只看该作者
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;  //清零
        }
}

使用特权

评论回复
6
yufe|  楼主 | 2020-1-1 12:09 | 只看该作者
试验结果,不管低频高频,所有的I2CValue值都大于0xFFFF了,是不是每取一次TIM_GetCapture2也会触发更新中断?

使用特权

评论回复
7
ousj| | 2020-1-1 12:12 | 只看该作者
嗯,可能是这样的

使用特权

评论回复
8
xxmmi| | 2020-1-1 12:15 | 只看该作者
每取一次TIM_GetCapture2是不会触发更新中断的。

使用特权

评论回复
9
guoyt| | 2020-1-1 12:19 | 只看该作者
不过,你现在是主从触发,开启计数器时产生一次更新操作,你可能就多计算这一次更新数据所对应的0xffff,应该减去这一次

使用特权

评论回复
10
yufe|  楼主 | 2020-1-1 12:25 | 只看该作者
减去也不对,不过我用了个笨办法实现了。就是再开个TIM6的普通时基,和TIM2捕获时钟同频。

使用特权

评论回复
11
yufe|  楼主 | 2020-1-1 12:28 | 只看该作者
然后在TIM6更新中断里自增, 在TIM2捕获中断里TIM6->CNT = 0;

使用特权

评论回复
12
langgq| | 2020-1-1 12:31 | 只看该作者
可以用?

使用特权

评论回复
13
yufe|  楼主 | 2020-1-1 12:34 | 只看该作者
试验了下,可以用

使用特权

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

本版积分规则

983

主题

10170

帖子

1

粉丝