打印

关于tim2计数更新的问题

[复制链接]
2801|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ze0075|  楼主 | 2010-11-9 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ze0075 于 2010-11-10 16:53 编辑

我想用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初始化了
沙发
香水城| | 2010-11-9 16:02 | 只看该作者
直接改写相应寄存器,然后通过软件产生一个更新事件,让新参数其作用。

使用特权

评论回复
板凳
火箭球迷| | 2010-11-9 22:16 | 只看该作者
感觉楼主的两个思路都可行

使用特权

评论回复
地板
ze0075|  楼主 | 2010-11-10 15:57 | 只看该作者
按使用手册上说的
TIM2->CR1 |= 0x0004;//TIM2_CR1的URS置位
TIM2->EGR |= 0x0001;//TIM2_EGR的UG置位,硬件复位
可以不中断而产生更新,试试行不行

使用特权

评论回复
5
ze0075|  楼主 | 2010-11-10 16:53 | 只看该作者
最后正常使用的设置:
                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;就可以更新计数了

使用特权

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

本版积分规则

2

主题

15

帖子

0

粉丝