常用TIM函数
12345678910111213141516171819202122 | 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);//选择内部时钟void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRx其他定时器的时钟void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIX捕获通道的时钟void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式1输入的时钟void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式2输入的时钟void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//配置ETR引脚的预分频器、极性、滤波器参数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);//清除标志位,中断程序使用 |
定时器定时中断
Timer.c
12345678910111213141516171819202122232425262728293031323334353637 | extern uint16_t Num;//声明对应main里的Numvoid Timer_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟,TIM2是APB1总线的外设 TIM_InternalClockConfig(TIM2);//选择为内部时钟,选择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;//结构体成员:PSC预分频器的值,要参考6-1TIM定时中断计算 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//结构体成员:重复计数器的值 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//完成配置时基单元 TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,更新中断 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组,选择分组2 NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//结构体参数:中断通道 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//结构体参数:使能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//结构体参数:抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//结构体参数:响应优先级 NVIC_Init(&NVIC_InitStructure);//完成配置NVIC TIM_Cmd(TIM2,ENABLE);//使能通道} void TIM2_IRQHandler(void)//TIM2的中断函数{ if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查标志位 { Num ++; TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位 }} |
main.c
123456789101112131415161718192021 | uint16_t Num;//定义一个16位的全局变量Numint main(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);//获取TIM2当前计数器的值 } } |
定时器外部时钟
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | extern uint16_t Num;void Timer_Init(void){ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);//通过ETR引脚的外部时钟模式2配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//分频参数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式 TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;//ARR TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM2,ENABLE);} void TIM2_IRQHandler(void){ if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) { Num ++; TIM_ClearITPendingBit(TIM2,TIM_IT_Update); }} uint16_t Timer_GetCounter(void){ return TIM_GetCounter(TIM2);} |
main.c
12345678910111213141516171819 | uint16_t Num;int main(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,Timer_GetCounter(),5);//计数器的值 } } |