目录

一、概述

1.计数模式

2.主要功能

3.通用定时器的结构

4.时钟源

5.时基单元

二、基本定时功能

1.配置时基单元

2.配置NVIC

3.编写中断函数


一、概述

定时器实际上就是一个计数器,stm32中集成了多个定时/计数器TIM,根据型号和功能的不同,STM32系列芯片最多包含了8个定时/计数器,TIM1、TIM8为高级定时器,TIM2、TIM3、TIM4、TIM5为通用定时器,TIM6、TIM7为基本定时器。

1.计数模式

  • 向上模式计数器从0计数到自动加载值(ARR),并产生向上溢出事件。
  • 向下模式:计数器从自动加载只(ARR)向下计数到0,并产生向下溢出事件。
  • 中央对齐模式:计数器从0向上计数到自动加载值(ARR)后,产生向上溢出事件。再从自动加载值(ARR)向下计数到0,产生向下溢出事件。

2.主要功能

  • 基本定时功能
  • 输出比较
  • 输入捕获
  • 编码器接口模式
  • 等等

3.通用定时器的结构

        stm32通用定时器主要包含1个外部触发引脚(TMx_ETR)4个输入输出通道(TMx_CH1~4)1个触发控制器1个时基控制单元(由PSC预分频器,自动重装寄存器,CNT计数器等组成)如图所示:

4.时钟源

定时/计数器时钟可由以下时钟提供;

  • 内部时钟(CK_INT)
  • 外部时钟模式1(TIMx_CH1~4)
  • 外部时钟模式2(TIMx_ETR)
  • 内部触发输入(IR0~3)(来自其他定时器)用来实现定时器之间的级联/同步触发

5.时基单元

PSC预分频器,是将CLK时基的脉冲转换为以PSC数值为一个周期的脉冲波形。如下图所示:

        当PSC(预分频器)数值为n时,PSC每接收到一个上升沿/下降沿/双边沿会自动加1,直到PSC的数值为n,PSC才会输出一个上升沿/下降沿/双边沿

CNT计数器是接收PSC发送的脉冲波形,每接收到上升沿/下降沿/双边沿时,会自动加1,然后CNT会时不时的与ARR自动重装载值相比较。当CNT的数值=ARR的数值时,会溢出,然后硬件会自动设置中断标志位,随后进入中断函数。(中断函数中必须使用软件复位清空中断标志位

二、基本定时功能

定时器实际上就是一个计数器。通过计指定的数来达到定时的功能。

定时时间的计算:脉冲72MHz,首先会进行预分频(PSC),随后频率变为CLK / ( PSC + 1 ),那么CNT加1个数字的时间就是( PSC + 1 )/ CLK 。那么计ARR个数字就是ARR * ( PSC + 1 ) / CLK; 

下面是定时器TIM最基础的功能流程:

  1. 配置时基单元
  2. 配置NVIC
  3. 编写中断函数

1.配置时基单元

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);   //开启TIM2总线时钟
	
	TIM_InternalClockConfig(TIM2);   //设置为内部时钟
	
	TIM_TimeBaseInitTypeDef Tim2_InitStruction;
	Tim2_InitStruction.TIM_ClockDivision = TIM_CKD_DIV1;   //选择分频,这里选择的是1分频
	Tim2_InitStruction.TIM_CounterMode = TIM_CounterMode_Up;   //计数器模式,这里选择的是向上计数
	Tim2_InitStruction.TIM_Period = 10000 - 1;   //自动重装计数器
	Tim2_InitStruction.TIM_Prescaler = 7200 - 1;   //预分频计数器
	Tim2_InitStruction.TIM_RepetitionCounter = 0;   //高级计数器才有,这里直接给0
	
	TIM_TimeBaseInit(TIM2, &Tim2_InitStruction);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);   //只有配置了这一步,定时器才可以把中断请求发出去
	
	TIM_Cmd(TIM2, ENABLE);   //开启/关闭 定时器TIM2的函数
	
}

详解:

  • RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

        开启APB1总线中TIM2外设的时钟

  • TIM_InternalClockConfig(TIM2);

        设置TIM2为内部时钟供应

  • TIM_TimeBaseInit(TIM2, &Tim2_InitStruction);

        此函数是STM32中定时器的基础初始化函数,包含两个参数。       

               1. 参数TIMx是指哪一个定时器

               2. 参数&Tim2_InitStruction是一个TIM_TimeBaseInitTypeDef类型的结构体指针。

        TIM_TimeBaseInitTypeDef如下:

        计数模式如下:

  • TIM_ClearFlag(TIM2, TIM_FLAG_Update);

        手动清除定时器的 “更新中断 / 事件标志位”

  • TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

        开启中断更新的使能,只有配置了这个,定时器才可以把中断发送出去

  • TIM_Cmd(TIM2, ENABLE);

        开启/关闭 定时器TIM2的函数

2.配置NVIC

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //优先级分组
	
	NVIC_InitTypeDef NVIC_InitStruction;
	NVIC_InitStruction.NVIC_IRQChannel = TIM2_IRQn;   //设置通道
	NVIC_InitStruction.NVIC_IRQChannelCmd = ENABLE;   //通道使能
	NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority = 2;   //抢占优先级
	NVIC_InitStruction.NVIC_IRQChannelSubPriority = 1;   //响应优先级
	
	NVIC_Init(&NVIC_InitStruction);   //初始化函数

3.编写中断函数

void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)   //检查中断标志位是否被置为SET
	{
		num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);   //清除中断标志位
	}
}
  • TIM_GetITStatus(TIM2, TIM_IT_Update)

        检查TIM2的更新中断是否发生,如果发生,那么置SET。没有,置RESET

  • TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

        清除中断标志位

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