十、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 }

 

posted @ 2023-05-27 00:50  稚终KINO  阅读(378)  评论(0)    收藏  举报