通用定时器(TIM2、TIM3、TIM4和TIM5)
1,主要功能:
- 16位向上、向下、向上/向下自动装载计数器
- 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值
- 4个独立通道:输入捕获通道、输出比较通道、PWM生成(边缘或中间对齐模式) 、单脉冲模式输出(不同于基本定时器)
2,基本框图:
不同于基本定时器(时基单元 + 触发控制器)通用定时器的计数模式,时钟选择,功能和模式有不同的变化
3,计数模式
- 向上计数模式(TIM_CounterMode_Up):计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始 计数并且产生一个计数器溢出事件
- 向下计数模式(TIM_CounterMode_Down):在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件
- 中央对齐模式(TIM_CounterMode_CenterAligned):在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)−1,产生一个计数器 溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。
4,时钟选择
1、 内部时钟(CK_INT)
实例 模拟时钟
1,设置内部时钟,开启中断
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_InternalClockConfig(TIM2);//内部时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
//定时器频率 = 72M/(重装载值+1)/(预分频值+1)
TIM_TimeBaseInitStruct.TIM_Period= 1000 - 1;
TIM_TimeBaseInitStruct.TIM_Prescaler= 720 - 1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
TIM_Cmd(TIM2,ENABLE);
2,在中断函数里面编写内部时钟
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
uckey++;
if(uckey >59)
{
uckey = 0;
min++;
if(min > 59)
{
min = 0;
hour++;
if(hour > 24)
{
hour = 0;
uckey = 0;
min = 0;
}
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
2、外部时钟模式1:外部输入脚(TIx)
3、外部时钟模式2:外部触发输入(ETR)
实例:利用红外传感器实现led指定次数的闪烁
1,设置外部时钟,开启中断
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(lightsensor,ENABLE);
GPIO_InitTypeDef GPIO_lightsensor;
GPIO_lightsensor.GPIO_Mode=GPIO_Mode_IPU;
GPIO_lightsensor.GPIO_Pin=lightsensor_Pin;
GPIO_lightsensor.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(lightsensor_Port,&GPIO_lightsensor);
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);//外部时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period= 10 - 1;
TIM_TimeBaseInitStruct.TIM_Prescaler= 1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
设置外部时钟模式2的函数TIM_ETRClockMode2Config(通用定时器,外部时钟的分频系数,上升沿触发\下降沿触发,采样频率)
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);//外部时钟
2,主函数
if(key_GetNum() == 1)
{
TIM_TurnOff();
for(;uckey>0;uckey--)
{
OLED_ShowNum(1,1,uckey,3);
led_r_on();
Delay_ms(1000);
led_r_off();
Delay_ms(1000);
}
}
OLED_ShowNum(1,1,uckey,3);
OLED_ShowNum(2,1,Tim2_GetCountNum(),3);
4、内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器