zoukankan      html  css  js  c++  java
  • Timer of STM32

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

    /**************************************************************************
    * 文件名:Timer.h                                                          *
    * 编写人:离逝的风                                                          *
    * 更新时间:2018.10.6                                                       *
    * 说明:此文件属于开源,所有权对任何人开放                                       *
    * 如有问题请联系邮箱:1477153217@qq.com                                      *
    *                                                                         *
    * 通用定时器(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                                                       *
    * 说明:此文件属于开源,所有权对任何人开放                                        *
    * 如有问题请联系邮箱:1477153217@qq.com                                        *
    *                                                                          *
    * 通用定时器(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
  • 相关阅读:
    CSS Hack技术介绍及常用的Hack技巧集锦
    全面了解TCP/IP到HTTP
    JavaScript异步流程控制的前世今生
    mstOne
    mst总结
    媒体查询基本方法使用
    点击按钮复制到剪贴板
    监听图片src发生改变时的事件
    高德地图获取经纬度
    jQuery抽奖插件 jQueryRotate
  • 原文地址:https://www.cnblogs.com/listenscience/p/10124757.html
Copyright © 2011-2022 走看看