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;
}