浅析STM32定时器TIM_Period和TIM_Prescaler
By:T7 Date:20180322 At:YSU-B307-2
1. //配置定时器基础结构体 2. TIM_DeInit(TIM2);
3. TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入
活动的自动重装载寄存器周期的值 计数到1000为1ms
4. TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率
除数的预分频值 1M的计数频率 1US计数
5. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频 6. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上
计数模式
7. TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInit
Struct中指定的参数初始化TIMx的时间基数单位 8.
9. TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立
即产生中断
10. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断 11.
分析这段代码:
TIM_TimeBaseStructure.TIM_Period= 1000 – 1; TIM_TimeBaseStructure.TIM_Prescaler = 72– 1;
1. 定时时间T = 1000 * 72 / 72000 000 = 1ms
2. TIM_Prescaler = 72 – 1; t = 72 / 72000 000 = 1us,即TIMx->CNT每1us加一次
3. TIM_Period = 1000;当TIMx->CNT计数值达到1000us(也就是一开始计算的定时时间
1ms),进入中断服务函数,msHcCount将自动加一
1. void TIM6_IRQHandler(void) //TIM3中断 2. {
3. if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断
发生与否 4. {
5. TIM_ClearITPendingBit(TIM6, TIM_IT_Update ); //清除TIMx更新
中断标志
6. msHcCount++; 7. } }
4.当定时器停止工作时,总的定时时间为t = msHcCount * 1000 + TIMx->CNT单位是
us。