①定时器定时中断和内外时钟选择功能 (基本功能)
计数器计时频率:CK_CNT=CK_PSC/(PSC+1)
计数器溢出频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)
计数器溢出时间:=1/计数器溢出频率
1、 定时器定时中断
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断;
16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时;
第一步、RCC开启时钟;
第二步、选择时基单元的时钟源 (这里选择内部中断时钟源)
//选择内部时钟
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_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
第四步、配置输出中断控制,运行更新中断输出到NVIC
//手动将数字标志位清除一下
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
第五步、配置NVIC ,在NVIC中打开定时器中断的通道并分配一个优先级
NVIC_InitTypeDef NVIC_InitInstructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitInstructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitInstructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitInstructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitInstructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitInstructure);
第六步、运行控制
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
最后一步使能计数器,并写一个定时器的中断函数
其他函数:
//用来单独写预分频值
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);
//改变计数器的计数模式
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);