STM32通用定时器用法
---附源码
1.STM32通用定时器的基本用法,即简单的定时功能。支持向上计数、向下计数、*对其模式,这里仅以向上计数讲解。
2.向上计数原理:从0开始,每经过一个时钟脉冲加1,直到到达通过TIMx_ARR寄存器设置的值时为止,至此产生更新事件(中断或DMA产生)
3.时钟频率计算:上述时钟脉冲的间隔是多少?
首先获得TIMXCLK,然后
然后TIMXCLK再经过PSC预分频器分频,最后才传给CNT计数器进行计数,所以时钟频率为:TIMxCLK/(TIMx_PSC+1)
4.如何选择定时器模式呢?
TIMx_CR1的4-6位指定了其模式:CMS:0,DIR:0,向上计数
5.剩下的,我们只要开启中断,装入TIMx_ARR中所需要的值,开启计数器即可。
TIMx_DIER寄存器的位0:开启UIE中断,这样计数器上溢时,便会产生中断。
TIMx_CR1寄存器位0:计数器开始计数。
6.注意:计时器可能存在时间偏差问题:
可见:即使你更新了TIMx_ARR寄存器的值,但其要等到更新事件发生时,才会被装入到自动加载寄存器中,所以会存在短暂的延时问题,为解决此问题,可以在写入TIMx_ARR时,手工产生更新事件!方法如下:
TIMx_EGR的位0:手动产生一个更新事件。
7.修改预分频寄存器时,也会产生6中的问题:
解决方法,同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.如有错误,欢迎大家指正,不胜感激。。。