一、定时器介绍
STM32f1系列的定时器主要有er3种
(1)2个基本定时器(TIM6、TIM7)
(2)4个通用定时器(TIM2、TIM3、TIM4、TIM5)
(3)2个高级定时器(TIM1、TIM8)
记忆口诀:头尾为高级,掐头去尾从小到大为四通二基。
基本定时器TIM6和TIM7定时器的主要功能包括:
● 16位自动重装载累加计数器
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
分频
● 触发DAC的同步电路
● 在更新事件(计数器溢出)时产生中断/DMA请求。
通用定时器简介
STM32的通用计时器TIMx(TIM2~TIM5)具有以下功能:
(1)16位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
(2) 16位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间的任意值。
(3)四个独立通道(TIMx_CH1—4),这些通道可以用来作为:
1.输入比较
2.输出比较
3.PWM生成(边缘或中间对齐模式)
4.单脉冲模式输出、
(4)可以使用外部信号(TIMx ETR)控制定时器,且可实现多个定时器互联(可以用一个计时器控制另外一个计时器)的同步电路。
(5)发生如下事件时产生中断DMA请求:
1.更新计时器向上溢出/向下溢出,计时器初始化(通过软件或者内部/外部触发)
2.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
3.输入捕获
4.输出比较
(6)支持针对定位的增量(正交)编码器和霍尔传感器电路
(7) 触发输入作为外部时钟或者按周期的电流管理
高级定时器TIM1和TIM8定时器的功能包括:
● 16位向上、向下、向上/下自动装载计数器
● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意
数值
● 多达4个独立通道: ─ 输入捕获─ 输出比较
─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出
● 死区时间可编程的互补输出
● 使用外部信号控制定时器和定时器互联的同步电路
● 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器
● 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
● 如下事件发生时产生中断/DMA:
─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─ 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─ 输入捕获─ 输出比较─ 刹车信号输入
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管理
STM32F103C8T6只有tim1、tim2、tim3、tim4四个的定时器,一个高级,四个通用
二、通用定时器配置步骤、
(1)使能定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE);
(2)初始化定时器参数
void TIM_TimeBaseInit(TIM_TyprDef*TIM,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);
typedef struct
{
u16 TIM_Prescaler; //设置预分频系数
u16 TIM_CounterMode; //控制计数模式
u32 TIM_Period; //预装载值
u16 TIM_ClockDivision; //控制时钟分频比
u8 TIM_RepetitionCounter;//在高级定时器才用
TIM_TimeBaseInitTypeDef;
}
定时时间计算
Tout=((per)*(psc+1))/Tclk;
Tclk:时钟频率
per:period
psc:prescaler
(3)设置定时器中断类型,并使能
void TIM_ITConfig(TIM_TypeDef*TIMx,u16 TIM_IT FunctionalState NewState)
(4)设置定时器中断优先级,使能定时器中断通道
(5)开启定时器
void TIM_Cmd(TIM_TypeDef*TIMx, u16 TIM_IT,FunctionalState NewState)
三、软件设计
例如:配置TIM4
void TIM4_Init(u16 per,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM4,ENABLE); //使能定时器
}
(6)编写定时器中断服务函数
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{
******************
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}