STM32通用定时器TIM2、3、4

时间:2021-05-22 23:22:36

STM32通用定时器用法

---附源码

1.STM32通用定时器的基本用法,即简单的定时功能。支持向上计数、向下计数、*对其模式,这里仅以向上计数讲解。

2.向上计数原理:从0开始,每经过一个时钟脉冲加1,直到到达通过TIMx_ARR寄存器设置的值时为止,至此产生更新事件(中断或DMA产生)

3.时钟频率计算:上述时钟脉冲的间隔是多少?

STM32通用定时器TIM2、3、4

   首先获得TIMXCLK,然后

STM32通用定时器TIM2、3、4

 然后TIMXCLK再经过PSC预分频器分频,最后才传给CNT计数器进行计数,所以时钟频率为:TIMxCLK/(TIMx_PSC+1)

4.如何选择定时器模式呢?

STM32通用定时器TIM2、3、4

TIMx_CR1的4-6位指定了其模式:CMS:0,DIR:0,向上计数

5.剩下的,我们只要开启中断,装入TIMx_ARR中所需要的值,开启计数器即可。

STM32通用定时器TIM2、3、4

TIMx_DIER寄存器的位0:开启UIE中断,这样计数器上溢时,便会产生中断。

STM32通用定时器TIM2、3、4

TIMx_CR1寄存器位0:计数器开始计数。

6.注意:计时器可能存在时间偏差问题:

STM32通用定时器TIM2、3、4

 可见:即使你更新了TIMx_ARR寄存器的值,但其要等到更新事件发生时,才会被装入到自动加载寄存器中,所以会存在短暂的延时问题,为解决此问题,可以在写入TIMx_ARR时,手工产生更新事件!方法如下:

STM32通用定时器TIM2、3、4

TIMx_EGR的位0:手动产生一个更新事件。

7.修改预分频寄存器时,也会产生6中的问题:

STM32通用定时器TIM2、3、4

解决方法,同6.

 

8.通用定时器2、3、4部分代码:------------------下面为配置文件,可对其进行参数的配置进行移植

//**************************************************************************
//Author:Kill_SeaMan
//Date:2013-09-18 14:41
//Version:0.10
//Function: 通用TIMx接口(采用固件函数库编写)
//**************************************************************************

//注意:该文件仅可以被mytime.c调用,且仅可调用1次

//******************************************************************************
//定时器选择-----------------------------------只可以选择一个定时器,若想选择多个定时器,需修改源码,想用哪个定时器把相应的注释去掉即可
#define TIMER2       //使用定时器2
//#define TIMER3      //使用定时器3
//#define TIMER4       //使用定时器4
//******************************************************************************

#define TIMXCLK    72   //TIMxCLK时钟频率(单位MHz)
#define CFG_TIM_Prescaler (TIMXCLK-1)  //预分频值
#define CFG_COUNTER   1000    //自动重载寄存器值,使得中断间隔为1ms

#if defined(TIMER2)
#define CFG_TIM    TIM2     // 定时器类别
#define CFG_TIM_IRQChannel TIM2_IRQChannel    // 定时器中断
#define CFG_NVIC_IRQChannelPreemptionPriority 1  // 抢占优先级
#define CFG_NVIC_IRQChannelSubPriority    1  // 子优先级
#define CFG_RCC_APB1Periph_TIM   RCC_APB1Periph_TIM2  // 定时器时钟

#elif defined(TIMER3)
#define CFG_TIM    TIM3     // 定时器类别
#define CFG_TIM_IRQChannel TIM3_IRQChannel    // 定时器中断
#define CFG_NVIC_IRQChannelPreemptionPriority 1  // 抢占优先级
#define CFG_NVIC_IRQChannelSubPriority    1  // 子优先级
#define CFG_RCC_APB1Periph_TIM   RCC_APB1Periph_TIM3  // 定时器时钟

#elif defined(TIMER4)
#define CFG_TIM    TIM4     // 定时器类别
#define CFG_TIM_IRQChannel TIM4_IRQChannel    // 定时器中断
#define CFG_NVIC_IRQChannelPreemptionPriority 1  // 抢占优先级
#define CFG_NVIC_IRQChannelSubPriority    1  // 子优先级
#define CFG_RCC_APB1Periph_TIM   RCC_APB1Periph_TIM4  // 定时器时钟

#endif

 

9.完整源代码下载地址:

点击打开链接

 

10.如有错误,欢迎大家指正,不胜感激。。。