Tim定时器学习打卡

通用定时器(TIM2、TIM3、TIM4和TIM5)

1,主要功能:

  1. 16位向上、向下、向上/向下自动装载计数器
  2. 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值
  3. 4个独立通道:输入捕获通道、输出比较通道、PWM生成(边缘或中间对齐模式) 、单脉冲模式输出(不同于基本定时器)

2,基本框图:

 不同于基本定时器(时基单元 + 触发控制器)通用定时器的计数模式,时钟选择,功能和模式有不同的变化

3,计数模式

  1. 向上计数模式(TIM_CounterMode_Up):计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始 计数并且产生一个计数器溢出事件
  2. 向下计数模式(TIM_CounterMode_Down):在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件
  3. 中央对齐模式(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的预分频器

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值