5.1TIM定时器

一、基本信息

1.

  • 对输入的时钟进行计数,在计数值达到设定值时触发中断
  • 具备基本的定时中断功能,包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
  • 分为了高级定时器、通用定时器、基本定时器三种类型

2.分类

类型

编号

总线

功能

高级定时器

TIM1

TIM8

APB2

通用定时器全部功能

另有重复计数器、死区生成、互补输出、刹车输入

通用定时器

TIM2

TIM3

TIM4

TIM5

APB1

基本定时器全部功能

另有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式

基本定时器

TIM6

TIM7

APB1

定时中断、主模式触发DAC

   STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4

3.定时器的使用步骤

  1. TIMx时钟使能
  2. 初始化定时器参数,设置自动重装值,分频系数,计数方式等
  3. 设置TIMx_DIER允许中断
  4. TIMx中断优先级设置
  5. 允许TIMx工作,即使能TIMx
  6. 编写中断服务函数

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,详情参考引脚定义:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值