打印
[应用相关]

STM32定时器介绍

[复制链接]
674|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
                                    

        概述

        STM32TIM定时器分为三类:基本定时器、通用定时器和高级定时器。从分类来看就知道STM32的定时器功能是非常强大的,但是,功能强大了,软件配置定时器就相对复杂多了。很多初学者甚至工作了一段时间的人都不知道STM32最基本的计数原理。

        虽然STM32定时器功能强大,也分了三类,但他们最基本的计数部分原理都是一样的,也就是我们常常使用的延时(或定时)多少us、ms等。

        接下来我会讲述关于STM32最基本的计数原理,详细讲述如何做到(配置)计数1us的延时,并提供实例代码供大家参考学习。

        TIM计数原理描述

        定时器可以简单的理解为:由计数时钟(系统时钟或外部时钟)一个一个计数,直到计数至我们设定的值,这个时候产生一个事件,告诉我们计数到了。

        上面简单的描述懂了之后就是需要理解它们每一步骤的细节,比如:提供的时钟频率是多少、分频是多少等。

        基本TIM框图:

        通用TIM框图:

        上面两图截取“STM32F4x5、x7参考手册”建议下载手册参看。

        从上面两个TIM框图可以看得出来,通用TIM是包含了基本TIM的功能。也可以说基本定时器是定时器最基本的计数部分,我们该文主要就是围绕这部分来讲述,后续会其他更通用、高级的功能给大家讲述。

        重要的几个参数(信息):

        1.CK_INT时钟:一般由RCC提供(注意:其频率大部分都是系统时钟的一半,在程序中有一个除2的部分,详情请见RCC部分)。

        2.CK_PSC时钟预分频:也就是对CK_INT分频。这个值范围:0 - 65535范围都可以,最好能被CK_INT除尽,这样才方便计算时钟。

        3.ARR重载值:这个值相当于是我们设定需要计数的值,也就是说计数到这个设定值就会产生一个事件。

        综上:CK_INT和CK_PSC确定计数的时钟频率(1秒计多少数),ARR是设定的计数值。最基本的延时(或定时)就由以上三个参数计算而来。

        基本延时源代码分析

        笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为建立的工程,主要以库的方式来讲述。

        考虑大家到以后肯定使用定时器更多功能,笔者提供的软件工程实例是通用定时TIM4。其实,将工程中TIM4改为TIM6(基本定时器)一样可以运行的。

        1.RCC时钟

        该函数位于bsp.c文件下面;

        重点注意:

        A.外设RCC时钟的配置要在其外设初始化的前面;

        B.匹配对应时钟。

        比如:RCC_APB2外设不要配置在RCC_APB1时钟里面

        【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】

        2.TIM配置

        该函数位于timer.c文件下面;

        该函数就是配置定时器基本计数的函数;

        配置为1us的基准:

        A.1秒钟计数42M次个脉冲

        “TIM基本延时”实例工程中:CK_INT = 84M时钟(SystemCoreClock/2)

        “TIM基本延时”实例工程:CK_PSC =84M/42M - 1 = 1 即2分频;

        至于为什么要减1?

        初学者可以理解为“CK_PSC = 0”时不分频(即1分频);“CK_PSC = 1”时为2分频。

        #define TIM4_COUNTER_CLOCK 42000000

        #defineTIM4_PRESCALER_VALUE (SystemCoreClock/2/TIM4_COUNTER_CLOCK - 1)

        B.1秒钟计数1M次个周期

        #define TIM4_PERIOD_TIMING (42 - 1)

        即ARR重载值;

        由上面“A”得出“1秒钟计数42M次个脉冲”,则记满42个脉冲数需要1us(也就是1秒钟计数1M次个周期)。

        3.us(微妙)延时函数

        该函数位于timer.c文件下面;

        上图一个while循环就是1us的时间;上面的一些工作就是配置定时器工作一个周期的时间为1us,这里延时N微妙就应该很好理解了; 其实还有一个函数延时N毫秒,很简单,不描述。

        定时中断(拓展)

        “定时中断”功能是基于前面基础上进行了一个拓展,增加了计数周期就中断的功能。

        笔者单独提供了一个实例:定时1ms中断一次(两工程区别在于时间不是1us,1us中断一次时间太短);

        在软件上主要就是增加开启TIM中断、配置NVIC、添加TIM中断函数;

        1.使能TIM中断

        该函数位于(定时中断工程)timer.c文件下面;

        功能:使能TIM中断。

        2.配置NVIC中断控制器

        该函数位于(定时中断工程)bsp.c文件下面;

        功能:配置TIM中断控制。

        3.中断函数

        该函数位于(定时中断工程)stm32f4xx_it.c文件下面;

        功能:定时周期到进入该中断函数。其中有一个计数减,相当于我们延时工程中while延时N的值。

               
                                

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

681

主题

1534

帖子

7

粉丝