本文最后更新于296天前,其中的信息可能已经有所发展或是发生改变。
第一步,RCC开启时钟,定时器的基准时钟和整个外设的工作时钟就都会同时打开了
第二步,选择时基单元的时钟源,对于定时中断,选择内部时钟源
第三步,配置时基单元,包括这里的预分频器(PSC)、自动重装器(ARR)、计数模式(CNT)等等
第四步,配置输出中断控制,允许更新中断输出到NVIC
第五步,配置NVIC,在NVIC中打开定时器中断的通道,并分配一个优先级
第六步,运行控制,整个模块配置完成后,我们还需要使能一下计数器,当定时器使能后,计数器就会开始计数了,当计数器更新时,触发中断, 最后写一个定时器的中断函数,这个中断函数每隔一段时间就能自动执行一次了
TIM的相关库函数
void TIM_DeInit(TIM_TypeDef* TIMx);
@brief: 恢复缺省配置
@param TIMx:选择某个定时器
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
@brief:时基单元初始化。它就是用来配置图里(定时中断基本结构)的时基单元的
@param TIMx: 选择某个定时器 can be 1 to 17 to select the TIM peripheral.
@param TIM_TimeBaseInitStruct: 结构体,里面包含了配置时基单元的一些参数
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
@brief: 可以把结构体变量赋一个默认值
@param TIM_TimeBaseInitStruct: 配置值的结构体
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
@brief: 使能计数器,对应图里的运行控制
@param TIMx: 选择定时器
@param NewState: 新的状态,也就是使能还是失能。使能,计数器就可以运行,失能,计数器就不运行
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
@brief: 使能中断输出信号,对应图中中断输出控制
@param TIMx: 选择定时器
@param TIM_IT: 选择要配置哪个中断输出
@param NewState: 新的状态,也就是使能还是失能。使能,计数器就可以运行,失能,计数器就不运行
以下六个函数对应时基单元的时钟选择部分 可以选择RCC内部时钟、ETR外部时钟、ITRx其他定时器、TIx捕获通道这些
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);
@brief: 选择内部时钟
@param TIMx: 选择定时器
@retval None
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);
@brief:
@param
@retval None
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);
@brief:
@param
@retval None
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
@brief:选择ETR通过外部时钟模式1输入的时钟
@param TIMx: 选择定时器
@param TIM_ExtTRGPrescaler: 外部触发预分频器,可以对ETR的外部时钟再提前做一个分频
@param ExtTRGFilter: 极性
@param ExtTRGFilter: 滤波器
@retval None
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
@brief:通过ETR引脚的外部时钟模式2配置
@param
@retval None
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);
@brief:
@param
@retval None
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);
@brief: 单独写预分频值,原因:如果为了改某个参数还要再调用一次初始化函数,所以这里有一些单独的函数,可以方便地更改这些关键参数,
@param Prescaler: 预分频值
@param TIM_PSCReloadMode: 写入模式。预分频器有一个缓冲器,写入的值是在更新事件发生后才有效的,所以这里有个写入的模式,可以选择是听从安排,在更新事件生效,或者是,在写入后,手动产生一个更新事件,让这个值立刻生效
@retval None
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
@brief:用来改变计数器的计数模式
@param TIMx: 选择定时器
@param TIM_CounterMode: 选择新的计数器模式
@retval None
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
@brief:自动重装器预装功能配置,计数器的预装功能
@param TIMx:
@param NewState:新的状态,也就是使能还是失能。
@retval None
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
@brief:给计数器写入一个值
@param TIMx: 选择定时器
@param Counter:手动给一个计数值
@retval None
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);
@brief:给自动重装器写入一个值
@param TIMx:选择定时器
@param Autoreload:手动给一个自动重装值
@retval None
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);
@brief:获取当前计数器的值,查看当前计数器计到哪里
@param TIMx:选择定时器
@retval: 当前的计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);
@brief:获取当前的预分频器的值
@param TIMx:选择定时器
@retval :当前的预分频值
下面四个函数是用来获取标志位和清除标志位
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);
点击数:0