通用定时器概述
STM32F4 的定时器有14个,其中TIM2-TIM5,TIM9~TIM14属于通用定时器,TIM1 和TIM8 则属于高级控制定时器,TIM6和TIM7是基本定时器。
16 位(TIM3 和 TIM4)或 32 位(TIM2 和 TIM5) 递增、递减和递增/递减自动重载计数器。
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改) ,分频系数介于 1 到 65536 之间。
多达 4 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿和中心对齐模式)
— 单脉冲模式输出
使用外部信号控制定时器且可实现多个定时器互连的同步电路。
发生如下事件时生成中断/DMA 请求(6个独立的IRQ/DMA请求生成器):
— 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
— 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
— 输入捕获
— 输出比较
支持定位用增量(正交)编码器和霍尔传感器电路
外部时钟触发输入或逐周期电流管理
16 位自动重载递增计数器(属于中等容量器件)
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数
介于 1 和 65536 之间
多达 2 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿对齐模式)
— 单脉冲模式输出
使用外部信号控制定时器且可实现多个定时器互连的同步电路
发生如下事件时生成中断:
— 更新:计数器上溢、计数器初始化(通过软件或内部触发)
— 触发事件(计数器启动、停止、初始化或者由内部触发计数)
— 输入捕获
— 输出比较
1)内部时钟(CK_INT)
2)外部时钟模式 1:外部输入脚(TIx)
3)外部时钟模式 2:外部触发输入(ETR) ,仅适用于 TIM2、TIM3、TIM4
4)内部触发输入(ITRx) :使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟) 。
这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1(一般都不会是 1) ,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx的时钟就等于 APB1 的时钟。这里还要注意的就是高级定时器以及 TIM9~TIM11 的时钟不是来自 APB1,而是来自 APB2 的。
定时器配置中断的步骤
- 使能定时器时钟。
RCC_APB1PeriphClockCmd();
- 初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
- 启定时器中断,配置NVIC。
NVIC_Init();
- 设置 TIM3_DIER 允许更新中断
TIM_ITConfig();
- 使能定时器。
TIM_Cmd();
- 编写中断服务函数。
TIMx_IRQHandler();
以TIM3为例,延时1秒点亮led灯
#include "tim.h"
/*
定时器说明:
TIM3 -- APB1
定时器TIM3:84MHZ
16位定时器:值范围:0~65535
*/
void Tim3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1、使能定时器时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//8400分频 84000 000/8400 = 10000HZ 1S数10000个数
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400-1;
TIM_TimeBaseInitStruct.TIM_Period = 10000-1; //计10000个数 在10000HZ下,用时1s
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子
//2、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
//NVIC通道,在stm32f4xx.h可查看通道 (可变)
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
//3、启定时器中断,配置NVIC。
NVIC_Init(&NVIC_InitStruct);
//4、设置 TIM3_DIER 允许更新中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//5、使能定时器。
TIM_Cmd(TIM3, ENABLE);
}
//编写中断服务函数。这个函数不需要程序员在主函数调用,满足条件CPU自行调用的函数
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
{
/*处理的程序段*/
GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}
通用定时器概述
STM32F4 的定时器有14个,其中TIM2-TIM5,TIM9~TIM14属于通用定时器,TIM1 和TIM8 则属于高级控制定时器,TIM6和TIM7是基本定时器。
16 位(TIM3 和 TIM4)或 32 位(TIM2 和 TIM5) 递增、递减和递增/递减自动重载计数器。
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改) ,分频系数介于 1 到 65536 之间。
多达 4 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿和中心对齐模式)
— 单脉冲模式输出
使用外部信号控制定时器且可实现多个定时器互连的同步电路。
发生如下事件时生成中断/DMA 请求(6个独立的IRQ/DMA请求生成器):
— 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
— 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
— 输入捕获
— 输出比较
支持定位用增量(正交)编码器和霍尔传感器电路
外部时钟触发输入或逐周期电流管理
16 位自动重载递增计数器(属于中等容量器件)
16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数
介于 1 和 65536 之间
多达 2 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿对齐模式)
— 单脉冲模式输出
使用外部信号控制定时器且可实现多个定时器互连的同步电路
发生如下事件时生成中断:
— 更新:计数器上溢、计数器初始化(通过软件或内部触发)
— 触发事件(计数器启动、停止、初始化或者由内部触发计数)
— 输入捕获
— 输出比较
1)内部时钟(CK_INT)
2)外部时钟模式 1:外部输入脚(TIx)
3)外部时钟模式 2:外部触发输入(ETR) ,仅适用于 TIM2、TIM3、TIM4
4)内部触发输入(ITRx) :使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟) 。
这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。这里的 CK_INT时钟是从 APB1 倍频的来的,除非 APB1 的时钟分频数设置为 1(一般都不会是 1) ,否则通用定时器 TIMx 的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx的时钟就等于 APB1 的时钟。这里还要注意的就是高级定时器以及 TIM9~TIM11 的时钟不是来自 APB1,而是来自 APB2 的。
定时器配置中断的步骤
- 使能定时器时钟。
RCC_APB1PeriphClockCmd();
- 初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
- 启定时器中断,配置NVIC。
NVIC_Init();
- 设置 TIM3_DIER 允许更新中断
TIM_ITConfig();
- 使能定时器。
TIM_Cmd();
- 编写中断服务函数。
TIMx_IRQHandler();
以TIM3为例,延时1秒点亮led灯
#include "tim.h"
/*
定时器说明:
TIM3 -- APB1
定时器TIM3:84MHZ
16位定时器:值范围:0~65535
*/
void Tim3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1、使能定时器时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//8400分频 84000 000/8400 = 10000HZ 1S数10000个数
TIM_TimeBaseInitStruct.TIM_Prescaler = 8400-1;
TIM_TimeBaseInitStruct.TIM_Period = 10000-1; //计10000个数 在10000HZ下,用时1s
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子
//2、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
//NVIC通道,在stm32f4xx.h可查看通道 (可变)
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
//3、启定时器中断,配置NVIC。
NVIC_Init(&NVIC_InitStruct);
//4、设置 TIM3_DIER 允许更新中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//5、使能定时器。
TIM_Cmd(TIM3, ENABLE);
}
//编写中断服务函数。这个函数不需要程序员在主函数调用,满足条件CPU自行调用的函数
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
{
/*处理的程序段*/
GPIO_ToggleBits(GPIOE, GPIO_Pin_14);
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}
举报