STM32 - TIM中断笔记

TIM定时中断

定义

TIM可以对输入的时钟进行计数,并在数值达到设定值时触发中断。
在STM32中定时器的基准时钟一般都是主频72MHz,在72MHz计数时钟下可以实现最大59.65s的定时。( 72MHz / 65536-1 / 65536-1 ) 。

STM32定时器支持级联模式,可实现更长时间的定时。

定时器类型

根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型

类型编号总线功能
基本定时器TIM6、TIM7APB1定时中断,主从模式触发DAC
通用定时器TIM2、TIM3、TIM4、TIM5APB1基本定时器功能,时钟源选择,输入捕获,输出比较, 编码器接口,主从触发模式等
高级定时器TIM1,TIM8APB2

通用定时器功能,重复计数器,互补输出,刹车输入、死区生成等

配置步骤
  1. 配置RCC外设时钟
  2. 配置时基单元的时钟
  3. 配置初始化时基单元
  4. 使能更新中断
  5. 配置NVIC 选择一个合适的优先级
  6. 启动定时器

void Timer_Init(void)
{
    /*开启时钟*/
    //开启TIM2的时钟	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);		
	//配置时钟源 。选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	TIM_InternalClockConfig(TIM2);
	//时基单元初始化
    //定义结构体变量
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				
    //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	
    //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	
    //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
    //预分频器,即PSC的值				
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;	
    //重复计数器,高级定时器才会用到			
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元				
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);	
			
	/*中断输出配置*/
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);		
    //清除定时器更新标志位
    //TIM_TimeBaseInit函数末尾,手动产生了更新事件
	//若不清除此标志位,则开启中断后,会立刻进入一次中断
	//如果不介意此问题,则不清除此标志位也可
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);	//开启TIM2的更新中断
	
	/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		
    //配置NVIC为分组2,即抢占优先级范围:0~3,响应优先级范围:0~3。
    //此分组配置在整个工程中仅需调用一次
	//若有多个中断,可以把此代码放在main函数内,while循环之前
	//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
    //定义结构体变量
	NVIC_InitTypeDef NVIC_InitStructure;	
    //选择配置NVIC的TIM2线				 
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	
    //指定NVIC线路使能		 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	
    //指定NVIC线路的抢占优先级为2		 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    //指定NVIC线路的响应优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	
    //将结构体变量交给NVIC_Init,配置NVIC外设	 
	NVIC_Init(&NVIC_InitStructure);				
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);	 //使能TIM2,定时器开始运行
}

时基单元

定时器时基单元包含:
  1.     计数器寄存器(TIMx_CNT)
  2.     预分频器寄存器 (TIMx_PSC)——该寄存器用设置对时钟进行分频,然后提供给计数器,      作为计数器的时钟。                     (16位寄存器,有效值1~65535)
  3.     自动装载寄存器(TIMx_ARR)        (16位寄存器,有效值1~65535)

注:计数器的arr和时钟分频psc都要加1,因为这两个值是配置在寄存器中的,从0开始计数,故要加1输入值 = 设置值 - 1

定时器的时钟来源 :
  1.       内部时钟(CK_INT)
  2.       外部时钟模式 1:外部输入脚(TIx)
  3.       外部时钟模式 2:外部触发输入(ETR)
  4.       内部触发输入(ITRx)

计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)

计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)  = CK_PSC / (PSC + 1) / (ARR + 1)

当满足以下条件时,会产生溢出事件,去触发中断或者DMA请求:

  • 向上计数:计数器从0开始计数至arr(重装载)值,产生溢出事件
  • 向下计数:计数器从arr值开始计数至0,产生溢出事件
  • 中央对齐模式 ( 向上 / 向下计数 )

推荐博文

stm32专题二十五:基本定时器原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值