关于tim2计数更新的问题

goldluchao   2010-11-9 15:55 楼主


我想用tim2做串口通讯的timeout,我的设置如下
TIM_TimeBaseStructure.TIM_Period = 100;   //10ms
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时间分割值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //定时器模式 向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2
TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清标志,避免中断重复产生
TIM_Cmd(TIM2, ENABLE);    //使能

    问题是当我计时到一半,不触发中断而重新开始计数的时候(就是人为重载),应该怎么做?
想到两个思路:
1、直接改写相应寄存器
2 、禁掉中断使能,设置时加入
TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);
      让计数器在下一个更新事件停止,然后再重开TIM

实在不行就只好每次对tim初始化了

回复评论 (4)

                                 直接改写相应寄存器,然后通过软件产生一个更新事件,让新参数其作用。
点赞  2010-11-9 16:02
                                 感觉楼主的两个思路都可行
点赞  2010-11-9 22:16
按使用手册上说的
TIM2->CR1 |= 0x0004;//TIM2_CR1的URS置位
TIM2->EGR |= 0x0001;//TIM2_EGR的UG置位,硬件复位
可以不中断而产生更新,试试行不行
点赞  2010-11-10 15:57
最后正常使用的设置:
                TIM_DeInit(TIM2);       
        TIM_TimeBaseStructure.TIM_Period = 50;   //5ms         TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 时钟频率=72M/(7199+1 )
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时间分割值
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //定时器模式 向上计数
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;       
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //初始化定时器2       
        TIM2->CR1 |= 0x0004;   //更新请求源置1,只有溢出更新才中断
        TIM2->EGR |= 0x0001;   //事件更新
        TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清标志,避免中断重复产生

每次用TIM2->EGR |= 0x0001;就可以更新计数了
点赞  2010-11-10 16:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复