十、TIM定时器/计数器
1、时钟介绍(TIM2-TIM5)
时钟:内部时钟AHB 72MHz,通用定时器挂载APB1总线上,时钟36MHz,标准库默认设置。
TIMxCLK:72MHz。
2、定时时间计算
Tout=TIMxCLK/(TIM_Prescaler+1)
TIM_Prescaler:定时器预分频器参数0x0000-0xFFFF
计时时间time=(TIM_Period+1)/Tout
TIM_Period:自动重装载值
例:Tout=72MHz/7200=10KHz
time=10000/10KHz=1s
3、示例代码
3.1 初始化,使能时钟、设置时基参数、开启定时器中断、设置定时器中断参数和使能定时器
1 void Timer_Init(u16 arr) 2 { 3 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能时钟 4 5 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; 6 TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数模式,向上计数 7 TIM_TimeBaseInitStruct.TIM_Period=arr-1;//自动重装载值,计数时间(TIM_Period+1)/Tout=10000*0.1ms=1s 8 TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//TimerxClk=72MHz=APB1Clk*2 Tout=TimerxClk/TIM_Prescaler+1 9 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//初始化timer配置timer参数,配置时基参数 10 11 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启定时器中断 12 TIM_Cmd(TIM2,ENABLE);//使能定时器 13 14 //配置定时器中断NVIC,misc.c文件中封装 15 NVIC_InitTypeDef NVIC_InitStruct; 16 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//主优先级 17 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//子优先级 18 NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn; 19 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; 20 NVIC_Init(&NVIC_InitStruct); 21 }
3.2 设置中断函数,中断函数名在startup_stm32f10x_md.s文件中查找
1 //定时器中断函数 2 void TIM2_IRQHandler(void) 3 { 4 if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//发生中断 5 timer_flag=1; 6 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中断标志 7 } 8 }