访问手机版页面
你的位置:老古开发网 > STM32单片机 > STM32单片机定时器 > 正文  
STM32定时器基本计数原理解析
内容导读:

概述

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

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

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

TIM计数原理描述

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

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

基本TIM框图:

pIYBAFwkjUCAFy2YAABqaAo5PmQ987.jpg

通用TIM框图:

o4YBAFwkjWyAXF3BAAEi55IQn58632.png

上面两图截取“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时钟

o4YBAFwkjWyAD_lAAAB9-U0Nty0644.png

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

重点注意:

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

B.匹配对应时钟。

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

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

2.TIM配置

o4YBAFwkjW2AG2QyAACHGOVoELo087.png

该函数位于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(微妙)延时函数

o4YBAFwkjW6AM_EgAACAct0GXmI019.png

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

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

定时中断(拓展)

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

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

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

1.使能TIM中断

o4YBAFwkjW6ABDA6AACiScmKL1U074.png

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

功能:使能TIM中断。

2.配置NVIC中断控制器

o4YBAFwkjW-AC5aPAAB83ubSKcU289.png

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

功能:配置TIM中断控制。

3.中断函数

o4YBAFwkjXCAScI0AAB29WPDDhs306.png

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

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

标签:stm32定时器,计数器,
来源:工程师周亮 作者:lhl545545 时间:2018/12/27 16:20:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