【stm32】定时器

stm32f4xx

APB2 ----> TIM1,TIM8,TIM9,TIM10,TIM11

APB1 ----> TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14

一、定时器介绍

1、基本定时器

1.1、TIM6TIM7****的主要特性

● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
● 用于触发 DAC 的同步电路
● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢

2、通用定时器

stm32的通用定时器有通用定时器( TIM2 到 TIM5)和通用定时器( TIM9 到 TIM14

2.1、TIM2TIM5****主要特性

● 16 位(TIM3 和 TIM4)或 32 位( TIM2 和 TIM5 ) 递增、递减和递增 / 递减自动重载计数器。
● 16 位可编程预分频器,用于对计数器时钟频率进行分频 (即运行时修改),分频系数介于 1 到 65536 之间。
● 多达 4 个独立通道,可用于:
--- 输入捕获
--- 输出比较
--- PWM 生成(边沿和中心对齐模式)
--- 单脉冲模式输出
● 使用外部信号控制定时器且可实现多个定时器互连的同步电路。
● 发生如下事件时生成中断/DMA 请求:
--- 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/ 外部触发)
--- 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
--- 输入捕获
--- 输出比较
● 支持定位用增量(正交)编码器和霍尔传感器电路
● 外部时钟触发输入或逐周期电流管理

2.2、TIM9/TIM12****主要特性

● 16 位自动重载递增计数器(属于中等容量器件)
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
● 多达 2 个独立通道,可用于:
--- 输入捕获
--- 输出比较
--- PWM 生成(边沿对齐模式)
--- 单脉冲模式输出
● 使用外部信号控制定时器且可实现多个定时器互连的同步电路
● 发生如下事件时生成中断:
--- 更新:计数器上溢、计数器初始化(通过软件或内部触发)
--- 触发事件(计数器启动、停止、初始化或者由内部触发计数)
--- 输入捕获
--- 输出比较

2.3 TIM10/TIM11TIM13/TIM14****主要特性

● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
● 独立通道,可用于:
--- 输入捕获
--- 输出比较
--- PWM 生成(边沿对齐模式)
--- 单脉冲模式输出
● 发生如下事件时生成中断:
--- 更新:计数器上溢、计数器初始化(通过软件)
--- 输入捕获
--- 输出比较

3、高级定时器

3.1、TIM1TIM8****主要特性

● 16 位递增、递减、递增/ 递减自动重载计数器。
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系介于 1 到 65536 之间。
● 多达 4 个独立通道,可用于:
--- 输入捕获
--- 输出比较
--- PWM 生成(边沿和中心对齐模式)
--- 单脉冲模式输出
● 带可编程死区的互补输出。
● 使用外部信号控制定时器且可实现多个定时器互连的同步电路。
● 重复计数器,用于仅在给定数目的计数器周期后更新定时器寄存器。
● 用于将定时器的输出信号置于复位状态或已知状态的断路输入。
● 发生如下事件时生成中断/DMA 请求:
--- 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/ 外部触发)
--- 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
--- 输入捕获
--- 输出比较
--- 断路输入
● 支持定位用增量(正交)编码器和霍尔传感器电路。
● 外部时钟触发输入或逐周期电流管理。

二、寄存器介绍

1、TIM6TIM7****寄存器(基本定时器)

1.1、控制寄存器****1 (TIMx_CR1)

偏移地址:0x00
复位值: 0x0000


