文章目录1.定时器类型2.定时中断框架结构3.初始化配置4.时钟函数5.代码部分6.扩展定时器外部时钟1.定时器类型2.定时中断框架结构3.初始化配置1.RCC开启时钟2.选择内部时钟源TIM_InternalClockConfig()3.配置时基单元——预分频器、自动重装器、计数模式等TIM_TimeBaseInit()4.配置输出中断控制运行更新中断输出到NVICTIM_ITConfig()5.NVIC配置分配优先级NVIC_PriorityGroupConfig()6.运行控制配置完需要使能计数器TIM_Cmd()7.中断函数配置EXTI2_IRQHandler4.时钟函数TIM_DeInit()恢复缺省配置TIM_TimeBaseInit()时基单元初始化配置时基单元TIM_TimeBaseStructInit()结构体变量赋一个默认值TIM_Cmd()使能计数器——运行控制TIM_ITConfig()使能中断输出信号的——中断输出控制TIM_InternalClockConfig()选择内部时钟TIM_ITRxExternalClockConfig()选择ITRx其他定时器时钟TIM_TIxExternalClockConfig()选择捕获通道的时钟TIM_ETRClockMode1Config()选择ETR通过外部时钟模式1输入的时钟TIM_ETRClockMode2Config()单独用来配置ETR引脚的预分频器、极性、滤波器这些参数的单独修改参数的函数以达到不用重新初始化就可以修改的效果TIM_PrescalerConfig()修改预分频值TIM_CounterModeConfig()用来改变计数器的计数方式TIM_ARRPreloadConfig()自动重装器预装功能配置使能或者失能直接作用影子TIM_SetCounter()给计数器写入一个值TIM_SetAutoreload()给自动重装器写一个值TIM_GetCounter()获取当前计数器的值TIM_GetPrescaler()获取当前预分频器的值5.代码部分1.RCC开启时钟2.选择内部时钟源TIM_InternalClockConfig()RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2在APB1总线上TIM_InternalClockConfig(TIM2);3.配置时基单元——预分频器、自动重装器、计数模式等TIM_TimeBaseInit()TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivisionTIM_CKD_DIV1;//分频模式TIM_TimeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up;//计数模式TIM_TimeBaseInitStructure.TIM_Period10000-1;//周期ARR自动重装器的值.定时频率72M/(PSC1)/(ARR1)TIM_TimeBaseInitStructure.TIM_Prescaler7200-1;//预分频器(PSC)的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter0;//重复计算器的值这是高级才用直接给0TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);4.配置输出中断控制运行更新中断输出到NVICTIM_ITConfig()TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//TIM_IT_Update更新中断5.NVIC配置分配优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelTIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority2;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStructure);6.运行控制配置完需要使能计数器TIM_Cmd()TIM_Cmd(TIM2,ENABLE);7.中断函数配置EXTI2_IRQHandlervoidTIM2_IRQHandler(void){if(TIM_GetITStatus(TIM2,TIM_IT_Update)SET){Num;//extern uint16_t Num;//声明有这个变量让编译器自己找.放在模块内不用放在main.cTIM_ClearITPendingBit(TIM2,TIM_IT_Update);}}主函数部分#includestm32f10x.h// Device header#includeDelay.h#includeOLED.h#includeTimer.huint16_tNum;intmain(void){OLED_Init();Timer_Init();OLED_ShowString(1,1,Num:);while(1){OLED_ShowNum(1,5,Num,5);OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);}}6.扩展定时器外部时钟这里不用内部时钟函数用TIM_ETRClockMode2Config()函数并且要加上GPIO引脚初始化。就是把刚开始的TIM_InternalClockConfig()函数替换egRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStructure.GPIO_PinGPIO_Pin_0;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStructure);TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);//外部时钟模式1使用外部输入脚作为计数器时钟的时钟源模式2使用外部触发输入或内部触发输入作为计数器时钟源//TIM_ExtTRGPSC_OFF.第二个参数选择不分频//TIM_ExtTRGPolarity_NonInverted.第三个参数极性。反向低电平or下降沿有效。不反向反之//0x0F第四个参数滤波器。这个会稳定一点//引脚要用到GPIO所以上面要配置GPIO主函数部分#includestm32f10x.h// Device header#includeDelay.h#includeOLED.h#includeTimer.huint16_tNum;intmain(void){OLED_Init();Timer_Init();OLED_ShowString(1,1,Num:);OLED_ShowString(2,1,CNT:);while(1){OLED_ShowNum(1,5,Num,5);OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);}}这样就可以通过对射式红外进行遮挡拿开操作进行计数。