定时器可以对输入的时钟进行计数,并在计数值到达设定值时触发中断。
16位计数器,预分频器,自动重装寄存器的时基单元,在72MHZ计数时钟下可以实现最大59.65s的定时。不仅具备基本的定时中断功能,而且还包含内外时钟源选择,输入,捕获,输出比较,编码器接口,主从触发模式等多种功能。
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); //配置时基单元 TIMX选择定时器,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);//其他定时器
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
uint16_t TIM_ICPolarity, uint16_t ICFilter);//捕获通道
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);
void TIM_PrescalerConfig(TIM_TypeDef* TIMX ,uint16_t Prescler, uint16_t TIM_PSCReloadmode);
void TIM_CounterModeConfig(TIM_TypeDef* TIMx,uint16_t TIM_CounterMode);
第一步:RCC开启时钟,定时器的基准时钟和整个外设的工作时钟都会同时打开
第二步:选择时基单元的时钟源
第三步:配置时基单元,包括内分频器,自动重装器,计数器等
第四步:配置输出中断控制,允许更新中断输出到 NVIC
第五步:配置NVIC 在nvic中打开定时器中断通道并分配一个优先级
void Timer_Init(){
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启TMI2时钟
TIM_InternalClockConfig(TIM2);//开启内部时钟
TIM_ETRColckConfig(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
TIM_TimeBaseInitStructure.TIM_prescaler=7200-1;//分频
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure)
TIM_ITConfig(TIM2,TIM_IT_Updata,ENABLE);//使能中断 ,开启更新中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemtionPriority=2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1
NVIC_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void){
if(TIM_GetITStatus(TIM2,TIM_IT_UPdata)==SET){
NUM++;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}