位 15:8 保留,必须保持复位值。位 6:4 保留,必须保持复位值。
位 7 ARPE :自动重载预装载使能 (Auto-reload preload enable)
0: TIMx_ARR 寄存器不进行缓冲。
1: TIMx_ARR 寄存器进行缓冲。
位 3 OPM :单脉冲模式 (One-pulse mode)
0:计数器在发生更新事件时不会停止计数
1:计数器在发生下一更新事件时停止计数(将 CEN 位清零)。
位 2 URS :更新请求源 (Update request source)
此位由软件置 1 和清零,用以选择 UEV 事件源。
0:使能时,所有以下事件都会生成更新中断或 DMA 请求。此类事件包括:
--- 计数器上溢/下溢
--- 将 UG 位置 1
--- 通过从模式控制器生成的更新事件
1:使能时,只有计数器上溢 / 下溢会生成更新中断或 DMA 请求。
位 1 UDIS :更新禁止 (Update disable)
此位由软件置 1 和清零,用以使能 / 禁止 UEV 事件生成。
0:使能 UEV 。更新 (UEV) 事件可通过以下事件之一生成:
--- 计数器上溢/下溢
--- 将 UG 位置 1
--- 通过从模式控制器生成的更新事件
然后更新影子寄存器的值。
1:禁止 UEV 。不会生成更新事件,各影子寄存器的值(ARR 和 PSC)保持不变。但如果
将UG 位置 1,或者从从模式控制器接收到硬件复位,则会重新初始化计数器和预分频器。
位 0 CEN :计数器使能 (Counter enable)
0:禁止计数器
1:使能计数器
注意:只有事先通过软件将 CEN 位置 1,才可以使用门控模式。而触发模式可通过硬件自动将 CEN 位置 1
在单脉冲模式下,当发生更新事件时会自动将 CEN 位清零。

1.2、控制寄存器****2 (TIMx_CR2)

偏移地址: 0x04
复位值: 0x0000

位 15:7 保留,必须保持复位值。位 3:0 保留,必须保持复位值。
位 6:4 MMS :主模式选择 (Master mode selection)
这些位用于选择主模式下将要发送到从定时器以实现同步的信息 (TRGO) 。这些位的组合如下:
000: 复位 ------ TIMx_EGR 寄存器中的 UG 位用作触发输出 (TRGO) 。如果复位由触发输入生成(从模式控制器配置为复位模式),则 TRGO 上的信号相比实际复位会有延迟。
001: 使能 ------计数器使能信号 (CNT_EN) 用作触发输出 (TRGO) 。该触发输出可用于同时启动多个定时器,或者控制在一段时间内使能从定时器。计数器使能信号由 CEN 控制位与门控模式下的触发输入的逻辑或运算组合而成。当计数器使能信号由触发输入控制时,TRGO 上会存在延迟,选择主 / 从模式时除外(请参见TIMx_SMCR 寄存器中对 MSM 位的说明)。
010: 更新 ------选择更新事件作为触发输出 (TRGO) 。例如,主定时器可用作从定时器的预分频器。

1.3、DMA/中断使能寄存器(TIMx_DIER)

偏移地址: 0x0C
复位值: 0x0000

位 15:9 保留,必须保持复位值。
位 7:1 保留,必须保持复位值。
位 8 UDE :更新 DMA 请求使能 (Update DMA request enable)
0:禁止更新 DMA 请求。
1:使能更新 DMA 请求。
位 0 UIE :更新中断使能 (Update interrupt enable)
0:禁止更新中断。
1:使能更新中断。

1.4、状态寄存器**(TIMx_SR)**

偏移地址: 0x10
复位值: 0x0000

位 15:1 保留,必须保持复位值。
位 0 UIF :更新中断标志 (Update interrupt flag)
该位在发生更新事件时通过硬件置 1 。但需要通过软件清零。
0:未发生更新。
1:更新中断挂起。该位在以下情况下更新寄存器时由硬件置 1 :
--- 上溢或下溢并且当 TIMx_CR1 寄存器中 UDIS = 0 时。
--- 当由于 TIMx_CR1 寄存器中 URS = 0 且 UDIS = 0 而通过软件使用 TIMx_EGR 寄存
器中的 UG 位重新初始化 CNT 时。

1.5、事件生成寄存器**(TIMx_EGR)**

偏移地址: 0x14
复位值: 0x0000

位 15:1 保留,必须保持复位值。
位 0 UG :更新生成 (Update generation)
该位可通过软件置 1 ,并由硬件自动清零。
0:不执行任何操作。
1:重新初始化定时器计数器并生成寄存器更新事件。请注意,预分频器计数器也将清零(但
预分频比不受影响)。

1.6、计数器**(TIMx_CNT)**

偏移地址: 0x24
复位值: 0x0000

位 15:0 CNT[15:0] :计数器值 (Counter value)

1.7、预分频器**(TIMx_PSC)**

