Timer of STM32

下面是STM32得定时器程序,分两个文件Timer.c和Timer.h

/**************************************************************************
* 文件名:Timer.h                                                          *
* 编写人:离逝的风                                                          *
* 更新时间:2018.10.6                                                       *
* 说明:此文件属于开源,所有权对任何人开放                                       *
* 如有问题请联系邮箱:[email protected]                                      *
*                                                                         *
* 通用定时器(TIM2,3,4,5)配置步骤如下:                                        *
* 1.使能定时器时钟,在APB1上                                                 *
* 2.设置定时器中断向量优先级和分组                                             *
* 3.配置定时器寄存器(CR1,PSC,DIER,ARR)[注意:ARR需要先置零]                     *
* 4.写中断函数,中断函数一般无返回值和无参数,同时SR寄存器最后一位清零               *
***************************************************************************/

#ifndef   __TIMER_H_
#define   __TIMER_H_

#include  "stm32f10x.h"

/**###############################下面为文件配置部分###########################################**/
//开启功能设置为1,否则为0
#define    TIM2_EN                 1
#define    TIM3_EN                 0
#define    TIM4_EN                 0
#define    TIM5_EN                 0

/*#################################相关宏定义,需用户修改######################################*/
#define    TIM2_TIME_PSC           7200     //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz
#define    TIM2_TIME_ARR           1000     //定义计数值为1000,即定时时间为1000/10000=0.1s


#define    TIM3_TIME_PSC           7200     //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz
#define    TIM3_TIME_ARR           1000     //定义计数值为1000,即定时时间为1000/10000=0.1s


#define    TIM4_TIME_PSC           7200     //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz
#define    TIM4_TIME_ARR           1000     //定义计数值为1000,即定时时间为1000/10000=0.1s


#define    TIM5_TIME_PSC           7200     //定义预分频值为7200,即时钟为72000000/7200=10000即10kHz
#define    TIM5_TIME_ARR           1000     //定义计数值为1000,即定时时间为1000/10000=0.1s


/*################################函数接口。供用户调用########################################*/
/*---------------------TIM2---------------------------*/
#if(TIM2_EN==1)
void TIM2_Init(void);
void TIM2_IRQHandler(void);
#endif
/*---------------------TIM3---------------------------*/
#if(TIM3_EN==1)
void TIM3_Init(void);
void TIM3_IRQHandler(void);
#endif
/*---------------------TIM4---------------------------*/
#if(TIM4_EN==1)
void TIM4_Init(void);
void TIM4_IRQHandler(void);
#endif
/*---------------------TIM5---------------------------*/
#if(TIM5_EN)
void TIM5_Init(void);
void TIM5_IRQHandler(void);
#endif

#endif


//FILE END 
/**************************************************************************
* 文件名:Timer.c                                                           *
* 编写人:离逝的风                                                           *
* 更新时间:2018.10.6                                                       *
* 说明:此文件属于开源,所有权对任何人开放                                        *
* 如有问题请联系邮箱:[email protected]                                        *
*                                                                          *
* 通用定时器(TIM2,3,4,5)配置步骤如下:                                         *
* 1.使能定时器时钟,在APB1上                                                   *
* 2.设置定时器中断向量优先级和分组                                              *
* 3.配置定时器寄存器(CR1,PSC,DIER,ARR)[注意:ARR需要先置零]                     *
* 4.写中断函数,中断函数一般无返回值和无参数,同时SR寄存器最后一位清零                *
***************************************************************************/

#include  "Timer.h"


/*#######################################------TIM2------#################################################*/
#if(TIM2_EN==1)
void TIM2_Init(void)
{

   RCC->APB1ENR|=(1<<0);       //开启TIM2时钟
    
   NVIC_SetPriorityGrouping(2);      //设置中断优先级分组为2
   NVIC_SetPriority(TIM2_IRQn, NVIC_EncodePriority(2,2,3));    //设置中断为:抢占优先级为2,子优先级为1
   NVIC_EnableIRQ(TIM2_IRQn);       //使能TIM2中断
  
   TIM2->PSC|=TIM2_TIME_PSC-1;          //预分频寄存器写入7200
   TIM2->DIER|=(1<<0);                  //开启更新中断状态
   TIM2->ARR&=0X00;                     //清除自动重装寄存器的值
   TIM2->ARR|=TIM2_TIME_ARR-1;          //自动重装寄存器1000-1
   TIM2->CR1|=(1<<7);                   //将ARR寄存器值装入缓冲器中
   TIM2->CR1|=1<<0;                     //使能计时器,开始计数

 } 

 
