STM32中TIM定时器定时功能详解(适用基本,通用,高级定时器)

发布时间:2024年01月17日

前言

定时器有高级定时器、通用定时器、基本定时器三种类型。具体功能如下。上面是每种定时器所具有的功能。

1.简要理解

我们可以看到每种定时器都有一个定时功能,(可能是名字的由来吧)。当然,每个定时器都可以来使用定时功能,但是我们往往在基本定时器和通用定时器上面使用。其实,当我们学过外部中断后,理解定时器的定时功能可能比较容易,就是将我们的外部信号变成了一个时间断,一样要配置中断,一样要配置优先级。下面的讲述,更加偏向应用,诚然,我们需要了解定时器的结构原理,注意我这里说的是了解,如果你要去完完全全搞懂需要花一定的时间和精力,而我们需要的是更快的上手,在实践中去慢慢一点点消化。

2.基本结构

我这里不讨论那个寄存器那个位啥的巴拉巴拉。大家也不爱听,我直接介绍需要配置的参数。

  • 定时器时钟 TIMxCLK,是内部时钟 CK_INT 经过 APB1 预分频器后的频率,可以通过 RCC_APB1PeriphClockCmd 函数使能或关闭。
  • 预分频器 PSC,是一个 16 位的寄存器,可以对定时器时钟进行 1~65536 之间的任意分频,分频后的时钟称为计数器时钟 CK_CNT,计算公式为 CK_CNT = TIMxCLK / (PSC + 1)。
  • 计数器 CNT,是一个 16 位的向上计数器,从 0 开始递增,每个计数周期等于 1 / CK_CNT 秒,当计数器的值等于自动重装载寄存器的值时,产生更新事件并清零重新计数。
  • 自动重装载寄存器 ARR,是一个 16 位的寄存器,用来存放计数器的最大值,也就是定时器的周期,计算公式为 T = 1 / CK_CNT * (ARR + 1) 秒,其中 T 是定时时间。
  • 中断使能和中断服务函数,可以通过 TIM_ITConfig 函数使能或关闭定时器的更新中断,当更新事件发生时,会触发中断服务函数,可以在中断服务函数中执行定时任务。

流程就是

1开启定时器时钟,即内部时钟

ADVANCE_TIM_APBxClock_FUN

2配置的参数

TIM_TimeBaseStructure.TIM_Period 初始值,计数完的时候自动变成这个数TIM_TimeBaseStructure.TIM_Prescaler? ?让传进来的信号除以自己想要的数
TIM_TimeBaseStructure.TIM_ClockDivision时钟分频因子 ,没用到不用管
TIM_TimeBaseStructure.TIM_CounterMode?计数器计数模式,设置为向上计数或者向下
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;??重复计数器的值,没用到不用管 ?

3初始化定时器
? TIM_TimeBaseIni
4清除计数器中断标志位
?TIM_ClearFlag清除计数器中断标志位
?TIM_ITConfig开启计数器中断

?5配置中断优先级

代码省略??

6写中断服务函数

代码省略??

? 注意事项

1.基本定时器中代码和高级定时器还有通用定时器中需要配置的参数有区别,我们有两种方法第一种我们先给定时器赋一个初始值然后改我们需要的就行,第二种,我们把全部参数都配置一遍,不需要的配置为0就行 ,还有以下几种注意

  • 计数器位数:高级定时器和通用定时器都是16位的,而基本定时器是32位的。这意味着基本定时器可以实现更长的定时周期,但也需要更多的内存空间。
  • 计数模式:高级定时器和通用定时器都支持向上、向下、向上/向下(中心对齐)三种计数模式,而基本定时器只支持向上计数模式。计数模式影响了计数器的溢出条件和更新事件的产生。

?3.代码实例

tatic void BASIC_TIM_NVIC_Config(void)//参数按自己的要求
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    // 抢占优先级的位
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);		
		// 设置中断来源
    NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;	
		// 设置主优先级为 0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	 
	  // 设置抢占优先级为3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;	
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*
 * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
 * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
 * 另外三个成员是通用定时器和高级定时器才有.


static void BASIC_TIM_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
		
		// 开启定时器时钟,即内部时钟CK_INT=72M
    BASIC_TIM_APBxClock_FUN(, ENABLE);
	
		// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
    TIM_TimeBaseStructure.TIM_Period = 1000-1;	

	  // 时钟预分频数为
    TIM_TimeBaseStructure.TIM_Prescaler= 71;//0-71就是32
	
		// 时钟分频因子 ,基本定时器没有,不用管
    //TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
		
		// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
    //TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 
		
		// 重复计数器的值,基本定时器没有,不用管
		//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
	
	  // 初始化定时器
    TIM_TimeBaseInit(, &TIM_TimeBaseStructure);
		
		// 清除计数器中断标志位
    TIM_ClearFlag(, );
	  
		// 开启计数器中断
    TIM_ITConfig(,,ENABLE);
		
		// 使能计数器
    TIM_Cmd(, ENABLE);	
}
下面是中断服务函数写在stm32f10x_it.c中
void  BASIC_TIM_IRQHandler (void)//这个函数名在stm32f10x.h中去找
{
	if (  ) 
	{	
		
		TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);  		 
	}	//都叫更新中断就是重新开始呗	TIM_IT_Update 	
}

有些配置自己去按需求填写。

4总结

  • STM32中有三种定时器:高级定时器、通用定时器和基本定时器,它们的定时功能参数主要有计数器位数、计数模式、通道数量和功能、互补输出和死区功能等方面的区别。
  • 定时器的定时功能需要设置定时器时钟、预分频器、计数器、自动重载寄存器等参数,以及中断使能和中断服务函数,以实现指定的定时周期和定时任务。
  • 定时器的时钟源可以选择内部时钟或外部时钟,也可以通过其他定时器或捕获通道等方式提供时钟信号,以适应不同的应用场景。
  • 定时器的计数方式可以选择向上、向下或向上/向下(中心对齐)三种模式,以影响计数器的溢出条件和更新事件的产生。
文章来源:https://blog.csdn.net/qq_63091423/article/details/135637666
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。