概述
STM32的TIM守时器分为三类:根本守时器、通用守时器和高档守时器。从分类来看就知道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的值。