工作中遇到的问题

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_DIV
1;     
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);


你可能感兴趣的:(嵌入式)