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。
欢迎大佬在评论区补充,供大家学习。