一、基本信息
1.
- 对输入的时钟进行计数,在计数值达到设定值时触发中断
- 具备基本的定时中断功能,包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
- 分为了高级定时器、通用定时器、基本定时器三种类型
2.分类
类型 | 编号 | 总线 | 功能 |
高级定时器 | TIM1 TIM8 | APB2 | 通用定时器全部功能 另有重复计数器、死区生成、互补输出、刹车输入 |
通用定时器 | TIM2 TIM3 TIM4 TIM5 | APB1 | 基本定时器全部功能 另有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式 |
基本定时器 | TIM6 TIM7 | APB1 | 定时中断、主模式触发DAC |
STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
3.定时器的使用步骤
- TIMx时钟使能
- 初始化定时器参数,设置自动重装值,分频系数,计数方式等
- 设置TIMx_DIER允许中断
- TIMx中断优先级设置
- 允许TIMx工作,即使能TIMx
- 编写中断服务函数
4.定时中断
计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
= CK_PSC / (PSC + 1) / (ARR + 1)
所以,定时时间=(计数值+1) * (定时器预分频+1)/ 内部时钟
=(TIM_Perscaler+1) * (TIM_Period+1) / 72M
二、代码
初始化
void Timer_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2时钟,TIM2是总线1
TIM_InternalClockConfig(TIM2); //使用内部时钟
TIM_TimeBaseInitTypeDef TIM_TIM_TimeBaseInitStr;
TIM_TIM_TimeBaseInitStr.TIM_ClockDivision=TIM_CKD_DIV1; //滤波采样不分频
TIM_TIM_TimeBaseInitStr.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TIM_TimeBaseInitStr.TIM_Period=10000-1; //计数值
TIM_TIM_TimeBaseInitStr.TIM_Prescaler=7200-1; //预分频
TIM_TIM_TimeBaseInitStr.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TIM_TimeBaseInitStr);//配置时基单元
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //开启更新中断到NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVI
NVIC_InitTypeDef NVIC_InitStr;
NVIC_InitStr.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStr.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStr);
TIM_Cmd(TIM2,ENABLE);
}
中断函数
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
{
Num++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
使用外部时钟的初始化
void Timer_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2时钟,TIM2是总线1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启B口时钟
GPIO_InitTypeDef GPIO_InitStr;
GPIO_InitStr.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_InitStr.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStr);
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0xcc);
//使用外部时钟
TIM_TimeBaseInitTypeDef TIM_TIM_TimeBaseInitStr;
TIM_TIM_TimeBaseInitStr.TIM_ClockDivision=TIM_CKD_DIV1; //滤波采样不分频
TIM_TIM_TimeBaseInitStr.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TIM_TimeBaseInitStr.TIM_Period=5-1;
TIM_TIM_TimeBaseInitStr.TIM_Prescaler=1-1;
TIM_TIM_TimeBaseInitStr.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TIM_TimeBaseInitStr);//配置时基单元
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //开启更新中断到NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVI
NVIC_InitTypeDef NVIC_InitStr;
NVIC_InitStr.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStr.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStr);
TIM_Cmd(TIM2,ENABLE);
}
注意,使用外部信号时有专用P口,如TIM2_CH1~TIM2_CH4的复用口分别为A0~A3,详情参考引脚定义: