单片机交流
直播中

那些年儿ing

11年用户 1260经验值
擅长:84784
私信 关注
[问答]

怎样去计算stm32定时器的时钟频率呢

怎样去计算STM32定时器的时钟频率呢?
STM32F4的内部时钟树是由哪些部分组成的?

回帖(1)

李子胡

2021-10-22 14:48:15
  stm32定时器基本简介
  f4:
  
  stm32定时器时钟频率
  [tr]系统时钟频率/MHZ[/tr]SYSCLK(系统时钟)168
  APB1总线时钟(4分频)42
  APB2总线时钟(2分频)84
  
  因为系统初始化 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类似)
  定时器溢出时间的计算:
  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。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分