2015/11/20
1. STM32 的通用定时器
1. 1 确定定时器2~7的时钟源
从上图时钟树中,可以知道,定时器2~7的时钟来自于APB1,APB1最大为36MHZ;假设主频72MHZ, APB1使用主频二分频得到,那么APB1 = 36MHZ;APB1的分频因子为2;而定时器的时钟来源于APB1,但是,注意红色标注的位置有这句话: “如果APB1预分频系数=1,则频率不变,否则频率x2”; 此时APB1的分频系数不为 1,所以给到定时器2~7的时钟,等于APB1 * 2 = 36MHZ * 2 = 72MHZ;这只针对定时器2~7, 对于其他挂在APB1上的外设,时钟源还是36MHZ;
1.2 确定所用定时器的时钟
TIM_TimeBaseStructure.TIM_Period = period - 1;
TIM_TimeBaseStructure.TIM_Prescaler = prescaler - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(pTimerHandler->TIMER, &TIM_TimeBaseStructure);
以上用于配置定时器的基本信息,包括时钟分频,计数器,计数方式和 TIM_ClockDivision
假设现在定时器2~7的时钟源为72MHZ
TIM_Prescaler : 时钟分频因子;定时器的时钟 = 72MHZ / (TIM_Prescaler+ 1)
TIM_Period: 定时器的计数值;
TIM_CounterMode:定时其的计数方式,TIM_CounterMode_Up 表示向上计数
重点说明TIM_ClockDivision:这并不是对定时器源的时钟分频用的,根据数据手册上的解释,如下:
这里并没有明确说明该变量作何用处,所以设置该位对于定时器的时钟没有任何影响,一般设置为TIM_CKD_DIV1;也就是0;
所以定时器每计数一次的时间 = (TIM_Prescaler / 72000 000)s;
每次计数TIM_Period次产生一次中断;也就是定时器的中断时间 = TIM_Period * (TIM_Prescaler / 72000 000);