stm32f4xx:
APB2 ----> TIM1,TIM8,TIM9,TIM10,TIM11
APB1 ----> TIM2,TIM3,TIM4,TIM5,TIM6,TIM7,TIM12,TIM13,TIM14
一、定时器介绍
1、基本定时器
1.1、TIM6和TIM7****的主要特性
● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
● 用于触发 DAC 的同步电路
● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢

2、通用定时器
stm32的通用定时器有通用定时器( TIM2 到 TIM5)和通用定时器( TIM9 到 TIM14 )
2.1、TIM2到TIM5****主要特性
● 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/TIM11和TIM13/TIM14****主要特性
● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数介于 1 和 65536 之间
● 独立通道,可用于:
--- 输入捕获
--- 输出比较
--- PWM 生成(边沿对齐模式)
--- 单脉冲模式输出
● 发生如下事件时生成中断:
--- 更新:计数器上溢、计数器初始化(通过软件)
--- 输入捕获
--- 输出比较

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

二、寄存器介绍
1、TIM6和TIM7****寄存器(基本定时器)
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、TIM9和TIM12****寄存器(通用定时器)
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;
}