我想用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初始化了
直接改写相应寄存器,然后通过软件产生一个更新事件,让新参数其作用。
按使用手册上说的
TIM2->CR1 |= 0x0004;//TIM2_CR1的URS置位
TIM2->EGR |= 0x0001;//TIM2_EGR的UG置位,硬件复位
可以不中断而产生更新,试试行不行
最后正常使用的设置:
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;就可以更新计数了