TIM定时器
定时器可以对输入的时钟进行计数,并在计数值达到指定值的时触发中断
16位计数器,预分频器。自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时。(2的16次方为65536,72M除以65536的平方的中断频率,并取倒数,约为59.65)
不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
定时器的类型
主从触发模
可以使内部硬件在不受程序的控制下实现自动运行(减轻CPU的负担)
基本定时器
时钟单元
内部时钟的72MHz
预分频器:决定输出频率
输出频率=输入频率÷(预分频器+1)
1:产生中断(更新中断) 通往NVIC
2:产生事件
自动重装计数器:存储计数目标
通用定时器
预分频时序图
CK:时钟周期
CK_CNT:计数器计数频率
CK_PSC:预分频器的时钟
PSC:预分频数
CK_CNT_OV:计数器溢出频率
ARR:自动重载寄存器
计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1)
定时器步骤
第一步:开启时钟
第二步:选择时基单元的时基源
第三步;配置时钟源(预分频器,自动重装器,计数模式等等)
第四步:配置中断控制,允许更新中断输出到NVIC;
第五步;配置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);
选择ITRx其他定时器时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource(选择接入那个其他的定时器));
选择TIx捕获通道的时钟
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter(输入的极性和滤波器));
选择ETR通过外部时钟模式1输入的时钟
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
选择ETR通过外部时钟模式2输入的时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
单独配置ETR引脚的预分频器,极性,滤波器
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
单独写预分频值
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);