一.定时器介绍
- 对输入的时钟进行计数,计数值达到设定值时触发中断
- 有16位计数器/预分频器/自动重装寄存器的时基单元,在72MHZ计数时钟下可实现59.65s定时
- 功能:定时中断,内外时钟源选择,输入捕获,输出比较,编码接口,主从触发模式
- 分类:高级定时器,通用定时器,基本定时器
二.基本定时器结构
- 预分频器:对RCC传来的72MHz的时钟进行分频,设置为1即为2分频,最多设置为65535
- CNT计数器:对预分频后的时钟计数,每个上升沿加1
- 自动重装载寄存器:设置重装置,当计数值达到重装值是产生中断
三.通用定时器结构(TIM2、TIM3、TIM4和TIM5)
- 功能:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)。
- 计数器模式:向上计数/向下计数/中央对齐
- 时钟选择
- 内部时钟(CK_INT)
- 外部时钟模式1:外部输入脚(TIx)
- 外部时钟模式2:外部触发输入(ETR)
- 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时 器Timer1而作为另一个定时器Timer2的预分频器
四.定时中断基本结构
五.预分频器时序
六.计数器时序
- 计数器有缓冲寄存器
六.RCC时钟树
七.实现代码
- TIM库函数
- 步骤
- RCC开启时钟
- 选择时基单元时钟源-定时中断选择内部模式
- 配置时基单元
- 配置输出中断控制
- 配置NVIC
void TIM_DeInit(TIM_TypeDef* TIMx);//恢复定时器默认缺省配置
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//配置时基单元
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//结构体赋默认值
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计时器
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出控制
//时基单元时钟选择部分
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRX其他定时器
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIX捕获通道时钟
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//外部输出模式1输入时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//外部输出模式2输入时钟
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//配置ETR引脚参数
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//写入预分频值
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);//改变计数器计数模式
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器预(缓冲)功能
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//给计数器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);//给自动重装寄存器写入一个值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);//获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频值
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);//获取标志位
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);//清除标志位
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);//中断函数中使用
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
- 模板