偏移地址: 0x28
复位值: 0x0000

位 15:0 PSC[15:0] :预分频器值 (Prescaler value)
计数器时钟频率 CK_CNT 等于 f CK_PSC / (PSC[15:0] + 1) 。
PSC 包含在每次发生更新事件时要装载到实际预分频器寄存器的值。

1.8、自动重载寄存器**(TIMx_ARR)**

偏移地址: 0x2C
复位值: 0x0000


位 15:0 ARR[15:0] :自动重载值 (Auto-reload value)
ARR 为要装载到实际自动重载寄存器的值。
当自动重载值为空时,计数器不工作。

2、TIM9TIM12****寄存器(通用定时器)

2.1、控制寄存器1 (TIMx_CR1)
偏移地址: 0x00
复位值: 0x0000

2.2、控制寄存器****2 (TIMx_CR2)
偏移地址: 0x04
复位值: 0x0000

2.3、从模式控制寄存器**(TIMx_SMCR)**
偏移地址: 0x08
复位值: 0x0000

2.4、中断使能寄存器**(TIMx_DIER)**
偏移地址: 0x0C
复位值: 0x0000

2.5、状态寄存器**(TIMx_SR)**
偏移地址: 0x10
复位值: 0x0000

2.6、事件生成寄存器**(TIMx_EGR)**
偏移地址: 0x14
复位值: 0x0000

2.7、捕获**/比较模式寄存器1 (TIMx_CCMR1)**
偏移地址: 0x18
复位值: 0x0000

2.8、捕获**/比较使能寄存器(TIMx_CCER)**
偏移地址: 0x20
复位值: 0x0000

2.9、计数器**(TIMx_CNT)**
偏移地址: 0x24
复位值: 0x0000 0000

2.10、预分频器**(TIMx_PSC)**
偏移地址: 0x28
复位值: 0x0000

2.11、自动重载寄存器**(TIMx_ARR)**
偏移地址: 0x2C
复位值: 0x0000 0000

2.12、捕获**/比较寄存器1 (TIMx_CCR1)**
偏移地址: 0x34
复位值: 0x0000

2.13、捕获**/比较寄存器2 (TIMx_CCR2)**
偏移地址: 0x38
复位值: 0x0000

3、TIM10/11/13/14****寄存器(通用定时器)

3.1、控制寄存器****1 (TIMx_CR1)
偏移地址: 0x00
复位值: 0x0000

3.2、状态寄存器**(TIMx_SR)**
偏移地址: 0x10
复位值: 0x0000

3.3、 事件生成寄存器 (TIMx_EGR)
偏移地址: 0x14
复位值: 0x0000

3.4、 捕获 / 比较模式寄存器 1 (TIMx_CCMR1)
偏移地址: 0x18
复位值: 0x0000

3.5、 捕获 / 比较使能寄存器 (TIMx_CCER)
偏移地址: 0x20
复位值: 0x0000

3.6、 计数器 (TIMx_CNT)
偏移地址: 0x24
复位值: 0x0000

3.7 预分频器 (TIMx_PSC)
偏移地址: 0x28
复位值: 0x0000

3.8、 自动重载寄存器 (TIMx_ARR)
偏移地址: 0x2C
复位值: 0x0000

3.10、 捕获 / 比较寄存器 1 (TIMx_CCR1)
偏移地址: 0x34
复位值: 0x0000

3.11、 选项寄存器 1 (TIM11_OR)
偏移地址: 0x50
复位值: 0x0000

更多参考:STM32F4xx中文参考手册

三、定时器案列

1、基本定时

定时时间计算:1/T=CK_PSC/[(PSC+1)*(ARR+1)]

CK_PSC:时钟频率

PSC:分频系数

ARR:自动重装载值

#include "TIM.h"
#include "LED.h"

TIM_HandleTypeDef TIM1_InitStructure;//定义结构体

