欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

stm32学习笔记 通用定时器

程序员文章站 2022-03-04 22:43:29
...

STM32F103C8T6处理器:
高级定时器: TIM1
三个通用定时器: TIM2,TIM3, TIM4
没有基本定时器
stm32f4
有 14 个定时器(具体看手册)
重点内容:
1.基本定时和计数功能
2.输出比较( PWM控制舵机和步进电机)
3.输入捕获(测量波形周期,高电平时间)

时钟树:
stm32学习笔记 通用定时器
因为系统初始化 SystemInit 函数里面已经初始化 APB1 的时钟为 4 分频,所
以 APB1 的时钟为 42M,而从 STM32F4 的内部时钟树图(得知:当 APB1 的时钟
分频数为 1 的时候,TIM2~7 以及 TIM12~14 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频
数不为 1,那么 TIM2~7 以及 TIM12~14 的时钟频率将为 APB1 时钟的两倍。因此,TIM3 的时
钟为 84M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。
计算公式如下:
Tout= ((arr+1)*(psc+1))/Tclk
其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)。

例子

void TIM2_BaseConfigurAction(void) {
		 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	  NVIC_InitTypeDef NVIC_InitStruct1;
	  NVIC_InitStruct1.NVIC_IRQChannel = TIM2_IRQn;  
	  NVIC_InitStruct1.NVIC_IRQChannelPreemptionPriority = 0;   //抢占优先级
      NVIC_InitStruct1.NVIC_IRQChannelSubPriority = 3;					//响应优先级
	  NVIC_InitStruct1.NVIC_IRQChannelCmd = ENABLE;
	  NVIC_Init(&NVIC_InitStruct1);   //初始化
		
		 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
		 TIM_TimeBaseStructure.TIM_Period = 5000-1;   //4999+1 为 500ms
		 TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;  //8399+1 = 定时器时钟84M,分频系数8400,所以84M/8400=10Khz 
      // TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;     设置时钟分割
         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置向上计数
         TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
	
		 TIM_ClearFlag(TIM2,TIM_FLAG_Update);   //清除溢出标志位
		 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //允许定时器2更新中断
		 TIM_Cmd(TIM2,ENABLE); //使能定时器 2
}


void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
	LED1=!LED1;
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}