专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

STM32定时器的应用

作者:huqin   来源:本站原创   点击数:  更新时间:2014年05月01日   【字体:

 一:STM32F106 一共有11个定时器  2个高级定时器,4个普通定时器,2个基本定时,2个看门狗,和一个滴答定时器

  1:高级定时器 计数方式(向上,向下)、预分频值 1—65532、四通道,输出输入捕获,PWM互补输出
  2:普通定时器 计数方式(向上,向下)、预分频值 1—65532、四通道,输出输入捕获
  3:基本定时器计数方式(向上      )、预分频值 1—65532、
二:定时器配置方法步骤:

  在配置前我们要添加定时器的库函数 stm32f10x_tim.c

  1:配置中断向量表
  2:配置定时器时钟
  3:配置定时器
  4:使能定时器
  5:使能中断

三:事例分析(定时中断3)

  1:配置中断向量表
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;   //定时器中断3中断向量
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}

 2:配置定时器时钟

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

 3:配置定时器(初始化)
 void TIM_Config(void)

 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 //TIM_OCInitTypeDef  TIM_OCInitStructure; 
 TIM_DeInit(TIM3);                              //复位定时器
 TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;  // 时钟预分频数
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 定时器模式 向上计数
 TIM_TimeBaseStructure.TIM_Period = 9999;    // 自动重装载寄存器周期的值( 定时时间 ) 累计 0xFFFF

个频率后产生个更新或者中断 ( 也是说定时时间到 )

 

定时器时间计算:

每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒

// 72000000/7200=10000
// 10000/10000=1s

 

 TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;      // 时间分割值
 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);             // 初始化定时器 
 TIM_ClearFlag(TIM3,TIM_FLAG_Update);                        //清除定时器中断标志 
 TIM_Cmd(TIM3, ENABLE);                                      // 4:使能定时器
 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);                  // 打开中断 溢出中断 5:使能中断

四:在主函数运行时调用这三个函数对定时器进行配置即可。

 

五:定时中断函数的执行

 

  TIME3的定时中断函数的执行在中断向量表中,即  stm32f10x_it.c 文件中。

   因为使用的函数库版本不同有的stm32f10x_it.c中给出了void TIM3_IRQHandler(void) {}函数,只需要我们添加相应的中断服务程序即可,如果stm32f10x_it.c文件中没有这个函数我们就自己创建一个同名函数即可。

如:

 这个例子是判断中断标志位是否溢出来进入中断,如果溢出就执行中断服务子程序,特别要注意的是在中断服务执行前或者执行后一定要清楚中断标志位,以免影响后面中断的进入。

 void TIM3_IRQHandler(void)
    

  if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
   
     TIM_ClearITPendingBit(TIM3, TIM_FLAG_Update);

    GPIO_WriteBit(GPIOE, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOE,               GPIO_Pin_3))); 
 
 
 }
 
 }

关闭窗口

相关文章