TIM(定时中断&外部时钟)(STM32学习笔记)

TIM简介

·TIM (Timer)定时器

·定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断

·16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s   的定时

·不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接   口、主从触发模式等多种功能

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

本文主要介绍如何配置和使用内部时钟模式和外部时钟模式2

(本文是关于TIM2通用定时器的学习笔记)


初始化配置模板

内部时钟模式(RCC):

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
//选择时基单元的时钟
TIM_InternalClockConfig(TIM2);//选择内部时钟来驱动 可不写 定时器上电默认使用内部时钟
	
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式 这里选择向上计数
TIM_TimeBaseInitStructure.TIM_Period=10000-1;//给ARR自动重装器赋值(0~65535)
TIM_TimeBaseInitStructure.TIM_Prescaler=7200-1;//给PSC预分频器赋值(0~65535)
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器 高级计数器才有 置0
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
//使能更新中断
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//上电自动进中断 手动将中断更新标志位清除
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//允许中断
	
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStructure);
	
//启动定时器
TIM_Cmd(TIM2,ENABLE);

TIM2挂载在APB1总线上,所以打开APB1的时钟。 

关于时基单元的配置:

TIM_ClockDivision可选择1/2/4分频 这里选择1分频 即不分频

TIM_Period和TIM_Prescaler设置定时时长

比如我们这里选择不分频 那么频率为72MHz PSC=7200-1 ARR=10000-1 结果为1Hz 即1秒触发一次中断 

TIM_RepetitionCounter是配置高级定时器的 这里直接置0

外部时钟模式(ETR):

(这里用对射式红外传感器模拟外部时钟 当遮挡红外光线再移开后会产生电平变化)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
	
//选择时基单元的时钟
TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);	
	
//配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式
TIM_TimeBaseInitStructure.TIM_Period=10-1;//给ARR自动重装器赋值(0~65535)
TIM_TimeBaseInitStructure.TIM_Prescaler=1-1;//给PSC预分频器赋值(0~65535)
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器 高级计数器才有 置0
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
//使能更新中断
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//上电自动进中断 手动将中断更新标志位清除
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组
	
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStructure);
	
//启动定时器
TIM_Cmd(TIM2,ENABLE);

这里的ETR是和GPIO的PA0引脚复用了 所以也要配置APB2的时钟同时初始化GPIO

这里与内部时钟模式不同的地方就是选择时基单元的时钟 即TIM_ETRClockMode2Config函数

参数包括外部触发预分频器,极性选择和滤波器(这里选择不分频、高点平或上升沿触发、滤波值选最大值)配置其他参数可转到函数定义自行选择

其他函数和内部定时器一样 PSC和ARR可自行配置


常用函数

TIM_DeInit,恢复缺省配置

TIM_TimeBaseInit,时基单元初始化

TIM_TimeBasestructInit,把结构体变量赋一个默认值

TIM_Cmd,使能计数器

TIM_ITConfig,使能中断输出信号

TIM_InternalClockConfig,选择内部时钟

TIM_ITRxExternalClockConfig,选择ITRx其他定时器的时钟

TIM_TIxExternalClockConfig,选择TIx捕获通道的时钟

TIM _ETRClockMode1Config,选择ETR通过外部时钟模式1输入的时钟

TIM _ETRClockMode2Config,选择ETR通过外部时钟模式2输入的时钟

TIM_ETRConfig,单独用来配置ETR引脚的预分频器、极性、滤波器这些参数

TIM_PrescalerConfig,单独写预分频值

TIM_CounterModeConfig,用来改变计数器的计数模式

TIM _ARRPreloadConfig,自动重装器预装功能配置

TIM_SetCounter, 给计数器写入一个值

TIM_SetAutoreload,给自动重装器写入一个值

TIM_GetCounter,获取当前计数器的值

TIM_GetPrescaler,获取当前的预分频器的值


关于外部时钟模式1和2,我还没搞懂区别,如果你想在ETR外部引脚提供时钟,或者想对ETR时钟进行计数,把这个定时器当做计数器来用的话,那就可以配置外部时钟模式2。

欢迎大佬在评论区补充,供大家学习。

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想成为嵌入式大牛的sakabu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值