【stm32】定时器

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值