void TIM2_IRQHandler(void)
{
   /*insert your interrupt program*/

   TIM2->SR&=~(1<<0);     //清除中断标志位
}

#endif
/*#######################################------TIM3------#################################################*/
#if(TIM3_EN==1)
void TIM3_Init(void)
{

   RCC->APB1ENR|=(1<<1);       //开启TIM3时钟
    
   NVIC_SetPriorityGrouping(2);      //设置中断优先级分组为2
   NVIC_SetPriority(TIM3_IRQn, NVIC_EncodePriority(2,2,2));    //设置中断为:抢占优先级为2,子优先级为2
   NVIC_EnableIRQ(TIM3_IRQn);       //使能TIM2中断
  
   TIM3->PSC|=TIM3_TIME_PSC-1;         //预分频寄存器写入7200
   TIM3->DIER|=1<<0;                   //开启更新中断状态
   TIM3->ARR&=0X00;                    //清除自动重装寄存器的值
   TIM3->ARR|=TIM3_TIME_ARR-1;         //自动重装寄存器1000-1
   TIM3->CR1|=(1<<7);                  //将ARR寄存器值装入缓冲器中
   TIM3->CR1|=1<<0;                    //使能计时器,开始计数

 } 

 
void TIM3_IRQHandler(void)
{
   /*insert your interrupt program*/


   TIM3->SR&=(~(0X01));     //清除中断标志位
}

#endif
/*#######################################------TIM4------#################################################*/
#if(PWM4_EN==1)
void TIM4_Init(void)
{

   RCC->APB1ENR|=(1<<2);       //开启TIM4时钟
    
   NVIC_SetPriorityGrouping(2);      //设置中断优先级分组为2
   NVIC_SetPriority(TIM4_IRQn, NVIC_EncodePriority(2,2,3));    //设置中断为:抢占优先级为2,子优先级为3
   NVIC_EnableIRQ(TIM4_IRQn);       //使能TIM2中断
  
   TIM4->PSC|=TIM4_TIME_PSC-1;         //预分频寄存器写入7200
   TIM4->DIER|=1<<0;                   //开启更新中断状态
   TIM4->ARR&=0X00;                    //清除自动重装寄存器的值
   TIM4->ARR|=TIM4_TIME_ARR-1;         //自动重装寄存器1000-1
   TIM4->CR1|=(1<<7);                  //将ARR寄存器值装入缓冲器中
   TIM4->CR1|=1<<0;                    //使能计时器,开始计数

 } 

 
void TIM4_IRQHandler(void)
{
   /*insert your interrupt program*/

   TIM4->SR&=(~(0X01));     //清除中断标志位
}

#endif
/*#######################################------TIM5------#################################################*/
#if(TIM5_EN==1)
void TIM5_Init(void)
{

   RCC->APB1ENR|=(1<<3);       //开启TIM5时钟
    
   NVIC_SetPriorityGrouping(2);      //设置中断优先级分组为2
   NVIC_SetPriority(TIM5_IRQn, NVIC_EncodePriority(2,2,4));    //设置中断为:抢占优先级为2,子优先级为4
   NVIC_EnableIRQ(TIM5_IRQn);       //使能TIM2中断
  
   TIM5->PSC|=TIM5_TIME_PSC-1;         //预分频寄存器写入7200
   TIM5->DIER|=1<<0;                   //开启更新中断状态
   TIM5->ARR&=0X00;                    //清除自动重装寄存器的值
   TIM5->ARR|=TIM5_TIME_ARR-1;         //自动重装寄存器1000-1
   TIM5->CR1|=(1<<7);                  //将ARR寄存器值装入缓冲器中
   TIM5->CR1|=1<<0;                    //使能计时器,开始计数

 } 

 
void TIM5_IRQHandler(void)
{
   /*insert your interrupt program*/

   TIM5->SR&=(~(0X01));     //清除中断标志位
}

#endif


//FILE END

猜你喜欢

转载自www.cnblogs.com/listenscience/p/10124757.html