void Timer1_Init(void)
{	
	
	TIM1_InitStructure.Instance = TIM1;
	TIM1_InitStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	TIM1_InitStructure.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//分频因子
	TIM1_InitStructure.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式:向上计数
	TIM1_InitStructure.Init.Period = 5000 - 1;//自动重装载值ARR
	TIM1_InitStructure.Init.Prescaler = 16800 - 1;//分频系数PSC
	TIM1_InitStructure.Init.RepetitionCounter = 0;//重复计数器
	
	HAL_TIM_Base_Init(&TIM1_InitStructure);//初始化结构体
	
	HAL_TIM_Base_Start_IT(&TIM1_InitStructure);
}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM1)
	{
		__HAL_RCC_TIM1_CLK_ENABLE();//开启TIM1的时钟
		HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn,1,1);//设置中断优先级
		HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);//开启中断
	}
}
 
void TIM1_UP_TIM10_IRQHandler(void)
{
	 HAL_TIM_IRQHandler(&TIM1_InitStructure);//中断处理函数
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//中断回调函数
{
	if(htim->Instance == TIM1)
	{
		LED1_Toggle;//LED1翻转
	}
}

2、脉冲宽度调制(PWM)输出

#include "PWM.h"

TIM_HandleTypeDef PWM_InitStructure;
TIM_OC_InitTypeDef PWM_InitStruct;
void PWM_Init(void)
{
	PWM_InitStructure.Instance = TIM1;
	PWM_InitStructure.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	PWM_InitStructure.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;//分频因子
	PWM_InitStructure.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式:向上计数
	PWM_InitStructure.Init.Period = 500 - 1;//自动重装载值ARR
	PWM_InitStructure.Init.Prescaler = 84 - 1;//分频系数PSC
	PWM_InitStructure.Init.RepetitionCounter = 0;//重复计数器
	HAL_TIM_PWM_Init(&PWM_InitStructure);
	
	PWM_InitStruct.OCMode = TIM_OCMODE_PWM1;
	PWM_InitStruct.Pulse = (500 - 1)/2;
	PWM_InitStruct.OCPolarity = TIM_OCPOLARITY_HIGH;
	
	HAL_TIM_PWM_ConfigChannel(&PWM_InitStructure,&PWM_InitStruct,TIM_CHANNEL_1);
	
	HAL_TIM_PWM_Start(&PWM_InitStructure,TIM_CHANNEL_1);
}

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM1)
	{
		__HAL_RCC_TIM1_CLK_ENABLE();//开启定时器1的时钟
	__HAL_RCC_GPIOE_CLK_ENABLE();//开启GPIOE的时钟  TIM1_CH1---->PE9
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;				//复用推挽输出
	GPIO_InitStructure.Pin = GPIO_PIN_9;					//引脚9
	GPIO_InitStructure.Pull = GPIO_PULLUP;					//上拉
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;	//超高速
	GPIO_InitStructure.Alternate = GPIO_AF1_TIM1;			//复用功能
	HAL_GPIO_Init(GPIOE,&GPIO_InitStructure);
	}
}

void TIM1_SetCompare(uint32_t compare)
{
	TIM1->CCR1 = compare;
}
相关推荐
Zevalin爱灰灰1 小时前
编程技巧(基于STM32)第一章 定时器实现非阻塞式程序——按键控制LED灯闪烁模式
stm32·单片机·嵌入式硬件
红花与香菇2____2 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
Jerry.yl3 小时前
关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明
嵌入式硬件·物联网·bk3633
苏慕TRYACE4 小时前
RT-Thread+STM32L475VET6实现红外遥控实验
stm32·单片机·嵌入式硬件·rt-thread
小幽余生不加糖6 小时前
deepseek帮我设计物理量采集单片机口保护电路方案
单片机·嵌入式硬件
Ronin-Lotus7 小时前
蓝桥杯篇---IAP15F2K61S2串口
单片机·嵌入式硬件·职场和发展·蓝桥杯·c·iap15f2k61s2
xiaohai@Linux7 小时前
ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
c语言·嵌入式硬件·tcp/ip·wifi·esp32
yyqzjw8 小时前
【STM32】外部时钟|红外反射光电开关
stm32·单片机·嵌入式硬件
charlie1145141918 小时前
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
c语言·stm32·单片机·嵌入式硬件·学习·教程
苏慕TRYACE8 小时前
RT-Thread+STM32L475VET6——ADC采集电压
stm32·单片机·嵌入式硬件·rt-thread