stm32定时器时钟频率的计算问题

stm32定时器基本简介

f4:
stm32定时器时钟频率的计算问题_第1张图片

stm32定时器时钟频率

系统时钟 频率/MHZ
SYSCLK(系统时钟) 168
APB1总线时钟(4分频) 42
APB2总线时钟(2分频) 84

stm32定时器时钟频率的计算问题_第2张图片

因为系统初始化 SystemInit 函数里面已经初始化 APB1 的时钟为 4 分频,所以 APB1 的时钟为 42M,而从 STM32F4 的内部时钟树图(上图)得知:
1)当 APB1 的时钟分频数为 1 的时候,TIM2~7 以及 TIM12~14 的时钟为APB1 的时钟,
(2)而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 以及 TIM12~14 的时钟频率将为 APB1 时钟的两倍

这里还要注意的就是高级定时器以及 TIM9~TIM11 的时钟不是来
自 APB1,而是来自 APB2 的。(其定时器的时钟频率和APB1类似)

定时器的时钟 频率
TIM1、TIM8–11 2*APB2
TIM2—7、TIM12—14 2*APB1

定时器溢出时间的计算:
Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk:TIM 的输入时钟频率(单位为 hz)。
Tout:TIM溢出时间(单位为 s)。

例如:

定时器3为例
  void TIM3_Int_Init(u16 arr,u16 psc)
  {
      TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //①使能 TIM3时钟
      TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
      TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);// ②初始化定时器 TIM3
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //③允许定时器 3 更新中断
	NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器 3 中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级 1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //响应优先级 3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);// ④初始化 NVIC
	TIM_Cmd(TIM3,ENABLE); //⑤使能定时器 3
  }

主函数中调用该函数TIM3_Int_Init(5000-1,8400-1);
其溢出时间的计算如下:
定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数 5000 次为 500ms。

你可能感兴趣的:(stm32,嵌入式,stm32,单片机,arm)